From e3a57e6d6387839e28d8c70c8c81c6ebdb15eca5 Mon Sep 17 00:00:00 2001 From: Pascal Gautron Date: Mon, 7 Jun 2021 15:10:04 +0200 Subject: [PATCH] Add advanced compilation chapter --- CMakeLists.txt | 2 +- README.md | 3 +- .../CMakeLists.txt | 78 ++ ray_tracing_advanced_compilation/README.md | 248 ++++ .../hello_vulkan.cpp | 1051 +++++++++++++++++ .../hello_vulkan.h | 159 +++ .../images/advanced_compilation.png | Bin 0 -> 222748 bytes .../images/deferred_host_operations.png | Bin 0 -> 14755 bytes .../high_level_advanced_compilation.png | Bin 0 -> 29221 bytes .../images/high_level_regular_compilation.png | Bin 0 -> 33946 bytes .../images/library.png | Bin 0 -> 37975 bytes .../images/regular_pipeline.png | Bin 0 -> 28463 bytes .../images/single_threaded_compilation.png | Bin 0 -> 6779 bytes ray_tracing_advanced_compilation/main.cpp | 308 +++++ .../shaders/frag_shader.frag | 98 ++ .../shaders/passthrough.vert | 34 + .../shaders/post.frag | 37 + .../shaders/raycommon.glsl | 23 + .../shaders/raytrace.rchit | 169 +++ .../shaders/raytrace.rgen | 77 ++ .../shaders/raytrace.rmiss | 35 + .../shaders/raytraceShadow.rmiss | 28 + .../shaders/vert_shader.vert | 80 ++ .../shaders/wavefront.glsl | 77 ++ 24 files changed, 2505 insertions(+), 2 deletions(-) create mode 100644 ray_tracing_advanced_compilation/CMakeLists.txt create mode 100644 ray_tracing_advanced_compilation/README.md create mode 100644 ray_tracing_advanced_compilation/hello_vulkan.cpp create mode 100644 ray_tracing_advanced_compilation/hello_vulkan.h create mode 100644 ray_tracing_advanced_compilation/images/advanced_compilation.png create mode 100644 ray_tracing_advanced_compilation/images/deferred_host_operations.png create mode 100644 ray_tracing_advanced_compilation/images/high_level_advanced_compilation.png create mode 100644 ray_tracing_advanced_compilation/images/high_level_regular_compilation.png create mode 100644 ray_tracing_advanced_compilation/images/library.png create mode 100644 ray_tracing_advanced_compilation/images/regular_pipeline.png create mode 100644 ray_tracing_advanced_compilation/images/single_threaded_compilation.png create mode 100644 ray_tracing_advanced_compilation/main.cpp create mode 100644 ray_tracing_advanced_compilation/shaders/frag_shader.frag create mode 100644 ray_tracing_advanced_compilation/shaders/passthrough.vert create mode 100644 ray_tracing_advanced_compilation/shaders/post.frag create mode 100644 ray_tracing_advanced_compilation/shaders/raycommon.glsl create mode 100644 ray_tracing_advanced_compilation/shaders/raytrace.rchit create mode 100644 ray_tracing_advanced_compilation/shaders/raytrace.rgen create mode 100644 ray_tracing_advanced_compilation/shaders/raytrace.rmiss create mode 100644 ray_tracing_advanced_compilation/shaders/raytraceShadow.rmiss create mode 100644 ray_tracing_advanced_compilation/shaders/vert_shader.vert create mode 100644 ray_tracing_advanced_compilation/shaders/wavefront.glsl diff --git a/CMakeLists.txt b/CMakeLists.txt index e1c0494..1605665 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,7 @@ add_subdirectory(ray_tracing_reflections) add_subdirectory(ray_tracing_ao) add_subdirectory(ray_tracing_indirect_scissor) add_subdirectory(ray_tracing_specialization) - +add_subdirectory(ray_tracing_advanced_compilation) #-------------------------------------------------------------------------------------------------- diff --git a/README.md b/README.md index 25a20f2..c4c1239 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,5 @@ Tutorial | Details ![img](ray_tracing__advance/images/ray_tracing__advance.png) | [Advance](ray_tracing__advance)
An example combining most of the above samples in a single application. ![img](docs/Images/indirect_scissor/intro.png) | [Trace Rays Indirect](ray_tracing_indirect_scissor)
Teaches the use of `vkCmdTraceRaysIndirectKHR`, which sources width/height/depth from a buffer. As a use case, we add lanterns to the scene and use a compute shader to calculate scissor rectangles for each of them. ![img](ray_tracing_ao/images/ray_tracing_ao.png) | [AO Raytracing](ray_tracing_ao)
This extension to the tutorial is showing how G-Buffers from the fragment shader, can be used in a compute shader to cast ambient occlusion rays using ray queries ([GLSL_EXT_ray_query](https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_ray_query.txt)). -![img](ray_tracing_specialization/images/specialization.png) | [Specialization Constants](ray_tracing_specialization)
Showing how to use specialization constant and using interactively different specialization. \ No newline at end of file +![img](ray_tracing_specialization/images/specialization.png) | [Specialization Constants](ray_tracing_specialization)
Showing how to use specialization constant and using interactively different specialization. +![img](ray_tracing_advanced_compilation/images/high_level_advanced_compilation.png) | [Advanced Compilation](ray_tracing_advanced_compilation)
Shows how to create reusable pipeline libraries and compile pipelines on multiple threads. \ No newline at end of file diff --git a/ray_tracing_advanced_compilation/CMakeLists.txt b/ray_tracing_advanced_compilation/CMakeLists.txt new file mode 100644 index 0000000..8587db8 --- /dev/null +++ b/ray_tracing_advanced_compilation/CMakeLists.txt @@ -0,0 +1,78 @@ +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** + +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting +get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) +set(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") + + +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +_add_project_definitions(${PROJNAME}) + + +#-------------------------------------------------------------------------------------------------- +# Source files for this project +# +file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) +list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) +include_directories(${TUTO_KHR_DIR}/common) + + +#-------------------------------------------------------------------------------------------------- +# GLSL to SPIR-V custom build +compile_glsl_directory( + SRC "${CMAKE_CURRENT_SOURCE_DIR}/shaders" + DST "${CMAKE_CURRENT_SOURCE_DIR}/spv" + VULKAN_TARGET "vulkan1.2" + ) + + +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES} ${GLSL_HEADERS}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio +# +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES} ${GLSL_HEADERS}) + + +#-------------------------------------------------------------------------------------------------- +# Linkage +# +target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} nvpro_core) + +foreach(DEBUGLIB ${LIBRARIES_DEBUG}) + target_link_libraries(${PROJNAME} debug ${DEBUGLIB}) +endforeach(DEBUGLIB) + +foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) + target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) +endforeach(RELEASELIB) + +#-------------------------------------------------------------------------------------------------- +# copies binaries that need to be put next to the exe files (ZLib, etc.) +# +_finalize_target( ${PROJNAME} ) + + +install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/spv") +install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/spv") diff --git a/ray_tracing_advanced_compilation/README.md b/ray_tracing_advanced_compilation/README.md new file mode 100644 index 0000000..3ae5b1d --- /dev/null +++ b/ray_tracing_advanced_compilation/README.md @@ -0,0 +1,248 @@ +# Advanced Compilation + +![](images/advanced_compilation.png) + +The simplest way of defining ray tracing pipelines is by using monolithic `VkRayTracingPipelineCreateInfoKHR` structures specifying the pipeline stages and shader groups. Even if pipelines share some stages, they are compiled separately. Furthermore, by default `vkCreateRayTracingPipelinesKHR` blocks the current thread until completion: +![](images/high_level_regular_compilation.png) + + However, when using multiple pipelines, some of them may have some shader stages in common. Large pipelines may also take a long time to compile on a single thread. + +This sample introduces the [VK_KHR_pipeline_library](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_pipeline_library.html) extension to create shader libraries that can be separately compiled and reused in ray tracing pipelines. The compilation of the final pipeline is carried out on multiple threads using the [VK_KHR_deferred_host_operations](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_deferred_host_operations.html) extension. + +The code below is based on the [`ray_tracing_specialization`](../ray_tracing_specialization) sample, which introduces compile-time variations of a hit shader. + + +## Pipeline Library + + +Using monolithic pipeline definitions all stages are compiled for each pipeline, regardless of potential reuse. The shader groups are then referenced in the Shader Binding Table using their indices: +![](images/regular_pipeline.png) + +Pipeline libraries are `VkPipeline` objects that cannot be bound directly. Instead, they can be compiled once and linked into as many pipelines as necessary. The Shader Binding Table of the resulting pipeline references the shader groups of the library as if they had been appended to the groups and stages in the main `VkRayTracingPipelineCreateInfo` +![](images/library.png) + + We start by adding a new member in the `HelloVulkan` class: +~~~~ C + // Ray tracing shader library + VkPipeline m_rtShaderLibrary; +~~~~ + +In `HelloVulkan::createRtPipeline()` the `StageIndices` enumeration describes the indices of the stages defined in the pipeline creation structure. The hit groups will be moved to our library, hence we remove them from the enumeration: +~~~~ C + enum StageIndices + { + eRaygen, + eMiss, + eMiss2, + eShaderGroupCount + }; +~~~~ + +The shader modules will be referenced partly in the main pipeline, and partly in the pipeline library. To ensure proper deletion of the modules after use, we will store their handles in +~~~~ C + // Store the created modules for later cleanup + std::vector modules; +~~~~ +Then, after each call to `nvvk::createShaderModule` we store the resulting module: +~~~~ C + modules.push_back(stage.module); +~~~~ + +The specialization constants sample creates one shader module per specialization. Instead, we load that module once and reuse it for each specialization. Those specializations are then stored in the stages of the pipeline library: +~~~~ C + // Hit Group - Closest Hit + // Create many variation of the closest hit + stage.module = nvvk::createShaderModule( + m_device, nvh::loadFile("spv/raytrace.rchit.spv", true, defaultSearchPaths, true)); + + modules.push_back(stage.module); + // Store the hit groups for compilation in a separate pipeline library object + std::vector libraryStages{}; + for(uint32_t s = 0; s < (uint32_t)specializations.size(); s++) + { + stage.stage = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; + stage.pSpecializationInfo = specializations[s].getSpecialization(); + libraryStages.push_back(stage); + } +~~~~ + +Similarly, the hit groups will be stored in the library by replacing the storage of the hit groups in `m_rtShaderGroups` by: +~~~~ C + // Shader groups for the pipeline library containing the closest hit shaders + std::vector libraryShaderGroups; + + VkRayTracingShaderGroupCreateInfoKHR libraryGroup{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; + libraryGroup.anyHitShader = VK_SHADER_UNUSED_KHR; + libraryGroup.closestHitShader = VK_SHADER_UNUSED_KHR; + libraryGroup.generalShader = VK_SHADER_UNUSED_KHR; + libraryGroup.intersectionShader = VK_SHADER_UNUSED_KHR; + libraryGroup.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR; + + // Hit Group - Closest Hit + AnyHit + // Creating many Hit groups, one for each specialization + for(uint32_t s = 0; s < (uint32_t)specializations.size(); s++) + { + // The indices of the stages are local to the pipeline library + libraryGroup.closestHitShader = s; // Using variation of the closest hit + libraryShaderGroups.push_back(libraryGroup); + } +~~~~ +It is important to note that the stage indices are local to the pipeline library, regardless of where they will be used in the final pipeline. Those indices will be later offset depending on the contents of the pipeline. + +Once the groups and stages are defined we can create the pipeline library. After the creation of the ray tracing pipeline layout, we define the base of the library creation information: +~~~~ C + // Creation of the pipeline library object + VkRayTracingPipelineCreateInfoKHR pipelineLibraryInfo{VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR}; + // Flag the object as a pipeline library, which is a specific object that cannot be used directly. + pipelineLibraryInfo.flags = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR; + // Use the same layout as the target pipeline + pipelineLibraryInfo.layout = m_rtPipelineLayout; + // As for the interface the maximum recursion depth must also be consistent across the pipeline + pipelineLibraryInfo.maxPipelineRayRecursionDepth = 2; +~~~~ +Pipeline libraries are technically independent from the pipeline they will be linked into. However, linking can only be achieved by enforcing strong consistency constraints, such as having the same pipeline layout and maximum recursion depth. If the recursion depth differs the compilation of the final pipeline will fail. + +In addition, the pipeline libraries need to have the same pipeline interface. This interface defines the maximum amount of data passed across stages: +~~~~ C + // Pipeline libraries need to define an interface, defined by the maximum hit attribute size (typically 2 for + // the built-in triangle intersector) and the maximum payload size (3 floating-point values in this sample). + // Pipeline libraries can be linked into a final pipeline only if their interface matches + VkRayTracingPipelineInterfaceCreateInfoKHR pipelineInterface{VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR}; + pipelineInterface.maxPipelineRayHitAttributeSize = sizeof(nvmath::vec2f); + pipelineInterface.maxPipelineRayPayloadSize = sizeof(nvmath::vec3f); + pipelineLibraryInfo.pLibraryInterface = &pipelineInterface; +~~~~ + +Finally we provide the stage and shader groups information to the library creation information, and create the pipeline library in the same way as any other pipeline: +~~~~ C + // Shader groups and stages for the library + pipelineLibraryInfo.groupCount = static_cast(libraryShaderGroups.size()); + pipelineLibraryInfo.pGroups = libraryShaderGroups.data(); + pipelineLibraryInfo.stageCount = static_cast(libraryStages.size()); + pipelineLibraryInfo.pStages = libraryStages.data(); + + // Creation of the pipeline library + vkCreateRayTracingPipelinesKHR(m_device, {}, {}, 1, &pipelineLibraryInfo, nullptr, &m_rtShaderLibrary); +~~~~ +The pipeline library is now created, but the application cannot run yet: we still need to indicate that the final pipeline will link with our library. Before calling `vkCreateRayTracingPipelinesKHR` for the final pipeline, we insert the reference to the library: +~~~~ C + // The library will be linked into the final pipeline by specifying its handle and shared interface + VkPipelineLibraryCreateInfoKHR inputLibrary{VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR}; + inputLibrary.libraryCount = 1; + inputLibrary.pLibraries = &m_rtShaderLibrary; + rayPipelineInfo.pLibraryInfo = &inputLibrary; + rayPipelineInfo.pLibraryInterface = &pipelineInterface; +~~~~ + +The pipeline is now built from the specified shader groups and stages as well as the library containing the hit groups. The groups and stages are linked together using indices, and indices are local to each library. To avoid collisions the pipeline creation will consider the stages of the libraries as if they had been appended to the stage list of the original `VkRayTracingPipelineCreateInfoKHR`, in the order in which the libraries are defined in `pLibraries`. + +Therefore, the Shader Binding Table needs to be updated accordingly, by making the wrapper aware of the contents of the library: +~~~~ C + // The Shader Binding Table is built accounting for the entire pipeline, including the + // stages contained in the library. Passing the library information allows the wrapper + // to shift the shader group indices accordingly + m_sbtWrapper.create(m_rtPipeline, rayPipelineInfo, {pipelineLibraryInfo}); +~~~~ + +At the end of the function we destroy the shader modules using our vector of modules instead of iterating over the stages of the main pipeline: +~~~~ C + // Destroy all the created modules, for both libraries and main pipeline + for(auto& m : modules) + vkDestroyShaderModule(m_device, m, nullptr); +~~~~ + +The pipeline library has the same lifetime as the pipeline that uses it. The final step of this Section is the destruction of the library in the `HelloVulkan::destroy()` method: +~~~~ C + // Pipeline libraries have the same lifetime as the pipelines that uses them + vkDestroyPipeline(m_device, m_rtShaderLibrary, nullptr); +~~~~ + +As an exercise, it is possible to create another library containing the other shader stages, and link those libraries together into the pipeline. + +## Parallel Compilation Using Deferred Host Operations + +By default pipelines compilations are blocking the calling thread until completion: + ![Pipeline compilation on a single thread](images/single_threaded_compilation.png) + +Ray tracing pipelines are often complex, and can benefit from multithreaded compilation. This can drastically reduce the compilation times of complex pipelines. The deferred host operations extension allows the work involved in `vkCreateRayTracingPipelinesKHR` to be split into multiple threads provided by the application: + ![Deferred Host Operations use app-provided threads to parallelize the compilation](images/deferred_host_operations.png) + +We start by including the support of C++ threading using `std::async` at the beginning of the source file: +~~~~ C +#include +~~~~ + +In this sample we will distribute the compilation of the final ray tracing pipeline using a `VkDeferredOperation`, created just before calling `vkCreateRayTracingPipelinesKHR`: +~~~~ C + // Deferred operations allow the driver to parallelize the pipeline compilation on several threads + // Create a deferred operation + VkDeferredOperationKHR deferredOperation; + VkResult result = vkCreateDeferredOperationKHR(m_device, nullptr, &deferredOperation); + assert(result == VK_SUCCESS); +~~~~ + +Then we modify the pipeline creation to indicate we defer the operation: +~~~~ C + // The pipeline creation is called with the deferred operation. Instead of blocking until + // the compilation is done, the call returns immediately + vkCreateRayTracingPipelinesKHR(m_device, deferredOperation, {}, 1, &rayPipelineInfo, nullptr, &m_rtPipeline); +~~~~ +Instead of immediately launching the compilation and blocking execution until completion, this call will return immediately with value `VK_OPERATION_DEFERRED_KHR` if deferred operations are supported by the system. + +Threading control is left to the application. Therefore, our application will allocate a number of threads for compilation: +~~~~ C + // The compilation will be split into a maximum of 8 threads, or the maximum supported by the + // driver for that operation + uint32_t maxThreads{8}; + uint32_t threadCount = std::min(vkGetDeferredOperationMaxConcurrencyKHR(m_device, deferredOperation), maxThreads); +~~~~ + +We then launch those threads using `std::async`: +~~~~ C + std::vector> joins; + for(uint32_t i = 0; i < threadCount; i++) + { + VkDevice device{m_device}; + joins.emplace_back(std::async(std::launch::async, [device, deferredOperation]() { + // Wait until the thread has finished its work + VkResult result = vkDeferredOperationJoinKHR(device, deferredOperation); + // A return value of SUCCESS means the pipeline compilation is done. + // THREAD_DONE indicates that thread has no work to do for this task + // (e.g. the operation could not be split into that many threads) + // THREAD_IDLE indicates the thread has finished its task, but the overall pipeline + // compilation is not finished. + // In the last two cases, more work could be performed by the thread, such as waiting + // for another deferred operation + assert(result == VK_SUCCESS || result == VK_THREAD_DONE_KHR || result == VK_THREAD_IDLE_KHR); + })); + } +~~~~ +Each thread executes a blocking function taking care of a subset of the compilation. When a thread has finished its task, the pipeline compilation may be complete (`VK_SUCCESS`) or there may be no more work for this thread. In this case one could consider executing more work using those threads, such as compiling another pipeline. + +Since there is only one pipeline to compile, we wait for all threads to finish and check whether the pipeline compilation succeeded: +~~~~ C + // Wait for all threads to finish + for(auto& f : joins) + { + f.get(); + } + // Once the deferred operation is complete, check for compilation success + result = vkGetDeferredOperationResultKHR(m_device, deferredOperation); + assert(result == VK_SUCCESS); +~~~~ + +Once the compilation is finished we can destroy the deferred operation: +~~~~ C + // Destroy the deferred operation + vkDestroyDeferredOperationKHR(m_device, deferredOperation, nullptr); +~~~~ + +Congratulations! The ray tracing pipeline is now built using explicit stages and a pipeline library, and the final compilation is executed on multiple threads. As an exercise, the pipeline library described at the beginning of this tutorial can also be compiled in parallel. +This approach can be extended to compile multiple pipelines sharing some components using multiple threads: +![](images/high_level_advanced_compilation.png) + +## References + + * [VK_KHR_pipeline_library](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_pipeline_library.html) + * [VK_KHR_deferred_host_operations](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_deferred_host_operations.html) + diff --git a/ray_tracing_advanced_compilation/hello_vulkan.cpp b/ray_tracing_advanced_compilation/hello_vulkan.cpp new file mode 100644 index 0000000..2e6f12b --- /dev/null +++ b/ray_tracing_advanced_compilation/hello_vulkan.cpp @@ -0,0 +1,1051 @@ +/* + * Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + + +#include +#include + + +#define STB_IMAGE_IMPLEMENTATION +#include "obj_loader.h" +#include "stb_image.h" + +#include "hello_vulkan.h" +#include "nvh/alignment.hpp" +#include "nvh/cameramanipulator.hpp" +#include "nvh/fileoperations.hpp" +#include "nvvk/commands_vk.hpp" +#include "nvvk/descriptorsets_vk.hpp" +#include "nvvk/images_vk.hpp" +#include "nvvk/pipeline_vk.hpp" +#include "nvvk/renderpasses_vk.hpp" +#include "nvvk/shaders_vk.hpp" +// Support for C++ multithreading +#include + +extern std::vector defaultSearchPaths; + + +// Holding the camera matrices +struct CameraMatrices +{ + nvmath::mat4f view; + nvmath::mat4f proj; + nvmath::mat4f viewInverse; + // #VKRay + nvmath::mat4f projInverse; +}; + + +//-------------------------------------------------------------------------------------------------- +// Keep the handle on the device +// Initialize the tool to do all our allocations: buffers, images +// +void HelloVulkan::setup(const VkInstance& instance, const VkDevice& device, const VkPhysicalDevice& physicalDevice, uint32_t queueFamily) +{ + AppBaseVk::setup(instance, device, physicalDevice, queueFamily); + m_alloc.init(instance, device, physicalDevice); + m_debug.setup(m_device); + m_offscreenDepthFormat = nvvk::findDepthFormat(physicalDevice); +} + +//-------------------------------------------------------------------------------------------------- +// Called at each frame to update the camera matrix +// +void HelloVulkan::updateUniformBuffer(const VkCommandBuffer& cmdBuf) +{ + // Prepare new UBO contents on host. + const float aspectRatio = m_size.width / static_cast(m_size.height); + CameraMatrices hostUBO = {}; + hostUBO.view = CameraManip.getMatrix(); + hostUBO.proj = nvmath::perspectiveVK(CameraManip.getFov(), aspectRatio, 0.1f, 1000.0f); + // hostUBO.proj[1][1] *= -1; // Inverting Y for Vulkan (not needed with perspectiveVK). + hostUBO.viewInverse = nvmath::invert(hostUBO.view); + // #VKRay + hostUBO.projInverse = nvmath::invert(hostUBO.proj); + + // UBO on the device, and what stages access it. + VkBuffer deviceUBO = m_cameraMat.buffer; + auto uboUsageStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR; + + // Ensure that the modified UBO is not visible to previous frames. + VkBufferMemoryBarrier beforeBarrier{VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER}; + beforeBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; + beforeBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + beforeBarrier.buffer = deviceUBO; + beforeBarrier.offset = 0; + beforeBarrier.size = sizeof(hostUBO); + vkCmdPipelineBarrier(cmdBuf, uboUsageStages, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_DEPENDENCY_DEVICE_GROUP_BIT, 0, + nullptr, 1, &beforeBarrier, 0, nullptr); + + + // Schedule the host-to-device upload. (hostUBO is copied into the cmd + // buffer so it is okay to deallocate when the function returns). + vkCmdUpdateBuffer(cmdBuf, m_cameraMat.buffer, 0, sizeof(CameraMatrices), &hostUBO); + + // Making sure the updated UBO will be visible. + VkBufferMemoryBarrier afterBarrier{VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER}; + afterBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + afterBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + afterBarrier.buffer = deviceUBO; + afterBarrier.offset = 0; + afterBarrier.size = sizeof(hostUBO); + vkCmdPipelineBarrier(cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, uboUsageStages, VK_DEPENDENCY_DEVICE_GROUP_BIT, 0, + nullptr, 1, &afterBarrier, 0, nullptr); +} + +//-------------------------------------------------------------------------------------------------- +// Describing the layout pushed when rendering +// +void HelloVulkan::createDescriptorSetLayout() +{ + auto nbTxt = static_cast(m_textures.size()); + auto nbObj = static_cast(m_objModel.size()); + + // Camera matrices (binding = 0) + m_descSetLayoutBind.addBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_RAYGEN_BIT_KHR); + // Materials (binding = 1) + m_descSetLayoutBind.addBinding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nbObj, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); + // Scene description (binding = 2) + m_descSetLayoutBind.addBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); + // Textures (binding = 3) + m_descSetLayoutBind.addBinding(3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, nbTxt, + VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); + // Materials (binding = 4) + m_descSetLayoutBind.addBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nbObj, + VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); + // Storing vertices (binding = 5) + m_descSetLayoutBind.addBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nbObj, VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); + // Storing indices (binding = 6) + m_descSetLayoutBind.addBinding(6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nbObj, VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); + + + m_descSetLayout = m_descSetLayoutBind.createLayout(m_device); + m_descPool = m_descSetLayoutBind.createPool(m_device, 1); + m_descSet = nvvk::allocateDescriptorSet(m_device, m_descPool, m_descSetLayout); +} + +//-------------------------------------------------------------------------------------------------- +// Setting up the buffers in the descriptor set +// +void HelloVulkan::updateDescriptorSet() +{ + std::vector writes; + + // Camera matrices and scene description + VkDescriptorBufferInfo dbiUnif{m_cameraMat.buffer, 0, VK_WHOLE_SIZE}; + writes.emplace_back(m_descSetLayoutBind.makeWrite(m_descSet, 0, &dbiUnif)); + VkDescriptorBufferInfo dbiSceneDesc{m_sceneDesc.buffer, 0, VK_WHOLE_SIZE}; + writes.emplace_back(m_descSetLayoutBind.makeWrite(m_descSet, 2, &dbiSceneDesc)); + + // All material buffers, 1 buffer per OBJ + std::vector dbiMat; + std::vector dbiMatIdx; + std::vector dbiVert; + std::vector dbiIdx; + for(auto& m : m_objModel) + { + dbiMat.push_back({m.matColorBuffer.buffer, 0, VK_WHOLE_SIZE}); + dbiMatIdx.push_back({m.matIndexBuffer.buffer, 0, VK_WHOLE_SIZE}); + dbiVert.push_back({m.vertexBuffer.buffer, 0, VK_WHOLE_SIZE}); + dbiIdx.push_back({m.indexBuffer.buffer, 0, VK_WHOLE_SIZE}); + } + writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 1, dbiMat.data())); + writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 4, dbiMatIdx.data())); + writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 5, dbiVert.data())); + writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 6, dbiIdx.data())); + + // All texture samplers + std::vector diit; + for(auto& texture : m_textures) + { + diit.emplace_back(texture.descriptor); + } + writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); + + // Writing the information + vkUpdateDescriptorSets(m_device, static_cast(writes.size()), writes.data(), 0, nullptr); +} + + +//-------------------------------------------------------------------------------------------------- +// Creating the pipeline layout +// +void HelloVulkan::createGraphicsPipeline() +{ + VkPushConstantRange pushConstantRanges = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ObjPushConstant)}; + + // Creating the Pipeline Layout + VkPipelineLayoutCreateInfo createInfo{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + createInfo.setLayoutCount = 1; + createInfo.pSetLayouts = &m_descSetLayout; + createInfo.pushConstantRangeCount = 1; + createInfo.pPushConstantRanges = &pushConstantRanges; + vkCreatePipelineLayout(m_device, &createInfo, nullptr, &m_pipelineLayout); + + + // Creating the Pipeline + std::vector paths = defaultSearchPaths; + nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); + gpb.depthStencilState.depthTestEnable = true; + gpb.addShader(nvh::loadFile("spv/vert_shader.vert.spv", true, paths, true), VK_SHADER_STAGE_VERTEX_BIT); + gpb.addShader(nvh::loadFile("spv/frag_shader.frag.spv", true, paths, true), VK_SHADER_STAGE_FRAGMENT_BIT); + gpb.addBindingDescription({0, sizeof(VertexObj)}); + gpb.addAttributeDescriptions({ + {0, 0, VK_FORMAT_R32G32B32_SFLOAT, static_cast(offsetof(VertexObj, pos))}, + {1, 0, VK_FORMAT_R32G32B32_SFLOAT, static_cast(offsetof(VertexObj, nrm))}, + {2, 0, VK_FORMAT_R32G32B32_SFLOAT, static_cast(offsetof(VertexObj, color))}, + {3, 0, VK_FORMAT_R32G32_SFLOAT, static_cast(offsetof(VertexObj, texCoord))}, + }); + + m_graphicsPipeline = gpb.createPipeline(); + m_debug.setObjectName(m_graphicsPipeline, "Graphics"); +} + +//-------------------------------------------------------------------------------------------------- +// Loading the OBJ file and setting up all buffers +// +void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform) +{ + LOGI("Loading File: %s \n", filename.c_str()); + ObjLoader loader; + loader.loadModel(filename); + + // Converting from Srgb to linear + for(auto& m : loader.m_materials) + { + m.ambient = nvmath::pow(m.ambient, 2.2f); + m.diffuse = nvmath::pow(m.diffuse, 2.2f); + m.specular = nvmath::pow(m.specular, 2.2f); + } + + ObjInstance instance; + instance.objIndex = static_cast(m_objModel.size()); + instance.transform = transform; + instance.transformIT = nvmath::transpose(nvmath::invert(transform)); + instance.txtOffset = static_cast(m_textures.size()); + + ObjModel model; + model.nbIndices = static_cast(loader.m_indices.size()); + model.nbVertices = static_cast(loader.m_vertices.size()); + + // Create the buffers on Device and copy vertices, indices and materials + nvvk::CommandPool cmdBufGet(m_device, m_graphicsQueueIndex); + VkCommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); + VkBufferUsageFlags rtUsage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT + | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR; + model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | rtUsage); + model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, VK_BUFFER_USAGE_INDEX_BUFFER_BIT | rtUsage); + model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); + model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); + // Creates all textures found + createTextureImages(cmdBuf, loader.m_textures); + cmdBufGet.submitAndWait(cmdBuf); + m_alloc.finalizeAndReleaseStaging(); + + std::string objNb = std::to_string(instance.objIndex); + m_debug.setObjectName(model.vertexBuffer.buffer, (std::string("vertex_" + objNb).c_str())); + m_debug.setObjectName(model.indexBuffer.buffer, (std::string("index_" + objNb).c_str())); + m_debug.setObjectName(model.matColorBuffer.buffer, (std::string("mat_" + objNb).c_str())); + m_debug.setObjectName(model.matIndexBuffer.buffer, (std::string("matIdx_" + objNb).c_str())); + + m_objModel.emplace_back(model); + m_objInstance.emplace_back(instance); +} + + +//-------------------------------------------------------------------------------------------------- +// Creating the uniform buffer holding the camera matrices +// - Buffer is host visible +// +void HelloVulkan::createUniformBuffer() +{ + m_cameraMat = m_alloc.createBuffer(sizeof(CameraMatrices), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + m_debug.setObjectName(m_cameraMat.buffer, "cameraMat"); +} + +//-------------------------------------------------------------------------------------------------- +// Create a storage buffer containing the description of the scene elements +// - Which geometry is used by which instance +// - Transformation +// - Offset for texture +// +void HelloVulkan::createSceneDescriptionBuffer() +{ + nvvk::CommandPool cmdGen(m_device, m_graphicsQueueIndex); + + auto cmdBuf = cmdGen.createCommandBuffer(); + m_sceneDesc = m_alloc.createBuffer(cmdBuf, m_objInstance, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT); + cmdGen.submitAndWait(cmdBuf); + m_alloc.finalizeAndReleaseStaging(); + m_debug.setObjectName(m_sceneDesc.buffer, "sceneDesc"); +} + +//-------------------------------------------------------------------------------------------------- +// Creating all textures and samplers +// +void HelloVulkan::createTextureImages(const VkCommandBuffer& cmdBuf, const std::vector& textures) +{ + VkSamplerCreateInfo samplerCreateInfo{VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; + samplerCreateInfo.minFilter = VK_FILTER_LINEAR; + samplerCreateInfo.magFilter = VK_FILTER_LINEAR; + samplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + samplerCreateInfo.maxLod = FLT_MAX; + + VkFormat format = VK_FORMAT_R8G8B8A8_SRGB; + + // If no textures are present, create a dummy one to accommodate the pipeline layout + if(textures.empty() && m_textures.empty()) + { + nvvk::Texture texture; + + std::array color{255u, 255u, 255u, 255u}; + VkDeviceSize bufferSize = sizeof(color); + auto imgSize = VkExtent2D{1, 1}; + auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); + + // Creating the dummy texture + nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); + VkImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); + texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); + + // The image format must be in VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL + nvvk::cmdBarrierImageLayout(cmdBuf, texture.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + m_textures.push_back(texture); + } + else + { + // Uploading all images + for(const auto& texture : textures) + { + std::stringstream o; + int texWidth, texHeight, texChannels; + o << "media/textures/" << texture; + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); + + stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + + std::array color{255u, 0u, 255u, 255u}; + + stbi_uc* pixels = stbi_pixels; + // Handle failure + if(!stbi_pixels) + { + texWidth = texHeight = 1; + texChannels = 4; + pixels = reinterpret_cast(color.data()); + } + + VkDeviceSize bufferSize = static_cast(texWidth) * texHeight * sizeof(uint8_t) * 4; + auto imgSize = VkExtent2D{(uint32_t)texWidth, (uint32_t)texHeight}; + auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format, VK_IMAGE_USAGE_SAMPLED_BIT, true); + + { + nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, pixels, imageCreateInfo); + nvvk::cmdGenerateMipmaps(cmdBuf, image.image, format, imgSize, imageCreateInfo.mipLevels); + VkImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); + nvvk::Texture texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); + + m_textures.push_back(texture); + } + + stbi_image_free(stbi_pixels); + } + } +} + +//-------------------------------------------------------------------------------------------------- +// Destroying all allocations +// +void HelloVulkan::destroyResources() +{ + vkDestroyPipeline(m_device, m_graphicsPipeline, nullptr); + vkDestroyPipelineLayout(m_device, m_pipelineLayout, nullptr); + vkDestroyDescriptorPool(m_device, m_descPool, nullptr); + vkDestroyDescriptorSetLayout(m_device, m_descSetLayout, nullptr); + + m_alloc.destroy(m_cameraMat); + m_alloc.destroy(m_sceneDesc); + + for(auto& m : m_objModel) + { + m_alloc.destroy(m.vertexBuffer); + m_alloc.destroy(m.indexBuffer); + m_alloc.destroy(m.matColorBuffer); + m_alloc.destroy(m.matIndexBuffer); + } + + for(auto& t : m_textures) + { + m_alloc.destroy(t); + } + + //#Post + m_alloc.destroy(m_offscreenColor); + m_alloc.destroy(m_offscreenDepth); + vkDestroyPipeline(m_device, m_postPipeline, nullptr); + vkDestroyPipelineLayout(m_device, m_postPipelineLayout, nullptr); + vkDestroyDescriptorPool(m_device, m_postDescPool, nullptr); + vkDestroyDescriptorSetLayout(m_device, m_postDescSetLayout, nullptr); + vkDestroyRenderPass(m_device, m_offscreenRenderPass, nullptr); + vkDestroyFramebuffer(m_device, m_offscreenFramebuffer, nullptr); + + + // #VKRay + m_sbtWrapper.destroy(); + m_rtBuilder.destroy(); + vkDestroyPipeline(m_device, m_rtPipeline, nullptr); + vkDestroyPipelineLayout(m_device, m_rtPipelineLayout, nullptr); + vkDestroyDescriptorPool(m_device, m_rtDescPool, nullptr); + vkDestroyDescriptorSetLayout(m_device, m_rtDescSetLayout, nullptr); + // Pipeline libraries have the same lifetime as the pipelines that uses them + vkDestroyPipeline(m_device, m_rtShaderLibrary, nullptr); + + m_alloc.deinit(); +} + +//-------------------------------------------------------------------------------------------------- +// Drawing the scene in raster mode +// +void HelloVulkan::rasterize(const VkCommandBuffer& cmdBuf) +{ + VkDeviceSize offset{0}; + + m_debug.beginLabel(cmdBuf, "Rasterize"); + + // Dynamic Viewport + setViewport(cmdBuf); + + // Drawing all triangles + vkCmdBindPipeline(cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline); + vkCmdBindDescriptorSets(cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descSet, 0, nullptr); + + + for(int i = 0; i < m_objInstance.size(); ++i) + { + auto& inst = m_objInstance[i]; + auto& model = m_objModel[inst.objIndex]; + m_pushConstant.instanceId = i; // Telling which instance is drawn + + vkCmdPushConstants(cmdBuf, m_pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, + sizeof(ObjPushConstant), &m_pushConstant); + vkCmdBindVertexBuffers(cmdBuf, 0, 1, &model.vertexBuffer.buffer, &offset); + vkCmdBindIndexBuffer(cmdBuf, model.indexBuffer.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(cmdBuf, model.nbIndices, 1, 0, 0, 0); + } + m_debug.endLabel(cmdBuf); +} + +//-------------------------------------------------------------------------------------------------- +// Handling resize of the window +// +void HelloVulkan::onResize(int /*w*/, int /*h*/) +{ + createOffscreenRender(); + updatePostDescriptorSet(); + updateRtDescriptorSet(); +} + + +////////////////////////////////////////////////////////////////////////// +// Post-processing +////////////////////////////////////////////////////////////////////////// + + +//-------------------------------------------------------------------------------------------------- +// Creating an offscreen frame buffer and the associated render pass +// +void HelloVulkan::createOffscreenRender() +{ + m_alloc.destroy(m_offscreenColor); + m_alloc.destroy(m_offscreenDepth); + + // Creating the color image + { + auto colorCreateInfo = nvvk::makeImage2DCreateInfo(m_size, m_offscreenColorFormat, + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT + | VK_IMAGE_USAGE_STORAGE_BIT); + + + nvvk::Image image = m_alloc.createImage(colorCreateInfo); + VkImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, colorCreateInfo); + VkSamplerCreateInfo sampler{VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; + m_offscreenColor = m_alloc.createTexture(image, ivInfo, sampler); + m_offscreenColor.descriptor.imageLayout = VK_IMAGE_LAYOUT_GENERAL; + } + + // Creating the depth buffer + auto depthCreateInfo = nvvk::makeImage2DCreateInfo(m_size, m_offscreenDepthFormat, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); + { + nvvk::Image image = m_alloc.createImage(depthCreateInfo); + + + VkImageViewCreateInfo depthStencilView{VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO}; + depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D; + depthStencilView.format = m_offscreenDepthFormat; + depthStencilView.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1}; + depthStencilView.image = image.image; + + m_offscreenDepth = m_alloc.createTexture(image, depthStencilView); + } + + // Setting the image layout for both color and depth + { + nvvk::CommandPool genCmdBuf(m_device, m_graphicsQueueIndex); + auto cmdBuf = genCmdBuf.createCommandBuffer(); + nvvk::cmdBarrierImageLayout(cmdBuf, m_offscreenColor.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL); + nvvk::cmdBarrierImageLayout(cmdBuf, m_offscreenDepth.image, VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT); + + genCmdBuf.submitAndWait(cmdBuf); + } + + // Creating a renderpass for the offscreen + if(!m_offscreenRenderPass) + { + m_offscreenRenderPass = nvvk::createRenderPass(m_device, {m_offscreenColorFormat}, m_offscreenDepthFormat, 1, true, + true, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL); + } + + + // Creating the frame buffer for offscreen + std::vector attachments = {m_offscreenColor.descriptor.imageView, m_offscreenDepth.descriptor.imageView}; + + vkDestroyFramebuffer(m_device, m_offscreenFramebuffer, nullptr); + VkFramebufferCreateInfo info{VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO}; + info.renderPass = m_offscreenRenderPass; + info.attachmentCount = 2; + info.pAttachments = attachments.data(); + info.width = m_size.width; + info.height = m_size.height; + info.layers = 1; + vkCreateFramebuffer(m_device, &info, nullptr, &m_offscreenFramebuffer); +} + +//-------------------------------------------------------------------------------------------------- +// The pipeline is how things are rendered, which shaders, type of primitives, depth test and more +// +void HelloVulkan::createPostPipeline() +{ + // Push constants in the fragment shader + VkPushConstantRange pushConstantRanges = {VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(float)}; + + // Creating the pipeline layout + VkPipelineLayoutCreateInfo createInfo{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + createInfo.setLayoutCount = 1; + createInfo.pSetLayouts = &m_postDescSetLayout; + createInfo.pushConstantRangeCount = 1; + createInfo.pPushConstantRanges = &pushConstantRanges; + vkCreatePipelineLayout(m_device, &createInfo, nullptr, &m_postPipelineLayout); + + + // Pipeline: completely generic, no vertices + nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); + pipelineGenerator.addShader(nvh::loadFile("spv/passthrough.vert.spv", true, defaultSearchPaths, true), VK_SHADER_STAGE_VERTEX_BIT); + pipelineGenerator.addShader(nvh::loadFile("spv/post.frag.spv", true, defaultSearchPaths, true), VK_SHADER_STAGE_FRAGMENT_BIT); + pipelineGenerator.rasterizationState.cullMode = VK_CULL_MODE_NONE; + m_postPipeline = pipelineGenerator.createPipeline(); + m_debug.setObjectName(m_postPipeline, "post"); +} + +//-------------------------------------------------------------------------------------------------- +// The descriptor layout is the description of the data that is passed to the vertex or the +// fragment program. +// +void HelloVulkan::createPostDescriptor() +{ + m_postDescSetLayoutBind.addBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + m_postDescSetLayout = m_postDescSetLayoutBind.createLayout(m_device); + m_postDescPool = m_postDescSetLayoutBind.createPool(m_device); + m_postDescSet = nvvk::allocateDescriptorSet(m_device, m_postDescPool, m_postDescSetLayout); +} + + +//-------------------------------------------------------------------------------------------------- +// Update the output +// +void HelloVulkan::updatePostDescriptorSet() +{ + VkWriteDescriptorSet writeDescriptorSets = m_postDescSetLayoutBind.makeWrite(m_postDescSet, 0, &m_offscreenColor.descriptor); + vkUpdateDescriptorSets(m_device, 1, &writeDescriptorSets, 0, nullptr); +} + +//-------------------------------------------------------------------------------------------------- +// Draw a full screen quad with the attached image +// +void HelloVulkan::drawPost(VkCommandBuffer cmdBuf) +{ + m_debug.beginLabel(cmdBuf, "Post"); + + setViewport(cmdBuf); + + auto aspectRatio = static_cast(m_size.width) / static_cast(m_size.height); + vkCmdPushConstants(cmdBuf, m_postPipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(float), &aspectRatio); + vkCmdBindPipeline(cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, m_postPipeline); + vkCmdBindDescriptorSets(cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, m_postPipelineLayout, 0, 1, &m_postDescSet, 0, nullptr); + vkCmdDraw(cmdBuf, 3, 1, 0, 0); + + m_debug.endLabel(cmdBuf); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +//-------------------------------------------------------------------------------------------------- +// Initialize Vulkan ray tracing +// #VKRay +void HelloVulkan::initRayTracing() +{ + // Requesting ray tracing properties + VkPhysicalDeviceProperties2 prop2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2}; + prop2.pNext = &m_rtProperties; + vkGetPhysicalDeviceProperties2(m_physicalDevice, &prop2); + + m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); + m_sbtWrapper.setup(m_device, m_graphicsQueueIndex, &m_alloc, m_rtProperties); +} + +//-------------------------------------------------------------------------------------------------- +// Convert an OBJ model into the ray tracing geometry used to build the BLAS +// +auto HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +{ + // BLAS builder requires raw device addresses. + VkBufferDeviceAddressInfo info{VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO}; + info.buffer = model.vertexBuffer.buffer; + VkDeviceAddress vertexAddress = vkGetBufferDeviceAddress(m_device, &info); + info.buffer = model.indexBuffer.buffer; + VkDeviceAddress indexAddress = vkGetBufferDeviceAddress(m_device, &info); + + uint32_t maxPrimitiveCount = model.nbIndices / 3; + + // Describe buffer as array of VertexObj. + VkAccelerationStructureGeometryTrianglesDataKHR triangles{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR}; + triangles.vertexFormat = VK_FORMAT_R32G32B32A32_SFLOAT; // vec3 vertex position data. + triangles.vertexData.deviceAddress = vertexAddress; + triangles.vertexStride = sizeof(VertexObj); + // Describe index data (32-bit unsigned int) + triangles.indexType = VK_INDEX_TYPE_UINT32; + triangles.indexData.deviceAddress = indexAddress; + // Indicate identity transform by setting transformData to null device pointer. + //triangles.transformData = {}; + triangles.maxVertex = model.nbVertices; + + // Identify the above data as containing opaque triangles. + VkAccelerationStructureGeometryKHR asGeom{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR}; + asGeom.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR; + asGeom.flags = VK_GEOMETRY_OPAQUE_BIT_KHR; + asGeom.geometry.triangles = triangles; + + // The entire array will be used to build the BLAS. + VkAccelerationStructureBuildRangeInfoKHR offset; + offset.firstVertex = 0; + offset.primitiveCount = maxPrimitiveCount; + offset.primitiveOffset = 0; + offset.transformOffset = 0; + + // Our blas is made from only one geometry, but could be made of many geometries + nvvk::RaytracingBuilderKHR::BlasInput input; + input.asGeometry.emplace_back(asGeom); + input.asBuildOffsetInfo.emplace_back(offset); + + return input; +} + +//-------------------------------------------------------------------------------------------------- +// +// +void HelloVulkan::createBottomLevelAS() +{ + // BLAS - Storing each primitive in a geometry + std::vector allBlas; + allBlas.reserve(m_objModel.size()); + for(const auto& obj : m_objModel) + { + auto blas = objectToVkGeometryKHR(obj); + + // We could add more geometry in each BLAS, but we add only one for now + allBlas.emplace_back(blas); + } + m_rtBuilder.buildBlas(allBlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); +} + +void HelloVulkan::createTopLevelAS() +{ + std::vector tlas; + tlas.reserve(m_objInstance.size()); + for(uint32_t i = 0; i < static_cast(m_objInstance.size()); i++) + { + nvvk::RaytracingBuilderKHR::Instance rayInst; + rayInst.transform = m_objInstance[i].transform; // Position of the instance + rayInst.instanceCustomId = i; // gl_InstanceCustomIndexEXT + rayInst.blasId = m_objInstance[i].objIndex; + rayInst.hitGroupId = 0; // We will use the same hit group for all objects + rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; + tlas.emplace_back(rayInst); + } + m_rtBuilder.buildTlas(tlas, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR); +} + +//-------------------------------------------------------------------------------------------------- +// This descriptor set holds the Acceleration structure and the output image +// +void HelloVulkan::createRtDescriptorSet() +{ + // Top-level acceleration structure, usable by both the ray generation and the closest hit (to + // shoot shadow rays) + m_rtDescSetLayoutBind.addBinding(0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, + VK_SHADER_STAGE_RAYGEN_BIT_KHR | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR); // TLAS + m_rtDescSetLayoutBind.addBinding(1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, + VK_SHADER_STAGE_RAYGEN_BIT_KHR); // Output image + + m_rtDescPool = m_rtDescSetLayoutBind.createPool(m_device); + m_rtDescSetLayout = m_rtDescSetLayoutBind.createLayout(m_device); + + VkDescriptorSetAllocateInfo allocateInfo{VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO}; + allocateInfo.descriptorPool = m_rtDescPool; + allocateInfo.descriptorSetCount = 1; + allocateInfo.pSetLayouts = &m_rtDescSetLayout; + vkAllocateDescriptorSets(m_device, &allocateInfo, &m_rtDescSet); + + + VkAccelerationStructureKHR tlas = m_rtBuilder.getAccelerationStructure(); + VkWriteDescriptorSetAccelerationStructureKHR descASInfo{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR}; + descASInfo.accelerationStructureCount = 1; + descASInfo.pAccelerationStructures = &tlas; + VkDescriptorImageInfo imageInfo{{}, m_offscreenColor.descriptor.imageView, VK_IMAGE_LAYOUT_GENERAL}; + + std::vector writes; + writes.emplace_back(m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 0, &descASInfo)); + writes.emplace_back(m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 1, &imageInfo)); + vkUpdateDescriptorSets(m_device, static_cast(writes.size()), writes.data(), 0, nullptr); +} + + +//-------------------------------------------------------------------------------------------------- +// Writes the output image to the descriptor set +// - Required when changing resolution +// +void HelloVulkan::updateRtDescriptorSet() +{ + // (1) Output buffer + VkDescriptorImageInfo imageInfo{{}, m_offscreenColor.descriptor.imageView, VK_IMAGE_LAYOUT_GENERAL}; + VkWriteDescriptorSet wds = m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 1, &imageInfo); + vkUpdateDescriptorSets(m_device, 1, &wds, 0, nullptr); +} + + +////////////////////////////////////////////////////////////////////////// +// Helper to generate specialization info +// +class Specialization +{ +public: + void add(uint32_t constantID, int32_t value) + { + spec_values.push_back(value); + VkSpecializationMapEntry entry; + entry.constantID = constantID; + entry.size = sizeof(int32_t); + entry.offset = static_cast(spec_entries.size() * sizeof(int32_t)); + spec_entries.emplace_back(entry); + } + + void add(const std::vector>& const_values) + { + for(const auto& v : const_values) + add(v.first, v.second); + } + + VkSpecializationInfo* getSpecialization() + { + spec_info.dataSize = static_cast(spec_values.size() * sizeof(int32_t)); + spec_info.pData = spec_values.data(); + spec_info.mapEntryCount = static_cast(spec_entries.size()); + spec_info.pMapEntries = spec_entries.data(); + return &spec_info; + } + +private: + std::vector spec_values; + std::vector spec_entries; + VkSpecializationInfo spec_info; +}; + + +//-------------------------------------------------------------------------------------------------- +// Pipeline for the ray tracer: all shaders, raygen, chit, miss +// +void HelloVulkan::createRtPipeline() +{ + enum StageIndices + { + eRaygen, + eMiss, + eMiss2, + eShaderGroupCount + }; + + // Specialization - set 8 permutations of the 3 constant + std::vector specializations(8); + for(int i = 0; i < 8; i++) + { + int a = ((i >> 2) % 2) == 1; + int b = ((i >> 1) % 2) == 1; + int c = ((i >> 0) % 2) == 1; + specializations[i].add({{0, a}, {1, b}, {2, c}}); + } + + + // All stages + // Store the created modules for later cleanup + std::vector modules; + std::array stages{}; + VkPipelineShaderStageCreateInfo stage{VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO}; + stage.pName = "main"; // All the same entry point + // Raygen + stage.module = nvvk::createShaderModule(m_device, nvh::loadFile("spv/raytrace.rgen.spv", true, defaultSearchPaths, true)); + modules.push_back(stage.module); + stage.stage = VK_SHADER_STAGE_RAYGEN_BIT_KHR; + stages[eRaygen] = stage; + // Miss + stage.module = nvvk::createShaderModule(m_device, nvh::loadFile("spv/raytrace.rmiss.spv", true, defaultSearchPaths, true)); + modules.push_back(stage.module); + stage.stage = VK_SHADER_STAGE_MISS_BIT_KHR; + stages[eMiss] = stage; + // The second miss shader is invoked when a shadow ray misses the geometry. It simply indicates that no occlusion has been found + stage.module = + nvvk::createShaderModule(m_device, nvh::loadFile("spv/raytraceShadow.rmiss.spv", true, defaultSearchPaths, true)); + modules.push_back(stage.module); + stage.stage = VK_SHADER_STAGE_MISS_BIT_KHR; + stages[eMiss2] = stage; + + // Hit Group - Closest Hit + // Create many variation of the closest hit + stage.module = nvvk::createShaderModule(m_device, nvh::loadFile("spv/raytrace.rchit.spv", true, defaultSearchPaths, true)); + + modules.push_back(stage.module); + // Store the hit groups for compilation in a separate pipeline library object + std::vector libraryStages{}; + for(uint32_t s = 0; s < (uint32_t)specializations.size(); s++) + { + stage.stage = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; + stage.pSpecializationInfo = specializations[s].getSpecialization(); + libraryStages.push_back(stage); + } + + // Shader groups + VkRayTracingShaderGroupCreateInfoKHR group{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; + group.anyHitShader = VK_SHADER_UNUSED_KHR; + group.closestHitShader = VK_SHADER_UNUSED_KHR; + group.generalShader = VK_SHADER_UNUSED_KHR; + group.intersectionShader = VK_SHADER_UNUSED_KHR; + + // Raygen + group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; + group.generalShader = eRaygen; + m_rtShaderGroups.push_back(group); + + // Miss + group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; + group.generalShader = eMiss; + m_rtShaderGroups.push_back(group); + + // Shadow Miss + group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR; + group.generalShader = eMiss2; + m_rtShaderGroups.push_back(group); + + // Shader groups for the pipeline library containing the closest hit shaders + std::vector libraryShaderGroups; + + VkRayTracingShaderGroupCreateInfoKHR libraryGroup{VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR}; + libraryGroup.anyHitShader = VK_SHADER_UNUSED_KHR; + libraryGroup.closestHitShader = VK_SHADER_UNUSED_KHR; + libraryGroup.generalShader = VK_SHADER_UNUSED_KHR; + libraryGroup.intersectionShader = VK_SHADER_UNUSED_KHR; + libraryGroup.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR; + + // Hit Group - Closest Hit + AnyHit + // Creating many Hit groups, one for each specialization + + for(uint32_t s = 0; s < (uint32_t)specializations.size(); s++) + { + // The indices of the stages are local to the pipeline library + libraryGroup.closestHitShader = s; // Using variation of the closest hit + libraryShaderGroups.push_back(libraryGroup); + } + + // Push constant: we want to be able to update constants used by the shaders + VkPushConstantRange pushConstant{VK_SHADER_STAGE_RAYGEN_BIT_KHR | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR | VK_SHADER_STAGE_MISS_BIT_KHR, + 0, sizeof(RtPushConstant)}; + + + VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo{VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO}; + pipelineLayoutCreateInfo.pushConstantRangeCount = 1; + pipelineLayoutCreateInfo.pPushConstantRanges = &pushConstant; + + // Descriptor sets: one specific to ray tracing, and one shared with the rasterization pipeline + std::vector rtDescSetLayouts = {m_rtDescSetLayout, m_descSetLayout}; + pipelineLayoutCreateInfo.setLayoutCount = static_cast(rtDescSetLayouts.size()); + pipelineLayoutCreateInfo.pSetLayouts = rtDescSetLayouts.data(); + + vkCreatePipelineLayout(m_device, &pipelineLayoutCreateInfo, nullptr, &m_rtPipelineLayout); + + // Creation of the pipeline library object + VkRayTracingPipelineCreateInfoKHR pipelineLibraryInfo{VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR}; + // Flag the object as a pipeline library, which is a specific object that cannot be used directly. + pipelineLibraryInfo.flags = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR; + // Use the same layout as the target pipeline + pipelineLibraryInfo.layout = m_rtPipelineLayout; + // As for the interface the maximum recursion depth must also be consistent across the pipeline + pipelineLibraryInfo.maxPipelineRayRecursionDepth = 2; + + // Pipeline libraries need to define an interface, defined by the maximum hit attribute size (typically 2 for + // the built-in triangle intersector) and the maximum payload size (3 floating-point values in this sample). + // Pipeline libraries can be linked into a final pipeline only if their interface matches + VkRayTracingPipelineInterfaceCreateInfoKHR pipelineInterface{VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR}; + pipelineInterface.maxPipelineRayHitAttributeSize = sizeof(nvmath::vec2f); + pipelineInterface.maxPipelineRayPayloadSize = sizeof(nvmath::vec3f); + pipelineLibraryInfo.pLibraryInterface = &pipelineInterface; + + // Shader groups and stages for the library + pipelineLibraryInfo.groupCount = static_cast(libraryShaderGroups.size()); + pipelineLibraryInfo.pGroups = libraryShaderGroups.data(); + pipelineLibraryInfo.stageCount = static_cast(libraryStages.size()); + pipelineLibraryInfo.pStages = libraryStages.data(); + + // Creation of the pipeline library + vkCreateRayTracingPipelinesKHR(m_device, {}, {}, 1, &pipelineLibraryInfo, nullptr, &m_rtShaderLibrary); + + + // Assemble the shader stages and recursion depth info into the ray tracing pipeline + VkRayTracingPipelineCreateInfoKHR rayPipelineInfo{VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR}; + rayPipelineInfo.stageCount = static_cast(stages.size()); // Stages are shaders + rayPipelineInfo.pStages = stages.data(); + + // In this case, m_rtShaderGroups.size() == 4: we have one raygen group, + // two miss shader groups, and one hit group. + rayPipelineInfo.groupCount = static_cast(m_rtShaderGroups.size()); + rayPipelineInfo.pGroups = m_rtShaderGroups.data(); + + // The ray tracing process can shoot rays from the camera, and a shadow ray can be shot from the + // hit points of the camera rays, hence a recursion level of 2. This number should be kept as low + // as possible for performance reasons. Even recursive ray tracing should be flattened into a loop + // in the ray generation to avoid deep recursion. + rayPipelineInfo.maxPipelineRayRecursionDepth = 2; // Ray depth + rayPipelineInfo.layout = m_rtPipelineLayout; + + // The library will be linked into the final pipeline by specifying its handle and shared interface + VkPipelineLibraryCreateInfoKHR inputLibrary{VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR}; + inputLibrary.libraryCount = 1; + inputLibrary.pLibraries = &m_rtShaderLibrary; + rayPipelineInfo.pLibraryInfo = &inputLibrary; + rayPipelineInfo.pLibraryInterface = &pipelineInterface; + + // Deferred operations allow the driver to parallelize the pipeline compilation on several threads + // Create a deferred operation + VkDeferredOperationKHR hOp; + VkResult result = vkCreateDeferredOperationKHR(m_device, nullptr, &hOp); + assert(result == VK_SUCCESS); + + // The pipeline creation is called with the deferred operation. Instead of blocking until + // the compilation is done, the call returns immediately + vkCreateRayTracingPipelinesKHR(m_device, hOp, {}, 1, &rayPipelineInfo, nullptr, &m_rtPipeline); + + // The compilation will be split into a maximum of 8 threads, or the maximum supported by the + // driver for that operation + uint32_t maxThreads{8}; + uint32_t threadCount = std::min(vkGetDeferredOperationMaxConcurrencyKHR(m_device, hOp), maxThreads); + + + std::vector> joins; + for(uint32_t i = 0; i < threadCount; i++) + { + VkDevice device{m_device}; + joins.emplace_back(std::async(std::launch::async, [device, hOp]() { + // Wait until the thread has finished its work + VkResult result = vkDeferredOperationJoinKHR(device, hOp); + // A return value of SUCCESS means the pipeline compilation is done. + // THREAD_DONE indicates that thread has no work to do for this task + // (e.g. the operation could not be split into that many threads) + // THREAD_IDLE indicates the thread has finished its task, but the overall pipeline + // compilation is not finished. + // In the last two cases, more work could be performed by the thread, such as waiting + // for another deferred operation + assert(result == VK_SUCCESS || result == VK_THREAD_DONE_KHR || result == VK_THREAD_IDLE_KHR); + })); + } + // Wait for all threads to finish + for(auto& f : joins) + { + f.get(); + } + // Once the deferred operation is complete, check for compilation success + result = vkGetDeferredOperationResultKHR(m_device, hOp); + assert(result == VK_SUCCESS); + // Destroy the deferred operation + vkDestroyDeferredOperationKHR(m_device, hOp, nullptr); + + // The Shader Binding Table is built accounting for the entire pipeline, including the + // stages contained in the library. Passing the library information allows the wrapper + // to shift the shader group indices accordingly + m_sbtWrapper.create(m_rtPipeline, rayPipelineInfo, {pipelineLibraryInfo}); + + // Spec only guarantees 1 level of "recursion". Check for that sad possibility here. + if(m_rtProperties.maxRayRecursionDepth <= 1) + { + throw std::runtime_error("Device fails to support ray recursion (m_rtProperties.maxRayRecursionDepth <= 1)"); + } + + // Destroy all the created modules, for both libraries and main pipeline + for(auto& m : modules) + vkDestroyShaderModule(m_device, m, nullptr); +} + +//-------------------------------------------------------------------------------------------------- +// Ray Tracing the scene +// +void HelloVulkan::raytrace(const VkCommandBuffer& cmdBuf, const nvmath::vec4f& clearColor) +{ + m_debug.beginLabel(cmdBuf, "Ray trace"); + // Initializing push constant values + m_rtPushConstants.clearColor = clearColor; + m_rtPushConstants.lightPosition = m_pushConstant.lightPosition; + m_rtPushConstants.lightIntensity = m_pushConstant.lightIntensity; + m_rtPushConstants.lightType = m_pushConstant.lightType; + m_rtPushConstants.specialization = m_pushConstant.specialization; + + std::vector descSets{m_rtDescSet, m_descSet}; + vkCmdBindPipeline(cmdBuf, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_rtPipeline); + vkCmdBindDescriptorSets(cmdBuf, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_rtPipelineLayout, 0, + (uint32_t)descSets.size(), descSets.data(), 0, nullptr); + vkCmdPushConstants(cmdBuf, m_rtPipelineLayout, + VK_SHADER_STAGE_RAYGEN_BIT_KHR | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR | VK_SHADER_STAGE_MISS_BIT_KHR, + 0, sizeof(RtPushConstant), &m_rtPushConstants); + + auto& regions = m_sbtWrapper.getRegions(); + vkCmdTraceRaysKHR(cmdBuf, ®ions[0], ®ions[1], ®ions[2], ®ions[3], m_size.width, m_size.height, 1); + + m_debug.endLabel(cmdBuf); +} diff --git a/ray_tracing_advanced_compilation/hello_vulkan.h b/ray_tracing_advanced_compilation/hello_vulkan.h new file mode 100644 index 0000000..6016ca9 --- /dev/null +++ b/ray_tracing_advanced_compilation/hello_vulkan.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "nvvk/appbase_vk.hpp" +#include "nvvk/debug_util_vk.hpp" +#include "nvvk/descriptorsets_vk.hpp" +#include "nvvk/memallocator_dma_vk.hpp" +#include "nvvk/resourceallocator_vk.hpp" + +// #VKRay +#include "nvvk/raytraceKHR_vk.hpp" +#include "nvvk/sbtwrapper_vk.hpp" + +//-------------------------------------------------------------------------------------------------- +// Simple rasterizer of OBJ objects +// - Each OBJ loaded are stored in an `ObjModel` and referenced by a `ObjInstance` +// - It is possible to have many `ObjInstance` referencing the same `ObjModel` +// - Rendering is done in an offscreen framebuffer +// - The image of the framebuffer is displayed in post-process in a full-screen quad +// +class HelloVulkan : public nvvk::AppBaseVk +{ +public: + void setup(const VkInstance& instance, const VkDevice& device, const VkPhysicalDevice& physicalDevice, uint32_t queueFamily) override; + void createDescriptorSetLayout(); + void createGraphicsPipeline(); + void loadModel(const std::string& filename, nvmath::mat4f transform = nvmath::mat4f(1)); + void updateDescriptorSet(); + void createUniformBuffer(); + void createSceneDescriptionBuffer(); + void createTextureImages(const VkCommandBuffer& cmdBuf, const std::vector& textures); + void updateUniformBuffer(const VkCommandBuffer& cmdBuf); + void onResize(int /*w*/, int /*h*/) override; + void destroyResources(); + void rasterize(const VkCommandBuffer& cmdBuff); + + // The OBJ model + struct ObjModel + { + uint32_t nbIndices{0}; + uint32_t nbVertices{0}; + nvvk::Buffer vertexBuffer; // Device buffer of all 'Vertex' + nvvk::Buffer indexBuffer; // Device buffer of the indices forming triangles + nvvk::Buffer matColorBuffer; // Device buffer of array of 'Wavefront material' + nvvk::Buffer matIndexBuffer; // Device buffer of array of 'Wavefront material' + }; + + // Instance of the OBJ + struct ObjInstance + { + uint32_t objIndex{0}; // Reference to the `m_objModel` + uint32_t txtOffset{0}; // Offset in `m_textures` + nvmath::mat4f transform{1}; // Position of the instance + nvmath::mat4f transformIT{1}; // Inverse transpose + }; + + // Information pushed at each draw call + struct ObjPushConstant + { + nvmath::vec3f lightPosition{10.f, 15.f, 8.f}; + int instanceId{0}; // To retrieve the transformation matrix + float lightIntensity{100.f}; + int lightType{0}; // 0: point, 1: infinite + int specialization{7}; // all in use + }; + ObjPushConstant m_pushConstant; + + // Array of objects and instances in the scene + std::vector m_objModel; + std::vector m_objInstance; + + // Graphic pipeline + VkPipelineLayout m_pipelineLayout; + VkPipeline m_graphicsPipeline; + nvvk::DescriptorSetBindings m_descSetLayoutBind; + VkDescriptorPool m_descPool; + VkDescriptorSetLayout m_descSetLayout; + VkDescriptorSet m_descSet; + + nvvk::Buffer m_cameraMat; // Device-Host of the camera matrices + nvvk::Buffer m_sceneDesc; // Device buffer of the OBJ instances + std::vector m_textures; // vector of all textures of the scene + + + nvvk::ResourceAllocatorDma m_alloc; // Allocator for buffer, images, acceleration structures + nvvk::DebugUtil m_debug; // Utility to name objects + + + // #Post + void createOffscreenRender(); + void createPostPipeline(); + void createPostDescriptor(); + void updatePostDescriptorSet(); + void drawPost(VkCommandBuffer cmdBuf); + + nvvk::DescriptorSetBindings m_postDescSetLayoutBind; + VkDescriptorPool m_postDescPool{VK_NULL_HANDLE}; + VkDescriptorSetLayout m_postDescSetLayout{VK_NULL_HANDLE}; + VkDescriptorSet m_postDescSet{VK_NULL_HANDLE}; + VkPipeline m_postPipeline{VK_NULL_HANDLE}; + VkPipelineLayout m_postPipelineLayout{VK_NULL_HANDLE}; + VkRenderPass m_offscreenRenderPass{VK_NULL_HANDLE}; + VkFramebuffer m_offscreenFramebuffer{VK_NULL_HANDLE}; + nvvk::Texture m_offscreenColor; + nvvk::Texture m_offscreenDepth; + VkFormat m_offscreenColorFormat{VK_FORMAT_R32G32B32A32_SFLOAT}; + VkFormat m_offscreenDepthFormat{VK_FORMAT_X8_D24_UNORM_PACK32}; + + // #VKRay + void initRayTracing(); + auto objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void raytrace(const VkCommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); + + + VkPhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR}; + nvvk::RaytracingBuilderKHR m_rtBuilder; + nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; + VkDescriptorPool m_rtDescPool; + VkDescriptorSetLayout m_rtDescSetLayout; + VkDescriptorSet m_rtDescSet; + std::vector m_rtShaderGroups; + VkPipelineLayout m_rtPipelineLayout; + VkPipeline m_rtPipeline; + nvvk::SBTWrapper m_sbtWrapper; + // Ray tracing shader library + VkPipeline m_rtShaderLibrary; + + struct RtPushConstant + { + nvmath::vec4f clearColor; + nvmath::vec3f lightPosition; + float lightIntensity{100.0f}; + int lightType{0}; + int specialization{7}; + } m_rtPushConstants; +}; diff --git a/ray_tracing_advanced_compilation/images/advanced_compilation.png b/ray_tracing_advanced_compilation/images/advanced_compilation.png new file mode 100644 index 0000000000000000000000000000000000000000..8110cbc319078cc8ac55972fadbaca9698e02311 GIT binary patch literal 222748 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 T#zKjKfq}u()z4*}Q$iB}6BcaO literal 0 HcmV?d00001 diff --git a/ray_tracing_advanced_compilation/images/deferred_host_operations.png b/ray_tracing_advanced_compilation/images/deferred_host_operations.png new file mode 100644 index 0000000000000000000000000000000000000000..74b60e479dfdc30922d31db7085232c2aec953e9 GIT binary patch literal 14755 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 B#lrvq literal 0 HcmV?d00001 diff --git a/ray_tracing_advanced_compilation/images/high_level_advanced_compilation.png b/ray_tracing_advanced_compilation/images/high_level_advanced_compilation.png new file mode 100644 index 0000000000000000000000000000000000000000..982afb4528fc702b87d5afd54f946a175e447335 GIT binary patch literal 29221 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 Y|6}SFM;M1& literal 0 HcmV?d00001 diff --git a/ray_tracing_advanced_compilation/images/high_level_regular_compilation.png b/ray_tracing_advanced_compilation/images/high_level_regular_compilation.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf3a3fac4b3816d9f9444917100e18dd7e39e9e GIT binary patch literal 33946 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 literal 0 HcmV?d00001 diff --git a/ray_tracing_advanced_compilation/images/library.png b/ray_tracing_advanced_compilation/images/library.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0e4ef960635b03a3ad9b098a5c1b8ff6014690 GIT binary patch literal 37975 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 b`Ohx(Ob?ge{L#TjKy%ohu6{1-oD!MlB zSEMj7C@^@sIEGZrd2_eAAUJ&9i{J4c9u9qX1vG_jOmcRS@#&ChHFmPTmUhB92)6%PX2JP*07EL)d>u>(C@cVTOPU@FA zM;=Tnye}iLab-yxgMh9OKSSq)*exe7y!f(x-kbGt=AQpge*bt?PVn`zJvYBHP4%1F zal$u$^8V#7ugqK4blpz7FP>fdc#e5b{nIbsJ31uRe0$*C?OUjw?RD+x%~dkyf3{zL zWpi~`{iA&UwTqT7h$?K{6Yg?s)%p96zkIjw-&&@wvUyf+oGkm{=lwrjx#F@r9v^39 zc-C=**}+L-e)W-E_wQeRQhN27+n1Ipev=Z<7H@u2E_P#8^WI}oON(FH1!VU{ha1^% z-<9|$VBfFD)!%-v-R*sUg`krsNmg;!U#ow#lLs)z)j@TrQNJo6c|2>2WZ7eruYn(xlv&@IP*)N@|lB8C+Tf z`58EkpXRL2cow-ct6x6jQ*`-$i@OA*F7$M9yM1<=~`F1n%uVStN-;LD0lYVc`WVI0yX_xii+&p z#rJ%>*21^9gJ<_E{n{P(Wmj-lJ3ftY2^160oe?#nWuKifRX*;(=@TCMEl%39PD+kMec@@y#aie%y{MMqk z7e0nhRXr`*ee`W!=`Q}9eUkGQ_LkN-D`l-IEccmja!epCB=xKHY?WV;H4~>w_*z^J zE7?|C-dJ)!C-+mg#3?PY?hYOE{=buw|Hu0NJ$=$FS4%@X;8koUvy${CXQ4?4GAm}^ z(bDN=YRH^W!Qe6D&mPln#kPLiH?O@Rw&(r5vXvJ#gA(Vhdi{8{{kjy{%lc=&Zk_x0 zZ{7Zmg+pV(r!CC$yC|-4F@ov-DJT6FpZVIyZN<-nOr0m9ziYesfm~IVe*X ze)(@v&efx4FW2W=T~+RmU%@MLJoNU37a}Vo{-+gmEG}ER`dc%zZ(%GbRV4PZHyq*A zIh+AG~8?$ zR4!Q+&)gAxJU!a?`swf2WbZ%z;(gRO->-CaU5;}^{^Z^6N1`SezwFJ8&;Nhmc-(TM z;$v_5|EFzRyllb7W48M~EjfEz>vHb_pVU)#GG|?y`un5t*}SflII(GR64Q0XKKg%s zrfK1_v&ycJ&>E#oQ}Jk`|j%#LYG zXGC;v)=avUW;S!@-2ZQG9hjo4TfH*&h-FwU!vZ}aeg@8|+3P1-qIN#VlsXS&bT>qV@YbH>xo5EDgt&* z3P1n7@9!lh?=U5+xgRT|<_Fzr5&yf^ce8&>l1Xl)@FykHt_d$@MV?{r@0N_3_5W6= zpb$R;sIHw5v5lAYl88j&jD^$puldlsYhifyo!;5!{r2C8Qn|hDuVnV+o%7VfPk+0! zQD^D?y3aeq1Yf`Vy1wUZ3+I`;T*9-sk6NA25(=EMF6Z!5xlf)l0@E@ zwp2zhzENeWb#cnP`N`8xhQ*&*d1u}I_usqsE;yrS>-+AST7CcC1)JU-)hNF>x3=)% z>g`uMGPDAxibnjou=#(G&S{B7no6(I#7-Z4oVse$l#3fO#P2g7keOJ);ISoU_asG` zu2s|XSJ!U5r1!|?`|n>X#m@EZE&gqM?d9$ndruYJ<9HnwcFT2EO#aoK$(0RNQ`9tV zt5?Rl+>viCeA~#Oi8C=)9YKaO;(ct{RsoS3UZ`@Rd{Dxc24EzU}i~-l$oZ{-1rl9Jk%cgZe=q zZl!PZ+ZPr7C+g@~X5Zy;xm^2FHrzV8=j67+ZQGxyCvTOG%C^hcDn3QDisHE3ueOe3XhQJnT!r|3?4Bm ze4HZ4*12!`{OH*51kud3Gb=7z-MLY=xAfGWH978wyQhk>75<8zeP^xT#;`T@o7W{= znr~wFy(82mt!{$rmqpsP`#HMPA_SGM^ay5tk0jH?))e>t&U*FFOd#qV{ zaq86h(RV*Q%HGX=EQqhZKX^@<^UZf(1J|sdv9TjV%j)*U4g1dMJu2C5wzHb6iTm&5 z&%3j7i$J_Ze|Z@k_S`A{{_gGr@o(~be}me^6=n<*bWRB$x%^M_+^OJur(db@@M`+6 zHEXd?swtbodRfq&jX^<5e3pIE5oQLJZ^z4*Ea_N&{i{~B|Hd{6h6yffJ~A*!=B@0$ z|JZtx)`sXp-{ws`&Mr->`68To7(BFu_!&5ClHSkkl{Dzgi2XSG?6b%DJNEc}zoGn= zC#?D)cmCQfPdCF2VqjRHcdY`{824bIZeyH*0bKMjFfb5k=I{DFsg}ve=S+J}&;t)wAut?W4ae zuzSAHoolmP)SNZJUQUlbo}Fv`@16Hz^L4gSPc}{c`EKrU0d`P-#-Ce`=gx)rls$@< zl$Gk%ulzpg{jt!;lbnA4Y2_BK_v-Ysaohjn(P!`Uv#hbM_B$p$Sj5P{z;M=R20PC) z#{Ji?y#4bj@pbUcWlK5j8e7!l%&V&1*43xoFZk8S8n3=71{CN@Ne28nM)P*vuq#SW znR+m4#)(D3+gD%hy*Dr4-Fn`w4~CH-mrT(4e)qrc#rV1N>fcM&e{Xe}HhaO5u+zh)roKooy0lR;45a_nj`Dlu{p(-uDcfjlcy#5wiaT;r|EjL!M@`$| z2=2XIj7Zt@@c=WkGxI){DNCy!74H4rv{hr_X^?IPmy=N?539bXb82|pJ@R<>`+a}2 z3MvZUm4(1;onjrrLP0NhDKmBiQ*7QYr zj|{6m|58fczseQl;u+np#~Lr{vt7}1y?f;Gxf9bPyM?yci!(4VG)Sa8?YZ+$>+JHV z+Uno4e{#QD5yb)$-#KIb?$6V2mtWO;Y8Tr7@9W(CXFh$Dy>>PG|HGd)n>}4z*xKwZ z>sS6;vE6;@WM&2i28E*cd*1K+t#?+qKY#zk-|zmbz1p6C=&}K}6v7v`_b^q*wcId1GO<~dNRcx6f_FHOZ*;P{QPr*$2N)L zHA<6pUPbKv7EwCyQ+)Bx#}PX_I(D4vJA3HV#&vO$`z)TE+1K$h;+k&u|AjW^Z9ZO5 zOxD@?Y`Xc{HCs}(<11rh>ut(Dro5;-Abii@!uR9K>3*9M4Hy_04EA2}v{|zG{p44B zgn}R1=g9v$?kvcC%Km+JiRV7U^+!~UE`0CwcUf|MqJ`1Hx@Khcuq&kpaG`dj39sH>a%?)SX)wGZzn{W!RV z+w7T#a;EyXE!`n2UPL5c581Hrl3u~ZOX^XZx30N)p!L~YrXY=v0`K?z+S7csGA;UJ zeqHRF(z$<+C*Pa*Ai-(>_r1<>ucv*Q^eN~4Pj6v2<4;T1Z~S+udTz45mZr^*>N{#?$6_Uet(-UdEUxp$^Gi8 zLyN_yr_6TU^ZYn_P}Q8;IKj`8<{Y@bIy`KaOU(3p+%wIuUankO=x}7(cExWKK&fcS zwT|`<7B{ndr_bKpkondxdK<{>yOswNyE30fgg>`QKOg+eF4AYS_O(?h3di>Bz5UrK ze)|j;6?OaYCGk~#ale-A*|FqK;f59O``z{CzDf6v2c>^2&FK{yzuNuetO|o>8m4Nk ziK{J)e_oP5Kj~^k$NBcXO3#!we|>QyM7w%kh??gdzZNZ_? zbEkL9PF<+!vj6)Rhs32TKbY_S>?Ah*`(MMFt;f#1HlM;MnJT>Y)t*UN#}BI7oE2bT zV3^_Qr7m|dFwL{lzeWG^j1Tj4v$cI6m459sTz_QQoAj$+k0*;a^K%B8eKz%<|FB2; z)k~Yrk3XyPz0>LW(e?0hR)Bhym$)!H$dvfXXx9_$~Ce%hy<~FM7_e zJvF_yBO>S2;Vb9+_Nwn*a;xx7<8X!vZ(j89stKhNXUyY#|l^ULDT_tt8A``m0i&dtYD|LNk)UmF$s zCbvhWoIWK#{dsTg^yAY&W#C26nMa&m+Wh2fi$A^adH>30vvSd{kpD+(f9tpHe;e=D zSD$z6 zuj|JNAYq2$30}%_uRi|Uy?V!yY1=`}TG>igI1< z8u!jkJibnJs+*u>ZvKzY_s*?6XMB3&*?p(glpbXk=H>HM-~M#SSX@|{kWV4TXS=bLm?_r^yx+nFovI9B!@ zaprcjT^B7UD7bOP7qP{4*Y)ScidV+Q&8mMPF6RBgy+&!#W{Fa<#d*`u8lC(d+@|_r zJ#wEZOvwHeK0}|GMjv z=K5^S#5GMWE;joD1tqhmS#`eLG&{~z?)wMVpe^?v%e;K`$2s&AYwnfD!rg)DZnddX z?(Ad%>u_X=zUeFN)nAq_^USwZnWFVJa^o$dQgPj%AzU$*S9UZ8_Qo8M zxjpY*>gCRkZB2~5x^d0n$DdlBJUz9Y$J#7Ps|V@TE=SP!R_^udx96;N#5}0rp=5m_Ll-XOg~KcSHAmo*h=5|9g}+xzH)l1bno5+ z9@(pr`>t##eSM^3(Il{MgSXv#EWgq(X5RMW>(d&m+lBROS2}#X!8|oj^OAnPoM+nc zkk)TDYT52P>)upZY*$|Cxb#45{jGUcho=SyK3CdydYSP2=WmtwY8oC96nUQD9>rHL zRk@KX=5Xx4E4%t!drjqLUB3G!Q(Q1|M^5Gk)5CVEuQLks>}5V0?t5lm@#Avy%JTk# zrfr{_m4c#DW<06({v5xl^9S2)HnqCr8v{A-2n&5ZaZp*VzhkM#{+OemduQKZ5;x2# zePN^LfA+ln-Riiv#XU0<LbZ*TthV+A*TS4;KR|5zFIUd!dyP0>12 z?khz*&I5B;R(`ldOQsFO~XEuGEx4`>C zQ0m(Bl(*`^PD$r)ZM>S~`OP(MuZQgIuqmf99#0hUUVeN<#8I`=`*K@8*OumaXp1rgBo7L7DDG$m9dwr)(2G z@+^rdPuaF>ZnIqbxkno;W;s7ASZ_9^@2K_1U3)^z-#!wZo4V3N>ucaLqt^#6AI^zh zR(E~f^7vUlk}5=(2luWPsO$0ySkjnx5EP*+#CIniH*0ovNl9Gkt8R4b-lyk#Ps&^l z(+x^>%H+EDpD$o@rF3a>wbe`ST(Ol>x%od#rhfAaQ2plaYbE%x!(yB5-=Guc0^h1H zyLs1;QK(3ko2Puq_ZO0#?P4#=|9;-Q``G?D8-A}U;;*W^%ER;q38mQB9jDcl zn%^(~+7i@h^=;{{pxJg$=2~@ozK^h)lvMm^xoGH;QwirD++Ml=m{nCE>%05EKSwJi z_f}?3OMd)#ch0U$tCp9?{5AwgxxearGoe`TR1uwPWqmKM(X~ z@7rQiUzwi2z2~g7{Dh^p^V-FCqEtjX;~?Wa4W`UOgVWafXHsK=}K%V*=? zHEFu9Zmj>B_rG%er~6O6d848(xuexn~rt#~U?5FZSw>(Zi z^iRFLd3VmPQ@w4?FK4x#eYDv2uKiVm3YeQ^~TUcr^MXeK3~3r zD}HuKdk&|bubXrm$y&UW>!)X3%=&_z9-7+>JF}l%Qdzto4)ydv@1x^zuWk0 zTdr{6>ATneRNpT%`{m;D|I)J*Q*~3N&`&2t-nXm1Yra!d7vOSaiTBK%TeXha6}nCS zByKRX`r694i;ts?R)sh$noyD9UH;&( zE*{rd#UjMt-46RP$ItT2%5&WUA=agt}MEc}2GwggH zEi_eT_vi8Yk*@q9g@19X|E0XPqrnNst7a#*$J$?Z)B9&Oon@LxJJ%mu?^o9*Z#JKO z;PT-chuL+a!;in7@G|7FR?GZFA>CIt~9Mbq=QEqS4KXtVpHg|>~B zmJ8?e{=e7eD7ew$P5U;`2&)?XwWXr3UwW|;R7Vzf%T_$RkR_|^+H!G&~L+})>iOU?XDK2t*6KP%MD(5v* zcHWhj(?9lY+5PkKr}^{eeR!Wcy~CsW@XJs0=le~q^7jzc=g*lxA*uYx)gKwtmy~lDZlW%tgrH1z`I?gZJTAzPlv+dNd`^T)mP1I)I<@GdR-NBE!t}Zqw z^PXgFdA?tiyX3+Ho>Jt0(f6ku0 z^2#CR%up+P69bXXcCk|P>RYnfUb)j`z5gEU4k=H+{_UL3@wC(4u2tQE;x|s7GQU+< zx8dx~*?zMPx;&Qe-|H1Gb@y%Kw8MTkAFbvKWPq*($f-QJkiW!X@_yMLGG~-NtVwlk zeCOd%;9YU~#iwUiZhpyJ^7O;<>EX}wb+1pCDs9x>k$=V5;K#p@60=jIu2$SR?0>VW zzur~**uPipmvsHt=AL~dQ++z|`O~Yv);|69pl_Gl{e<6~=MO$HFWQ=A`Shsyhl$PZ zbHd+Do8I+h>9&o2YqeAB+dr=V^6r^`HXGOXDX(=K#q4g~dt`a(jejHmRw-SZ?AnQb zK?Oc`Vc+lUtv3JB`q%xv-OissE#&?>eRhAny6@=6hN!YtiI)$bzNYe9C++#KseL!3 z9B#2n7cZH(MY#Hwt5!(KnvL07Hv%%ncVxU2UVAg@TFwKf&+|^MZ1er-%c8d9!XLqG z8&GS0Mc)xnBfsI5$Drc+-93_gZ%_5UzkPSu7#J8X?D~Dh_E%H&KFQh#_t^7SMs>N} zvHpMib-2}|x`?}rVxHPBj{kD}?}P8>{+m6M_gSBi+*fkR`KWDKmStSfo<*vm(mTtd zN}m*7T0PCxd;W`%bx*IXd356OlJH*cv(~Jr!_1E>zG%zlvijHWIZ>h9cig2W*5Ysc z)c-a=-_(1*o2k;UtciE&$^)jNIVx{k*3b1&&eSUNWtCoXc7^DyF59I|d;eZNRIGl@ z{@)zuy-Io}^-JE_toX^Vv%|OwJ~C&${r&v^2Wqx@2bzD3n2;b8mmU?>}>@ zDr4g<)|LCNzdd|9{Og?hptlg|1>ZLxYF~R=IAFr7PWQf(7Qd#>a|8`GC|td>v-bbj zdwX1e{^Zoq7WDsqy86@a*!1qoNeT=M3=@L%wyux;bma2qXLn~eY!aHtqjTcqIWxO^ zcO$1XYyu@7m&3&?AKYWT_NHBU3ukVVo1$FQw;OYB`+xg;bJmPUAQe8z8|pjHXGaJ9 z2sz}nM?XUkPt)1`=Yg|xcaOPHy&9-%oc8T{#H z^Z%mXx6b|Bcg*%_{H8NcSJ~Gk?2mUjlDDC2|8Y%Q-{*WLys0VcOLQWdw=O!M^C-9I zyUASZ3ng1ORW4R;{$J8sAUkW$~pr?PBBAtZ(>kF3UdG0E|d94pt4^F>o7b_&ig$ZR?S;ovHt|Z9 zKjd0|$BsjG-|BU5L2F*Np1e9KQ!;JE!)fN{zIIHxy4RvCcz;Fm?VGly@2>4y*ZZ2w zID1R_vpmmV<(GuM%kVF0{rC9yU!}HFZxx-l|7>0V#;oIqwVj;bqnStJZ!dLQzA)!| z_x@~+ZRh{I^GRNPHzHOx^0d-B#rR8pUb@1~Q{OD|WfOe)^4uCVTg#{C%MNC5eU>tx z^U6ig+L5ICXQH}3J3Fu3zWz{Tqy1*X!<)}OWZd2%am_}&YQ4(!I7Ov@+2NB*f;bK0 z_CIcvzP@(NmTrsn^WOVDnz=IJS)M0b2`HpjfmU>UbMHDdIqmVLqe_>G*XS?awd8f! zzMFeCMsb_(F=TyR#CxR<b_NFCRW{ChFnR zCwRhbn%$&1#a=C|oo$tZCJ4vvZ@lj|t7Pk9v*hh6!d96oavY{V)nlGal*u;ob5Ff_ z%tT^}&z#1*{U=hk&abT6UAOPGJjCPdQhP|cfud~lzyFPF2`uF8u z)57+r2uZ!D@^hZ)ropP8v7q&~nMj96_Suiq%$A1o@6NK%DCsIK&$RN{Fmrat!ivkE zPKNznvUlb#)tMJOlY7~neyqDQ=iTjd3mGS#c|SEPWdCN*DU5eg=671%+V#qxuTz6t z*!2zT)O^wOKk?b|dsl~6e?L?`=iuDAch>%PeZ#umH08lG&g8cBmaZuqJ?d+xX4l-` z)^q=xyUVfZwi(F|`LQ2omwx&!Ri1p7y|>ZVktcPxw{gv#e-mX^d-Q*P_4D4L3)B+Z0=Co#(PlGTb{{M&c@~FA*m_se|%~Hy~J{Poy<*0P_H-?qm7s_orf zTHluM{L-pqoqBWohGjyR&YL}Z9%jB~dg$_~xu8``X(dc)9On(YVz=_L&-&Bb{!4b| z?L$);_wwwE6;j;rbmG=WGp}!Ze)9NqyF2ggHr&iz8}Z-m*|kj_H?mgWyHoJ(d+EE4 z2Ys5iCjI3;9n1dhx9LVdeWzLFmm(fF3Y_}2#FOQk@zWVXRaPDy+csBc-BD^g^^9j; zpODt=9qWGdK1*Mtbm>Xf$ql}NP5-XnWcHo)YO=5E&2R2|!i}mo9#0CcaJ{|FK6&by zJ4^D;{P<>f(r)q*juhF{QvH2_(HW=DZwnRQe{s(~pC!v*UWxuX^X{IbAXD2`-LGBt z=k^b`+;x|vFCI{?I+Ws~-YdxOQpEpLrH1QN$m^LC-rYL4PxOS9QMH#_3v}Vv|E;SN zzn?HZHZ^Q}N5s+S_}8-4ZHGS@+%^S@&FPHP3@=|unZ05a_K5APX+EN*v zI_Yh#(X|`PPA=Si%BwD~G}bY@clYy%`Rk*C=f8OP`S_n(cY_u8T7xpy)^jmx@2+)x z^*mM9drRi>nUvi0`>P7SXBfN|kc^%*d!<|cw~mf4Ca!k>uHC=<Cm##ZZV6nb zx`Y49xBmUhmj2~3b+L|g&%YiWnjZTwcooy;!%Gj$oB8=)ssDA><*F?I*Xj!kYF516 zyy|}Kw9ct^p051tWxgj~@OdRnzq)JPgvik3zn^?+XMF$h_J7KJ&qEr&m%5$d3;p)> z)E%B;qrI{DS2K*>ik$55lTw!BNM9Wrf30NI)|XdS=Q&3neDvU(U~1{i?F*BH}PcZfO|H(>9-sU3KMt|N%*4O$zh^sg*ecbxc{`7S>X9S)u_*{JETroRS^*<{xX36fZV*lnWzVTh1q44bQXYNk=@_xz0 ziiAaXUOoHj&A(G>_8+h8b2t7zsBX79q`rt{`~U5F@h>B$i|J9l5$^6`sP8&X1k z?7Vtb|Car}FAojB-{{-LmVH!NKS%$}fv~lyKU>$EJfCC#RNrTDN2-2X&6#BPz5Ma9u;{PP+SWZT4Ue8XE9>D->2mQ3 z)1t3^tD+~po4cj@-Mziie-8ayTt5HKpBka_Y@Ox>njb8rE}zmg^FE<4i_2`vGN$Vx z8zycM-dCp7yJY1JQ_-9WW{blzK#g*3CGlDINxh)S3Wlo_!D}@FWIG{T)%xD!7aHDw zyYS(K_+O<@Uti2!@4nyr182sa!>6xl{NGu(H2GI~8iOyZv{!Irw$=@gTb%LM6WuO_ zyqU#i<}o`^+eCEtt%LX0&o1Bpj!`i3hwbC0H*?r|`R`lX&%EswoAFO0^XPp^$&cmn ze?Hw3@19;a^YaA#_ZOv=HaV1MA8g(}snqLM$-|Nb7uT=1ns&$7lb}uivL3#@*sApD z=~vhIyEQxhZ+7K>RV-Jv#NhS9C2LdtiCK-Y(B{#-_oiRtKHc4s6%&*(e}6&ZBY(|{ zoyT8@$Jf-oT(fh*>KE+cLNO+wr6-YWpBoO^Jor9q*W7r!oLa5hTTBkBPq=X8v0MK6 z6JO82k@mCS@Zhz}H1K4e3(vDg*JHurx82|MtTBq<7LF`=RJL{3#oM3XW*iTewo`iz zYUfXSy6^XX&0ni8e|~TK`2D^KCyIopRP@~0QJH;V>m&Qp4U0fMQIB26=l$!?e;@Pf z(=78uRW+rLKc1bN+h||9rskXQCO!rR1_jqOI=01+PyMu3R_@f)6YOk%?|&|JwVuIY z(B1$K+3)9mzx!x9_qtx0+A@o)!u_|M56Aca@;xnN-T|^eL8`mQT&^M^A>+XGhD{;< zHtWjcH;Ad0+yv=v(1`5Ti+TS~hmm#V?24N2cels$^68)3yDkefS;&y|`GK?Z{l8Do znQzZq89QND=kX5>{`0FRn?42g7)}}KzW%*wzyI5yE50^v`El_nZ^E~7fP7xO@q~rJ zucHmOmadpxaYyo}QFdU{x96aqoj~)NITLTkFZ~&^IzPYOxc;DQXg5fQf%xar@_$9Y z*WFrrXZfp(`}cjGK11$);#pJs?U_$EZ_6ou(3<%Ez=fCndbM{fuLxfk2K9Hgyt`L< zzxI3VEOoj2b;{rG{y+PsPVM>AyM12454hhS*w8V<_hwpfS!!wA(!Xz(Iok+=GvioSXbFIu&q^t)$}eY5 zrpyrqFBgKkGq!&J{oi-KZJi39YyBnszO<{uW8KfE z7gUv)56`bDNsGVnqqFk;`fl$f@8`~MQ!_qQak}8Kwfeo+^8-$~-rV#}{?z9w%vG`J z|36MJf1^@-RzE)~GV^rUzE6B#{(d|$b8?Of52!~Nr13FgZn%;XbFKXOMf>N)?!6tD zBqS*z7F@RPQ`9?Q_HwaVt|<%N3(xO(GUdi5?^UwLlj7wk#qRyxuB!Ht?@R3?;cngY zIokiuzMC^4QS$S>xkptY%Q0Mvbhgd;GsA1vxtaX`v%Z{WEwq30hc)(8y`O1L*YAU+ z_jm98)>_~Fko~gWjTy?lOWfXEDcZB7!qt0~S<%}quQ)HQLmFt{ytM8ZcqNAV#|?TX z1qDBzO}noZ9M{>x7tqmB`Tm^K<`e2)bssy+?0mM@y4ySFXmxn?_tJC!&iGWSUiyB{ z`k)}s=X>$u(`Rt44v!D%OS`*ilgp9nMXARxE_~T%?7lc&ucG3nlqh$=!LQn~8~-NU zLLCS)5zSe#g*#@;m(FWBy4hw03oDm5T=BG#i=Cvabnm?LuXhJGb}L*z64>qk%6W6& z#zf)kH#c;K{=HZGwet9?&t7lRUiKtjNZ#>r?uE+Wd%uLWy-#gUwv_^v5w@@F916_z z>g{YkF8#Og^16NgQ|g%o?~4k){QdodAW!NI6`kt98oM{5g2{cR(}Ja6@y`Eyb+JtS zn+#ib{aU3Yy>gj5d&`{j{B%@7DQ%{1shf=mXw5`M!P}PadmsEb_G;_#Rh!fQ6sF!d zB0RG~!{=sy*O7;UE%W)SU7gyJ_WZs#5xj=y>DxOqw+FY`ubjVO8fZz^g>6?PKfWmZ zR_S_V%J-POH|&9JzB=B^B+4Wt_R0L-=&W)_38W9+PIT?E6Zf= z9J&Ci9t_kU9|bVu;50~_p!2{ z9`Ahi>JxYo!ojT%ocG!Zo~*kjR}<~`;A89L6Ssf9-YVUs>2>6yS&lxxwqB79D3e~; zArk%g;oa|jZ|+9LBn63ica$eYsNA-xv@y|J1YF=aNhm@YRTsO z<+|q~OC|#6ol`t~uhH|g)Hl8-Z}0p(EWi7g&7|bOdEPH}i4<*lGb!u%#^>$!A9;I4 z#b-SMMZ~P>NuBK;`^)dwtuOs5eD(bEsWUd6RZDgJx#9ZN@>?%!^=FCRo||q~n|E(_ zX=L8G z#J8>X+n!GC@HleoBYZK$)ES#vA*&%K2I+ki5S%#gT=#D)eZSw+7JmQs|8#Y5?dJQt z^Z%b==9@gF=taDrU*MgS&g#p4OzYs8Yg6^?$wf(SP$+HDT6zs!&7bg5kpp=o#QhOy z`*d2+;!jss9DiE*dBc9|gX-4d7ui8UleOExD(`U`OJv&(CW!IrK zv$iB{O??#?^=n4z1G)PdH?A`;epw|u+xJ0VuK)W@FI|p2mj1%iapF+W?0>4&*F+>U zUv=u;&}Lpd&$BKf-Sc^w-=m2yk4bGm{@ldJcC@GUVjbm3xS-uEKM zag9?!tFj~i(k+BpKyZp^v1x- z;5Gx*$ieU zSnuA}epgyJJ z{yUewSWd7zaDQE9etB2@p>)AD9Y6a2dhZ@Oy7Q$@uKf-kQ|6bVi6Vh%=fKBP&%bVza)!KOK(V)|yX?-?9LCIWe`-+{$vd44M z#eWoCb`t!^b0_HMk}F2n&ll~CbGhZetJ=hvB> zn>o!Er<6VT6}x+0UFM^1;agd3+do&d&%Y!jnDfBDu3LTTGq=?uJ1}SL_xG>!+W=bo zvGj*-!PQyY1I@RoPuh1SZQ`nn-`f0xGvBxTVE?zmQ(Z|;@c6dn@lyA<=Wh9XWd3)x z%EMM)^^+PO@|~Y3vg%Q!^2ZYir_SCD^gpq+A}99cjt#c#>XIGuJB=oYl{cl!=d_*p za-jF}a;`}a-^TQQ2%dK9;5xlKslpQvexH2*Ki_h<2i~Pi&1z31mWoZjx3NU!XYr%Q z@@tId8UHBjT3_E$|KQ(V`~9j$*Jeylvoy2YcY2xj+N!GKTm6GI*n^)J$G+Myy{jUo z`K?k?R7BR5sbM$yRcr5?P1R2-mi^?*t0E_vGwG)CUFPPu>kcq1J-TH64&~@uI<`F~ zzY~mI(%9|JZhPS&C89 z*Og~ConAIsCI8QQrwyxhrydKDKH9Y;=riBTlz8b(%Reh~s>`PPhVQ&M!RYjbtG{CW zV`lE%^}%K8JgLQX$+tJ}Zh9LX z8Do92pIz*6RnYTqCrcJ_n=xmaeNgb-`q^Vv7K0&6_Kok|qDz(LiKR>R{PEE|7WHo5 zv-`ilt(D#VW~$p?@7bH9E-k(;l)AyoZsxbxjRM8Lbhgitzms~o+jF~(?Yp%tvtl0z zFV`xqk~;l$>amiW8}z0{$=#o1D44!tQRPWH#ue#LuKWxX+$i#Ly8CZs?&-R7f1DEO zE)4eNIhe+FmQ8NS$}&06U|xl73B13{SU2^R)cSeLWL3W5Sk_u-qg#4L?ZyE%$4z7RS#1M6pdGj(S>v+BLh+`#!br|GQ5EM6Or;I}rDmPs9W(`@?Y_SQvL zW?YMG_pr%|jGQ!EY!QFh%?BPmzk+W6uuomqo_|+6r08K|G`l|k@PdvAnQzXwc}^d;ijF*e=>Dpj8Q!b8WEJ0g zuI{~^CYY0U5h-tr=Cq~ADjCf_u(|9_Rn`4hAMAV+%64p-?>}+n|I6KGH{Lz-KV4r} zb!h+gSS6*myvtA5*IC_tRqMBPkIjZ!C#!oR^Uprtb@{%Yl9~65f@=}`ZFJ?H$sQK1 zelxQ(^Y?`V0c$>$i*2%Wr_@%*=t$Xe;G8O-uKjTWq4vuXYcq5kX(%1UZ`KUIHN5~w`ick(%n%^We| zQK|NUrmNO?%SBJIxpi-XS9FwXzF6b${w)z+vb#>j+eE*T`ofa@ed(WbX^xw7?lo@F znkz3Q(RD=mb7^^5?)x)EIotMxEZHtm+Q=(hv-s_E_SWXU0a@1?7cZAroH(d_PP^>1x9hK<*_ZaX+patK zy?^<~e6?Rv@ALj`Nn23hzw@3@#>2&Lb>}Ic{b%ya<@~bB^tJkzJf-?i`j?!)ySuzO z{zm`sp^lTu^w%w2y!OG%esRhCBOhmgEPM3gTR8Xm zxe@<=6!U%U+Hv8}#9f~kJhR{M;M|M9tHeNUEr0+7?c!){2aq$>n+WH@~N6Cv}06i$U+ff2wxt zb3Gphb83Iw*D^Ilr{>kI)_k|NBDw$jj1yZy#>_ZSyz;>FtuyEAd8RDvj4n6Kzqhy2 zHT(TJ?YA}`@07ycrLvBl(jNnCw!GQMUi4*M z@XhXNU+jNfX=N9ynfpK(6rd(A^yANeFR?9KTRn5-hm|suU!B+NpYq~}v&$yAs691z zvf+e|NFSVROId7-TV6< z|72jeB-_c(kRUW&@3)w)=A8Ws)@}3uKKu4z>FIqt<_j?>tTns}9wK}-xR%P$Z2=E7 z^ep}6zWsOk>FeOy>-C?tch(1wUl8745g%v#+A^3_Cl+5@jKNh6^kB z|Go8J{(o`)zowO&y5H;Wi5I^;@%`@j^4H(Kzq0@2^XqPYUj4^6!Idg<3=2%b>z!^s zXJGK?oB!|fMecd;pZq)8sr~8oZ2zcde}C=I@r>zYXt;7fil5=ay7>Rob^W8BoxE-? z93mIV&X6I|$MN{jTtufx$)LBLjnv z(ziR!YnT}fBte>30O+O3M7@`dj@QA;BL@blaqGr3=UR5U)sy=eel!I1>~ZOpizl4 zxBUOVT+snCei3Y-1GLAL;Kora)D5eW!dt#G{Y< z*Z;czGe3GV>`a<-|EpS7g7+=L$5zNK9cC`t{_bn&ujkp(&uZqJ{`=8l?#Vuzo06-- zWf&BuPN-mTc=c-i{V#t?b{=_JzxI;-{;bRUzqwWJnN}YDaz6j>?JvLH+SPYKKL7X4 z&$IXM&%Juy>RH9BK(B&AhK47K9~m01O#OZ5zKx=iueEGr4-_T6@KYQ!X%~r2w zscY43TKY&mTC46;%ihOHm*?5e{`!7f>;9wvD&l&U%S>hwXJ_ze1MRM5Xju6)zvkS& z=Zik`FTY*4HSO+^{BQMt{>O+^CS5*u=ceqJ&Q-VK*K+>(AO832>}_w~TSR@{oNoX7 zs+3^l_tpJ&zpvi$w~6A^<71d$(^J9VpjBP+cA2SC(U+7bIjc{n_my_6seHH7{dtf> z-q-y9=k%27E$*5OMXi`ZwoNsm^Aw3smG7 zCfxdDZfAb8qs8cambdTODWBKes{2-RR$lMato_y5ufBJ5l*E^IotWh=H}jjxuK&MZ zuip3nwp!&PP-tE2D3MwF^WW>Qi96lv|1Qflt?sj8&i0r$p>OeT?d@l^-g4^Z6+g|N zo#K7ef7^}g9iRF4-?b^^t+nZ9W?0dGgqb1e&XUb*qy9br$2W1ljr7J3$_uu?`#Q_M zW6jUq&ywq{-(LFs?^nFs)S2Nc;&Xl-KH7Ec@O;_o?cc)JUzhv6;+?uuQQ`l3dHMF2 zYkx2QE1Ohb{Kj^F)%VT+-=F0Yd_M2LiUhYhti|B%GzoviAG=Z`Nh1qbbbE4;=)sF9w#}!J%4ZQ-?3 zt-Jk?Z)RnP%aMQ29!4GiQGM<2b53n%E55g#5{;E5XTO=xpHb6z%I8ow_Zjoz|L-4U zxXl53Gj=V5!dJ_AYbPxBeOw(~I_FPwN6yU$GoI{y7r$@c&c}=XJb6E>-t=gM`|+d8 z`npfmzs=s3^XusU(6=)xVW`~*5+9Ufqt!CYn4%o74aj1w@_4~Iv z-;XLR?YtGy)3WAb)?$q*(;~OIxoSsT+FWRz_)ajdNmEcxIc(ul+jopQ)Pne?<%#g>)LMnYo1&kTW8I1 zpwHkqGlS2LoSUA40KRkTQb85QQT_vNR z4;mM3znw7sJ|Dvbb{2jHgZ9b#dli-T|9&BF$K6q(|NrZ?0`|AI0%XQb$V^8o^#Awi z(e`^Jc2s=Z*?qq1zQr4{iTCgF`E;FF{Wn(qbDiTAz5TKb3CArSGcu%I{Br&7u`PX* z?f(_tihL|R_Y3d7SE8I-mhL@WQFh1v|I-T(R>$p>{qbR&ndUunJ^tJ|4n>!?|8V>- zeZJ~x`K|Wt%<}j6PHYBA{grq9>{IshEdzt~mm`ml_Y3py`TubG|F8S^#2vWCz|hrK z7(U_JL7O>dj0`uf*8e(h4zizt!NIZ#)M#XQ$^jm7pOPG^&2V7as$F$IQ^OZZGcp+1 zo&%4`2lPDv^)t|wE0Zl*{pjQ4=KOzvj=%hP5E$6KwD6|NLBfkQvli40#Zw z4Wds8f)_VyxPJig7RZ2Q8;V#!i(nb>OTN`CVP;@(eRXO5zvuPxJ7<4h|Nr;0h=$NPKX7x(`PH?99B{=4|c-THrzKkZ$=s4`!O;lQ39SHO)%qAVld znS)LzB-~hytqec^UjJ{y&Hcxw?VG6nU+cMezi#bi`yczwe_vNV|7XF*ZC204*%@Z= z9b{&B^ZMEUUw_m8e}8TNyZh{=qw()*H>qq7zxO%iWO@A`@BhaqZu$S~eEpw#{eLes zo7fp{oD%Mrx7RC?W?*3bd^!HkKc!FlpPn4NTYb7ds_Nd)z2E;myLz|Uoxwpcp^u&6 z#;xl5&#yk8dwKrPwheC3`$NP7#MOUoPXo^ih*H`QUwEp*(v{T z3Z)DTlLTxS7&70OfR()lMa|2n^FVeqh=A-^R&-Ks2_J)l6^IkI=`@IQKn-L|ZptjM zva=vPw{P2l4TuIAZL}#AZ1gtg4-5<`TD4$~kpqa6m<-{32IX1qyKD>%C;xmA-@d=& zPj|-zD+UHhkp7~Nm*ek<2?nt$7MyS1dGvX7oL)jRD8ogZ7k8Fdw|_!$W)!qxxZ!if{?D~y=6{A; z*ViB2zvdOMQO>cPdr}j&Ewb6SPf0Q_7`>+^o`nKQZazw)@>4k(^% zYNo+(gX17`!_hT-XJg~amqxo>Z*Gi;e{k`qezt9EUevt`S>AWe$KszeRaH!8ioN=K z>NcmFujN;KvAQOgxp6~B$Kj{Ge_kZ)oMq0&u)^g7LxSdM<-fZ+OulR{zankFGFNW) zzH9$iELeNWeEV|c!c_;$O`hz&DSjdUXMdH|BhLemv-iIW{_!s>e*daP$q8>=ysp^S zY&3uNYTfIX0kan~FmxFnXKt8!rp|U{XUFa6{ogik`Za4FBlp~QH!}7=SKZ#xlHOH& ziIw5NJ&VVT2fSACg>#hkuuQ5%1{omHg+I~;nI*(Vy zDP?s}sxk}&gato>7M%7it>64~!vA|~<819p55CTOZFMVTe;J4UEBSplv~!)$9=Dsj zoYL+5(BT37$w`u|(X$@S9$duQg%ol;&> zd3Sy6%CiZF&YRulW|&~x#LnQo^20VS0|DtbGd1oP)mUD)|1(WYc>V5$q0dTeWoGPJ zar$ZF)`{6C?C)Hc7B1Wob$4o#jrz8SmP()hO}n_Dqv9@a-ptEi53ZZtoOv&|a>?Ik z3#QGOy-|ecMRV-0lT5KIQf6 zZ+`r}hSeq&-tX|4PjKe${bs(09%sLckiNdoR{i82F#$pM=;yZtwyoLs zt?2u)<-FgIx!hT=dc1R0*R#C#j&->^YF)CE-Hu<`8eyR`jU+&WnRP_ZDMqF{_s~W z{&S_|jSY+P0&mry&|YM_!#Y}+zwww>%01@D`_q-buT9>PczgNE+i?sD(JcH7V%ztx zJZ*bpY4<-3Em28-l^Nf+`>=wt$n!A$mxj}dPHhyuC%p3Wyw5B4+)@Gpd{1>Ob)u*XPr~gb;D|7|LAE+X5SoOozUHx2X&b-i`?y@cJ+)B~C z0md~^h5>i4+n ze7o>&o4Iyo`nk8KO}R-fb#^`HC2 zuXXFn?zj9>ci3IyqxJ^gwVHQMc-?`J9p9ft%O8DTC3x+~)mPIF?E0E+yYE=rfs75` zpGEII_E+1b#CAnz$L|`x<8M;$7VT20=zHXK zp7g5RNiVe8<~rvhUsMxtXpz zXI_6Kc`{b=|H(@+3Sw8>n&neXmn&^vtE{A?zTRYhwL#%p@B6RPUP(W#u4ZI#ahdny zqW`_>eNUe{nKLsalq%kLhT*WMnHe@z z2jzV>&(<;C`ZFh=p~1Car6@x}ctu>1w*!9}uY|Fli;AIb^68uR7#OlaZJRRp+P6;^ zo_aX%!klI6@BKdi@YAmN-9=Y|L(goNXJmN7dXSl6L-eUtT2^djJD%w?99S~rF{tXN zUYnl$-T(qn*-Zu4FFsfs zkfJHk!MZ!|T;%uJ)>dYqWb)c!$}bllM517>3=veY4N42NwVw0 z%9oyqao}fP_KS)CR@9%b0tm{o4G|#rL<~+q1vcWJPDk;j2{} zf?P^$B{=TBU9%xT-9F%D>5`ut#Ws6?_jA!-zx$x>NBxXk6N}`R7q%|UisjF$ia#CX zT)#P#UnI|5XX9N9-FgnWqw25Z<*&FzN$andQ-A$p&b~`VqVHtoe{THhmf7jQe)qw( z?98os=kjKO>cy>(Q$E`6zW03fmIvZD+LCJB-EZadWop&o)69yKMb_&? zjtRCrF|Lr^SNXqq@j-`-BSD-&fj0IX5M=5 z?fhI#x%gst_g7(J7v){KuW5vuiE01t-}^{l;)kB6yGo>vUElV5&-zUlbQ_I88U^2X z7Ejy%MD6OE>yu}7e0SOW_42b%O?pawlkNTNVuBv#icY+7n4L9iN>=vm^0luv{aTzG zC;0Z@-J49?e0txutC~qKe=2!!@r^TfvxEiTUp{_K{n@6&?5-+*E?y6lo^(xqug#S^ ziS5bvJdTIvHv8I_)76MA-_~G^Tnon7w^A4>d&<2(-hvU`|ns#0LRM#g^T zhl#oy*G!gsBl>aIdH#rklPxNz`Ar2aHH_Zp^RLyto7OzFKJ2;8jb|-!wQrx+?Yy>> zzwE9|&wB1h886mt{#5yUIsXoqL${iDZ#F$y{iaoN;*Y1BuC29|J(g+h{6WJjbDjN4 zs{qZU>8Z{+nop#8yF6AOUzPmv#b5S=4moc(Zu|1#^3N4p^*hY{-fS_um9ea}_U+Y$ zQIT&CU%dJA;k=6rmVMtUzr!Zs=a;4Y+g>R3wS{f(IPFQ_FmQN$hBIpGxkZvKT5Z>DtjL_UGB}+A5v35RWtYeL$`b`DePXe zYEklnzsO~d#T`o2moHhUudg8K;D`t#O^= zbi`-(XYZoxHXT3s>Fe!Vmn#pcUW-}o=Q8Q~H_a07GGCiglP~k%eY{$+>RYu{R&|?{ zw9BE!i`sSC-#={nb!%SZx7G1d^|PvLM2}@0k=yfq`!?=#GH)*7e6dmcLp#`QFM6V%0wq?iv=IHkf8vbaKvp^XDroJvc}j280LS!}?;0~WgOEd5Er@i!H!3{s1NY6Oz67tfkzYF4<^oBy^! zX~&v#$G2)F&s64Q4|-oK&CQ;aSSa&q&Bo(y{r=1wzA!93bX)77gICwKPYx-SOYX1J z=E&bPXX0MHcm3%G)<@5=9Luymv^321_zoS%_n*(M|9d9wwdk$Z+MwfazD)hrdEuA$ zsz>4N-M6#PzW(>!d~NKs2|q61Pykn9zpv`A-Er}9&Woo%R&j>OFE|n&`F6hFu2os3 z8F?pvSFV@+tzY6@HhE)Q)+yFS$1cT*`ObKG#xMTmrtCK&iF39Y&-tifCl{aWoM0j$ zQR`i9vV&i3T7Sli?N3-5ehS{d<18pR^RjD?HN&4UmnRpzxB7cjLvpuf|<8EV=dj<=$xdm#ej3SwY4VlF!EFMu(a{Z{xeOS8f*1 zk#@C5r6zkGWp4Yn=w#vV*=&B(e;>Ftd{m9+E^8L?g)4A`0wmC3N`*ife@mu-#{A^PC zP{vv}f0f~{&H3Yhzb5!aSjzMB`~TOL*T(Yg&)Ahzyv}55ZI*fL(nD=&&gmyhw!U9d z5G^`8Vb`jo$L>bI*&=`X@%E{6Z(3FSc{w}3uHZ+?!sv-}?eEOL^Uw3;jCD8WX#1wl zzvUaga>K&nq+MRB_0qR+7*V(qv=Ib8{7XVR3~k_;+B(09>|%Vjb^Wi3m#>$5y*}mj z$i8EpihF}z>&{ec5#n^!s~4Dk^Xaj7A2@>3-`V_3rooa;j9i>o@t>hez-G_~g+G1}$ydCl#A-Mn2ap zJT`x`#ShOXf2~*k7i~>ieXD$-clU{X=K2-4Pr0}pW4Eh*?iZ(hV&bktz488ny(N3C zqgkqrpGNQbRT28hSoz}7`1>>DDrda6GFr6a#@2sx{BB)$nI~vdRJ7vNuk&+1u9uJO zba7pBBr@!gj`q$6h1b;I&RrcH_aa|QFtW2{Uw4Ov?NYz<6aR6m9^EK@+UMBOt`3=^ zn5w@XcbCo23f`FekaOFs=PTb_W;9y!rQ+(>vd5X)6IWQA_FA%L%i6tHG+mA4&U#MU z>b|J^F}KpwrKPD$bKfp4eH!&V;Nz2ZZ&R)=vkT=Y^=)@V(EXgw(OmU z#;4a0ZYjZH{ug%n2D+jTu(>ydjy}MQX=s4f&TiLVT&G>AP_-^ZQ^Ie}KGQVEf{!C(O z+U2F;Z>v9ttUU3kV#Stoo4wDT*`LGB|99VJ3IE7+{nK-Au=;npD8IiqL-&Ga-`ta1 zZsfb${je!b7ro!!p0w;v|4iP4%F%t^ZqMaB%NM*(eDimSY*_H-k7qnCr9Zg+J>TV3 z-8++$*F(jQc3H&bYjw6LO}C#h*D~&NXXXB-E;%t3O>2KuYW*&0$kEzse0S%&10P<6 zP21bf-#H_H!=}l%Qr)6^Or~0#_L?VX=*)k9mG|+`?SD3`^*P4A?0Dba8PAwhicc&p z@IFzcuC~c2-m};LV|_UrkcsknydNAze4P2m&co9_v_4)rxkCC-i(O;O{=d&eF~~BdAfR!smIco zuF^gCLX<9^=(YZI#;{a3_{=t2o7IPU)!UWc&(4d_z40*2Y@K?KUf--OHJcSHQkK7r zSlQw7PA{#XBYXX3AD4Z*_ixm$7w_zv@i6O9PM4^l;p-dPt-0L(8$#{Y9Z!FvF{wgK)!?8C#CyZZ3EsM~L-g&3;^lSg*Rzl3tAIf@v@a$f6mPxhk0wS9{Ou@|Ec);yDLoo)!GYbZsJ}n zdi7n!=QW2ll{RfZ7p%0&$nI1Bdy#(@yJjWvhtB;d@>8)O)ppOClv3X%m#q4OZ-pOY zx6@ztRQOZ;596n*NAE|g>fIIcr=Rt3lDfxm>wM|IPb(Q zhd_RRsTBJ^Wlx&VKYi0JZljuewr|nQwso%-?=4LG_HmZ~E$_L$=awyG`c`oD_r_Jm zuGL?T?BbBK)L8lXUA28-==ZrdU3&7Yem`n;`ERCnec8{iKT_^^e3Y@f>6LagY64Q) za$ef!ZEqi>E+l!e>+hEHW<_^S8S^K<-}C$KZ1Fw0sY}zNzV*&XzA`CsquY`#mjZI! z=RcjeyIb65X;55HZeOzY$xYfdkC%FtD>X0ox_#=*rnFeS=*nErV|OzYAMFc&!8YUc z_QmDlE=MZYY_Yl=f3y0>g=6z`j3l?;coMM2^v1RiEYV*-hkSdhBMn91&6iv--(@KB6!P$y}#)8sjIqv#rjG)Q7rvANAF2ShzO=n{{Ab{ z{p+rS*Y+KLJwK~v2B@f=G%tBo>+MY%*P@VYU!%3v@0GyBoUHrbpS6nX$;R6+>x`Gx zdtBcAaqHii zS@-=0C@#hSy=ygI_+Dw#^-P@*@n3s0^?J_jiI})-+N@tif`W#8b5z2d<2&{mr))dF z4JqvuF7-|Czalx^OaAx6ue{|`qB}~&PG7m5lM?lN`*(4#TetSk-{P&ZMM7}mr=Z9C zm68_u&GVhUZHf+;{>tp{b(i)fo$-#FJ7tfNU4V~wRH|P0p=5KnIi`^Y(90(pJ2Zge%w3WK6F+@pt(@2%zu?n`&L?2Zj-)cWTgG)_V@gZ?|aV~ANP7~ z^nxTOD%a!p?t-c4|%ilbdn*>b}W`azk@Ib=XRZ<_!B literal 0 HcmV?d00001 diff --git a/ray_tracing_advanced_compilation/images/single_threaded_compilation.png b/ray_tracing_advanced_compilation/images/single_threaded_compilation.png new file mode 100644 index 0000000000000000000000000000000000000000..b01fc655899c1bad95295525e99e7d7f870bd58a GIT binary patch literal 6779 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 a_@B{6uJ^Mevuhn_j>gl~&t;ucLK6UF>NI-* literal 0 HcmV?d00001 diff --git a/ray_tracing_advanced_compilation/main.cpp b/ray_tracing_advanced_compilation/main.cpp new file mode 100644 index 0000000..d0e1e8a --- /dev/null +++ b/ray_tracing_advanced_compilation/main.cpp @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + + +// ImGui - standalone example application for Glfw + Vulkan, using programmable +// pipeline If you are new to ImGui, see examples/README.txt and documentation +// at the top of imgui.cpp. + +#include + +#include "backends/imgui_impl_glfw.h" +#include "imgui.h" + +#include "hello_vulkan.h" +#include "imgui/imgui_camera_widget.h" +#include "nvh/cameramanipulator.hpp" +#include "nvh/fileoperations.hpp" +#include "nvpsystem.hpp" +#include "nvvk/commands_vk.hpp" +#include "nvvk/context_vk.hpp" + + +////////////////////////////////////////////////////////////////////////// +#define UNUSED(x) (void)(x) +////////////////////////////////////////////////////////////////////////// + +// Default search path for shaders +std::vector defaultSearchPaths; + + +// GLFW Callback functions +static void onErrorCallback(int error, const char* description) +{ + fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} + +// Extra UI +void renderUI(HelloVulkan& helloVk) +{ + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) + { + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); + } + + // Specialization + ImGui::SliderInt("Specialization", &helloVk.m_pushConstant.specialization, 0, 7); + int s = helloVk.m_pushConstant.specialization; + int a = ((s >> 2) % 2) == 1; + int b = ((s >> 1) % 2) == 1; + int c = ((s >> 0) % 2) == 1; + ImGui::Checkbox("Use Diffuse", (bool*)&a); + ImGui::Checkbox("Use Specular", (bool*)&b); + ImGui::Checkbox("Trace shadow", (bool*)&c); + helloVk.m_pushConstant.specialization = (a << 2) + (b << 1) + c; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +static int const SAMPLE_WIDTH = 1280; +static int const SAMPLE_HEIGHT = 720; + + +//-------------------------------------------------------------------------------------------------- +// Application Entry +// +int main(int argc, char** argv) +{ + UNUSED(argc); + + // Setup GLFW window + glfwSetErrorCallback(onErrorCallback); + if(!glfwInit()) + { + return 1; + } + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + GLFWwindow* window = glfwCreateWindow(SAMPLE_WIDTH, SAMPLE_HEIGHT, PROJECT_NAME, nullptr, nullptr); + + // Setup camera + CameraManip.setWindowSize(SAMPLE_WIDTH, SAMPLE_HEIGHT); + CameraManip.setLookat(nvmath::vec3f(5, 4, -4), nvmath::vec3f(0, 1, 0), nvmath::vec3f(0, 1, 0)); + + // Setup Vulkan + if(!glfwVulkanSupported()) + { + printf("GLFW: Vulkan Not Supported\n"); + return 1; + } + + // setup some basic things for the sample, logging file for example + NVPSystem system(PROJECT_NAME); + + // Search path for shaders and other media + defaultSearchPaths = { + NVPSystem::exePath() + PROJECT_RELDIRECTORY, + NVPSystem::exePath() + PROJECT_RELDIRECTORY "..", + std::string(PROJECT_NAME), + }; + + // Requesting Vulkan extensions and layers + nvvk::ContextCreateInfo contextInfo; + contextInfo.setVersion(1, 2); + contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); + contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); +#ifdef _WIN32 + contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); +#else + contextInfo.addInstanceExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME); +#endif + contextInfo.addInstanceExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); + + // #VKRay: Activate the ray tracing extension + VkPhysicalDeviceAccelerationStructureFeaturesKHR accelFeature{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR}; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, &accelFeature); + VkPhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR}; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, &rtPipelineFeature); + contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + + // Creating Vulkan base application + nvvk::Context vkctx{}; + vkctx.initInstance(contextInfo); + // Find all compatible devices + auto compatibleDevices = vkctx.getCompatibleDevices(contextInfo); + assert(!compatibleDevices.empty()); + // Use a compatible device + vkctx.initDevice(compatibleDevices[0], contextInfo); + + // Create example + HelloVulkan helloVk; + + // Window need to be opened to get the surface on which to draw + const VkSurfaceKHR surface = helloVk.getVkSurface(vkctx.m_instance, window); + vkctx.setGCTQueueWithPresent(surface); + + helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createDepthBuffer(); + helloVk.createRenderPass(); + helloVk.createFrameBuffers(); + + // Setup Imgui + helloVk.initGUI(0); // Using sub-pass 0 + + // Creation of the example + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); + + + helloVk.createOffscreenRender(); + helloVk.createDescriptorSetLayout(); + helloVk.createGraphicsPipeline(); + helloVk.createUniformBuffer(); + helloVk.createSceneDescriptionBuffer(); + helloVk.updateDescriptorSet(); + + // #VKRay + helloVk.initRayTracing(); + helloVk.createBottomLevelAS(); + helloVk.createTopLevelAS(); + helloVk.createRtDescriptorSet(); + helloVk.createRtPipeline(); + + helloVk.createPostDescriptor(); + helloVk.createPostPipeline(); + helloVk.updatePostDescriptorSet(); + + + nvmath::vec4f clearColor = nvmath::vec4f(1, 1, 1, 1.00f); + bool useRaytracer = true; + + + helloVk.setupGlfwCallbacks(window); + ImGui_ImplGlfw_InitForVulkan(window, true); + + // Main loop + while(!glfwWindowShouldClose(window)) + { + glfwPollEvents(); + if(helloVk.isMinimized()) + continue; + + // Start the Dear ImGui frame + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + + // Show UI window. + if(helloVk.showGui()) + { + ImGuiH::Panel::Begin(); + ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); + ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing + + renderUI(helloVk); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); + } + + // Start rendering the scene + helloVk.prepareFrame(); + + // Start command buffer of this frame + auto curFrame = helloVk.getCurFrame(); + const VkCommandBuffer& cmdBuf = helloVk.getCommandBuffers()[curFrame]; + + VkCommandBufferBeginInfo beginInfo{VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO}; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + vkBeginCommandBuffer(cmdBuf, &beginInfo); + + // Updating camera buffer + helloVk.updateUniformBuffer(cmdBuf); + + // Clearing screen + std::array clearValues{}; + clearValues[0].color = {{clearColor[0], clearColor[1], clearColor[2], clearColor[3]}}; + clearValues[1].depthStencil = {1.0f, 0}; + + // Offscreen render pass + { + VkRenderPassBeginInfo offscreenRenderPassBeginInfo{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO}; + offscreenRenderPassBeginInfo.clearValueCount = 2; + offscreenRenderPassBeginInfo.pClearValues = clearValues.data(); + offscreenRenderPassBeginInfo.renderPass = helloVk.m_offscreenRenderPass; + offscreenRenderPassBeginInfo.framebuffer = helloVk.m_offscreenFramebuffer; + offscreenRenderPassBeginInfo.renderArea = {{0, 0}, helloVk.getSize()}; + + // Rendering Scene + if(useRaytracer) + { + helloVk.raytrace(cmdBuf, clearColor); + } + else + { + vkCmdBeginRenderPass(cmdBuf, &offscreenRenderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + helloVk.rasterize(cmdBuf); + vkCmdEndRenderPass(cmdBuf); + } + } + + // 2nd rendering pass: tone mapper, UI + { + VkRenderPassBeginInfo postRenderPassBeginInfo{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO}; + postRenderPassBeginInfo.clearValueCount = 2; + postRenderPassBeginInfo.pClearValues = clearValues.data(); + postRenderPassBeginInfo.renderPass = helloVk.getRenderPass(); + postRenderPassBeginInfo.framebuffer = helloVk.getFramebuffers()[curFrame]; + postRenderPassBeginInfo.renderArea = {{0, 0}, helloVk.getSize()}; + + // Rendering tonemapper + vkCmdBeginRenderPass(cmdBuf, &postRenderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + helloVk.drawPost(cmdBuf); + // Rendering UI + ImGui::Render(); + ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cmdBuf); + vkCmdEndRenderPass(cmdBuf); + } + + // Submit for display + vkEndCommandBuffer(cmdBuf); + helloVk.submitFrame(); + } + + // Cleanup + vkDeviceWaitIdle(helloVk.getDevice()); + + helloVk.destroyResources(); + helloVk.destroy(); + vkctx.deinit(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/ray_tracing_advanced_compilation/shaders/frag_shader.frag b/ray_tracing_advanced_compilation/shaders/frag_shader.frag new file mode 100644 index 0000000..425c866 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/frag_shader.frag @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 450 +#extension GL_ARB_separate_shader_objects : enable +#extension GL_EXT_nonuniform_qualifier : enable +#extension GL_GOOGLE_include_directive : enable +#extension GL_EXT_scalar_block_layout : enable + +#include "wavefront.glsl" + + +layout(push_constant) uniform shaderInformation +{ + vec3 lightPosition; + uint instanceId; + float lightIntensity; + int lightType; +} +pushC; + +// clang-format off +// Incoming +//layout(location = 0) flat in int matIndex; +layout(location = 1) in vec2 fragTexCoord; +layout(location = 2) in vec3 fragNormal; +layout(location = 3) in vec3 viewDir; +layout(location = 4) in vec3 worldPos; +// Outgoing +layout(location = 0) out vec4 outColor; +// Buffers +layout(binding = 1, scalar) buffer MatColorBufferObject { WaveFrontMaterial m[]; } materials[]; +layout(binding = 2, scalar) buffer ScnDesc { sceneDesc i[]; } scnDesc; +layout(binding = 3) uniform sampler2D[] textureSamplers; +layout(binding = 4, scalar) buffer MatIndex { int i[]; } matIdx[]; + +// clang-format on + + +void main() +{ + // Object of this instance + int objId = scnDesc.i[pushC.instanceId].objId; + + // Material of the object + int matIndex = matIdx[nonuniformEXT(objId)].i[gl_PrimitiveID]; + WaveFrontMaterial mat = materials[nonuniformEXT(objId)].m[matIndex]; + + vec3 N = normalize(fragNormal); + + // Vector toward light + vec3 L; + float lightIntensity = pushC.lightIntensity; + if(pushC.lightType == 0) + { + vec3 lDir = pushC.lightPosition - worldPos; + float d = length(lDir); + lightIntensity = pushC.lightIntensity / (d * d); + L = normalize(lDir); + } + else + { + L = normalize(pushC.lightPosition - vec3(0)); + } + + + // Diffuse + vec3 diffuse = computeDiffuse(mat, L, N); + if(mat.textureId >= 0) + { + int txtOffset = scnDesc.i[pushC.instanceId].txtOffset; + uint txtId = txtOffset + mat.textureId; + vec3 diffuseTxt = texture(textureSamplers[nonuniformEXT(txtId)], fragTexCoord).xyz; + diffuse *= diffuseTxt; + } + + // Specular + vec3 specular = computeSpecular(mat, viewDir, L, N); + + // Result + outColor = vec4(lightIntensity * (diffuse + specular), 1); +} diff --git a/ray_tracing_advanced_compilation/shaders/passthrough.vert b/ray_tracing_advanced_compilation/shaders/passthrough.vert new file mode 100644 index 0000000..ed293b8 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/passthrough.vert @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 450 +layout (location = 0) out vec2 outUV; + + +out gl_PerVertex +{ + vec4 gl_Position; +}; + + +void main() +{ + outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); + gl_Position = vec4(outUV * 2.0f - 1.0f, 1.0f, 1.0f); +} diff --git a/ray_tracing_advanced_compilation/shaders/post.frag b/ray_tracing_advanced_compilation/shaders/post.frag new file mode 100644 index 0000000..847481c --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/post.frag @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 450 +layout(location = 0) in vec2 outUV; +layout(location = 0) out vec4 fragColor; + +layout(set = 0, binding = 0) uniform sampler2D noisyTxt; + +layout(push_constant) uniform shaderInformation +{ + float aspectRatio; +} +pushc; + +void main() +{ + vec2 uv = outUV; + float gamma = 1. / 2.2; + fragColor = pow(texture(noisyTxt, uv).rgba, vec4(gamma)); +} diff --git a/ray_tracing_advanced_compilation/shaders/raycommon.glsl b/ray_tracing_advanced_compilation/shaders/raycommon.glsl new file mode 100644 index 0000000..b896c84 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/raycommon.glsl @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +struct hitPayload +{ + vec3 hitValue; +}; diff --git a/ray_tracing_advanced_compilation/shaders/raytrace.rchit b/ray_tracing_advanced_compilation/shaders/raytrace.rchit new file mode 100644 index 0000000..e4ad9d0 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/raytrace.rchit @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 460 +#extension GL_EXT_ray_tracing : require +#extension GL_EXT_nonuniform_qualifier : enable +#extension GL_EXT_scalar_block_layout : enable +#extension GL_GOOGLE_include_directive : enable +#include "raycommon.glsl" +#include "wavefront.glsl" + +hitAttributeEXT vec2 attribs; + +// clang-format off +layout(location = 0) rayPayloadInEXT hitPayload prd; +layout(location = 1) rayPayloadEXT bool isShadowed; + +layout(binding = 0, set = 0) uniform accelerationStructureEXT topLevelAS; +layout(binding = 1, set = 1, scalar) buffer MatColorBufferObject { WaveFrontMaterial m[]; } materials[]; +layout(binding = 2, set = 1, scalar) buffer ScnDesc { sceneDesc i[]; } scnDesc; +layout(binding = 3, set = 1) uniform sampler2D textureSamplers[]; +layout(binding = 4, set = 1) buffer MatIndexColorBuffer { int i[]; } matIndex[]; +layout(binding = 5, set = 1, scalar) buffer Vertices { Vertex v[]; } vertices[]; +layout(binding = 6, set = 1) buffer Indices { uint i[]; } indices[]; + + +layout(constant_id = 0) const int USE_DIFFUSE = 1; +layout(constant_id = 1) const int USE_SPECULAR = 1; +layout(constant_id = 2) const int TRACE_SHADOW = 1; + +// clang-format on + +layout(push_constant) uniform Constants +{ + vec4 clearColor; + vec3 lightPosition; + float lightIntensity; + int lightType; + int specialization; +} +pushC; + + +void main() +{ + // Object of this instance + uint objId = scnDesc.i[gl_InstanceCustomIndexEXT].objId; + + // Indices of the triangle + ivec3 ind = ivec3(indices[nonuniformEXT(objId)].i[3 * gl_PrimitiveID + 0], // + indices[nonuniformEXT(objId)].i[3 * gl_PrimitiveID + 1], // + indices[nonuniformEXT(objId)].i[3 * gl_PrimitiveID + 2]); // + // Vertex of the triangle + Vertex v0 = vertices[nonuniformEXT(objId)].v[ind.x]; + Vertex v1 = vertices[nonuniformEXT(objId)].v[ind.y]; + Vertex v2 = vertices[nonuniformEXT(objId)].v[ind.z]; + + const vec3 barycentrics = vec3(1.0 - attribs.x - attribs.y, attribs.x, attribs.y); + + // Computing the normal at hit position + vec3 normal = v0.nrm * barycentrics.x + v1.nrm * barycentrics.y + v2.nrm * barycentrics.z; + // Transforming the normal to world space + normal = normalize(vec3(scnDesc.i[gl_InstanceCustomIndexEXT].transfoIT * vec4(normal, 0.0))); + + + // Computing the coordinates of the hit position + vec3 worldPos = v0.pos * barycentrics.x + v1.pos * barycentrics.y + v2.pos * barycentrics.z; + // Transforming the position to world space + worldPos = vec3(scnDesc.i[gl_InstanceCustomIndexEXT].transfo * vec4(worldPos, 1.0)); + + // Vector toward the light + vec3 L; + float lightIntensity = pushC.lightIntensity; + float lightDistance = 100000.0; + // Point light + if(pushC.lightType == 0) + { + vec3 lDir = pushC.lightPosition - worldPos; + lightDistance = length(lDir); + lightIntensity = pushC.lightIntensity / (lightDistance * lightDistance); + L = normalize(lDir); + } + else // Directional light + { + L = normalize(pushC.lightPosition - vec3(0)); + } + + // Material of the object + int matIdx = matIndex[nonuniformEXT(objId)].i[gl_PrimitiveID]; + WaveFrontMaterial mat = materials[nonuniformEXT(objId)].m[matIdx]; + + + // Diffuse + vec3 diffuse = vec3(0); + if(USE_DIFFUSE == 1) + { + diffuse = computeDiffuse(mat, L, normal); + if(mat.textureId >= 0) + { + uint txtId = mat.textureId + scnDesc.i[gl_InstanceCustomIndexEXT].txtOffset; + vec2 texCoord = v0.texCoord * barycentrics.x + v1.texCoord * barycentrics.y + + v2.texCoord * barycentrics.z; + diffuse *= texture(textureSamplers[nonuniformEXT(txtId)], texCoord).xyz; + } + } + + vec3 specular = vec3(0); + float attenuation = 1; + + // Tracing shadow ray only if the light is visible from the surface + if(dot(normal, L) > 0) + { + if(TRACE_SHADOW == 1) + { + float tMin = 0.001; + float tMax = lightDistance; + vec3 origin = gl_WorldRayOriginEXT + gl_WorldRayDirectionEXT * gl_HitTEXT; + vec3 rayDir = L; + uint flags = gl_RayFlagsTerminateOnFirstHitEXT | gl_RayFlagsOpaqueEXT + | gl_RayFlagsSkipClosestHitShaderEXT; + isShadowed = true; + traceRayEXT(topLevelAS, // acceleration structure + flags, // rayFlags + 0xFF, // cullMask + 0, // sbtRecordOffset + 0, // sbtRecordStride + 1, // missIndex + origin, // ray origin + tMin, // ray min range + rayDir, // ray direction + tMax, // ray max range + 1 // payload (location = 1) + ); + } + else + isShadowed = false; + + if(isShadowed) + { + attenuation = 0.3; + } + else + { + // Specular + if(USE_SPECULAR == 1) + { + specular = computeSpecular(mat, gl_WorldRayDirectionEXT, L, normal); + } + } + } + + prd.hitValue = vec3(lightIntensity * attenuation * (diffuse + specular)); +} diff --git a/ray_tracing_advanced_compilation/shaders/raytrace.rgen b/ray_tracing_advanced_compilation/shaders/raytrace.rgen new file mode 100644 index 0000000..655e6d0 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/raytrace.rgen @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 460 +#extension GL_EXT_ray_tracing : require +#extension GL_GOOGLE_include_directive : enable +#include "raycommon.glsl" + +layout(binding = 0, set = 0) uniform accelerationStructureEXT topLevelAS; +layout(binding = 1, set = 0, rgba32f) uniform image2D image; + +layout(location = 0) rayPayloadEXT hitPayload prd; + +layout(binding = 0, set = 1) uniform CameraProperties +{ + mat4 view; + mat4 proj; + mat4 viewInverse; + mat4 projInverse; +} +cam; + +layout(push_constant) uniform Constants +{ + vec4 clearColor; + vec3 lightPosition; + float lightIntensity; + int lightType; + int specialization; +} +pushC; + +void main() +{ + const vec2 pixelCenter = vec2(gl_LaunchIDEXT.xy) + vec2(0.5); + const vec2 inUV = pixelCenter / vec2(gl_LaunchSizeEXT.xy); + vec2 d = inUV * 2.0 - 1.0; + + vec4 origin = cam.viewInverse * vec4(0, 0, 0, 1); + vec4 target = cam.projInverse * vec4(d.x, d.y, 1, 1); + vec4 direction = cam.viewInverse * vec4(normalize(target.xyz), 0); + + uint rayFlags = gl_RayFlagsOpaqueEXT; + float tMin = 0.001; + float tMax = 10000.0; + + traceRayEXT(topLevelAS, // acceleration structure + rayFlags, // rayFlags + 0xFF, // cullMask + pushC.specialization, // sbtRecordOffset + 0, // sbtRecordStride + 0, // missIndex + origin.xyz, // ray origin + tMin, // ray min range + direction.xyz, // ray direction + tMax, // ray max range + 0 // payload (location = 0) + ); + + imageStore(image, ivec2(gl_LaunchIDEXT.xy), vec4(prd.hitValue, 1.0)); +} diff --git a/ray_tracing_advanced_compilation/shaders/raytrace.rmiss b/ray_tracing_advanced_compilation/shaders/raytrace.rmiss new file mode 100644 index 0000000..c960eb6 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/raytrace.rmiss @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 460 +#extension GL_EXT_ray_tracing : require +#extension GL_GOOGLE_include_directive : enable +#include "raycommon.glsl" + +layout(location = 0) rayPayloadInEXT hitPayload prd; + +layout(push_constant) uniform Constants +{ + vec4 clearColor; +}; + +void main() +{ + prd.hitValue = clearColor.xyz * 0.8; +} diff --git a/ray_tracing_advanced_compilation/shaders/raytraceShadow.rmiss b/ray_tracing_advanced_compilation/shaders/raytraceShadow.rmiss new file mode 100644 index 0000000..04dd9fc --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/raytraceShadow.rmiss @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 460 +#extension GL_EXT_ray_tracing : require + +layout(location = 1) rayPayloadInEXT bool isShadowed; + +void main() +{ + isShadowed = false; +} diff --git a/ray_tracing_advanced_compilation/shaders/vert_shader.vert b/ray_tracing_advanced_compilation/shaders/vert_shader.vert new file mode 100644 index 0000000..a1c55ba --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/vert_shader.vert @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +#version 450 +#extension GL_ARB_separate_shader_objects : enable +#extension GL_EXT_scalar_block_layout : enable +#extension GL_GOOGLE_include_directive : enable + +#include "wavefront.glsl" + +// clang-format off +layout(binding = 2, set = 0, scalar) buffer ScnDesc { sceneDesc i[]; } scnDesc; +// clang-format on + +layout(binding = 0) uniform UniformBufferObject +{ + mat4 view; + mat4 proj; + mat4 viewI; +} +ubo; + +layout(push_constant) uniform shaderInformation +{ + vec3 lightPosition; + uint instanceId; + float lightIntensity; + int lightType; +} +pushC; + +layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec3 inNormal; +layout(location = 2) in vec3 inColor; +layout(location = 3) in vec2 inTexCoord; + + +//layout(location = 0) flat out int matIndex; +layout(location = 1) out vec2 fragTexCoord; +layout(location = 2) out vec3 fragNormal; +layout(location = 3) out vec3 viewDir; +layout(location = 4) out vec3 worldPos; + +out gl_PerVertex +{ + vec4 gl_Position; +}; + + +void main() +{ + mat4 objMatrix = scnDesc.i[pushC.instanceId].transfo; + mat4 objMatrixIT = scnDesc.i[pushC.instanceId].transfoIT; + + vec3 origin = vec3(ubo.viewI * vec4(0, 0, 0, 1)); + + worldPos = vec3(objMatrix * vec4(inPosition, 1.0)); + viewDir = vec3(worldPos - origin); + fragTexCoord = inTexCoord; + fragNormal = vec3(objMatrixIT * vec4(inNormal, 0.0)); + // matIndex = inMatID; + + gl_Position = ubo.proj * ubo.view * vec4(worldPos, 1.0); +} diff --git a/ray_tracing_advanced_compilation/shaders/wavefront.glsl b/ray_tracing_advanced_compilation/shaders/wavefront.glsl new file mode 100644 index 0000000..b4a58e4 --- /dev/null +++ b/ray_tracing_advanced_compilation/shaders/wavefront.glsl @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-FileCopyrightText: Copyright (c) 2019-2021 NVIDIA CORPORATION + * SPDX-License-Identifier: Apache-2.0 + */ + +struct Vertex +{ + vec3 pos; + vec3 nrm; + vec3 color; + vec2 texCoord; +}; + +struct WaveFrontMaterial +{ + vec3 ambient; + vec3 diffuse; + vec3 specular; + vec3 transmittance; + vec3 emission; + float shininess; + float ior; // index of refraction + float dissolve; // 1 == opaque; 0 == fully transparent + int illum; // illumination model (see http://www.fileformat.info/format/material/) + int textureId; +}; + +struct sceneDesc +{ + int objId; + int txtOffset; + mat4 transfo; + mat4 transfoIT; +}; + + +vec3 computeDiffuse(WaveFrontMaterial mat, vec3 lightDir, vec3 normal) +{ + // Lambertian + float dotNL = max(dot(normal, lightDir), 0.0); + vec3 c = mat.diffuse * dotNL; + if(mat.illum >= 1) + c += mat.ambient; + return c; +} + +vec3 computeSpecular(WaveFrontMaterial mat, vec3 viewDir, vec3 lightDir, vec3 normal) +{ + if(mat.illum < 2) + return vec3(0); + + // Compute specular only if not in shadow + const float kPi = 3.14159265; + const float kShininess = max(mat.shininess, 4.0); + + // Specular + const float kEnergyConservation = (2.0 + kShininess) / (2.0 * kPi); + vec3 V = normalize(-viewDir); + vec3 R = reflect(-lightDir, normal); + float specular = kEnergyConservation * pow(max(dot(V, R), 0.0), kShininess); + + return vec3(mat.specular * specular); +}