Skip to content

Commit

Permalink
Merge branch 'development' into custom_tangent_space
Browse files Browse the repository at this point in the history
  • Loading branch information
johannesugb committed Jul 31, 2024
2 parents 7acd96c + 8db61b6 commit 9b12820
Show file tree
Hide file tree
Showing 109 changed files with 7,521 additions and 5,182 deletions.
18 changes: 10 additions & 8 deletions .github/workflows/cross-platform-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
- 'framework/**'
- 'CMakeLists.txt'
pull_request:
workflow_dispatch:
# workflow_dispatch:

env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
Expand All @@ -18,7 +18,7 @@ env:
jobs:
linux:
name: ${{ matrix.config.name }}, VulkanSDK ${{ matrix.vulkan-sdk }}
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
Expand All @@ -35,7 +35,7 @@ jobs:
}
# note: if a specific vulkan version (e.g. 1.1.x, or < 1.2.135) needs testing, you can add it here:
# (not that ubuntu-latest (20.04) only supports >= v1.2.148 via apt)
vulkan-sdk: ["latest", "1.3.216"]
vulkan-sdk: ["latest", "1.3.243"]

steps:
- name: Checkout repository and submodules
Expand All @@ -49,15 +49,17 @@ jobs:
# We'll use this as our working directory for all subsequent commands
run: |
# Add lunarg apt sources
sudo sed -i -e 's|disco|jammy|g' /etc/apt/sources.list
sudo apt update
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
if [ "${{ matrix.vulkan-sdk }}" = "latest" ]; then
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-focal.list https://packages.lunarg.com/vulkan/lunarg-vulkan-focal.list
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
else
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-${{ matrix.vulkan-sdk }}-focal.list https://packages.lunarg.com/vulkan/${{ matrix.vulkan-sdk }}/lunarg-vulkan-${{ matrix.vulkan-sdk }}-focal.list
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-${{ matrix.vulkan-sdk }}-jammy.list https://packages.lunarg.com/vulkan/${{ matrix.vulkan-sdk }}/lunarg-vulkan-${{ matrix.vulkan-sdk }}-jammy.list
fi
# For GCC-13
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/ppa
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
# Update package lists
sudo apt-get update -qq
Expand Down Expand Up @@ -116,7 +118,7 @@ jobs:
cxx: "cl"
}
# note: if a specific vulkan version needs testing, you can add it here:
vulkan-sdk: ["latest", "1.3.216.0"]
vulkan-sdk: ["latest", "1.3.243.0"]

steps:
# IMPORTANT: apparently checkout@v3 pulls to ${{ github.event.repository.name }}/${{ github.event.repository.name }} instead of just ${{ github.event.repository.name }} on windows
Expand Down Expand Up @@ -177,7 +179,7 @@ jobs:
cxx: "cl"
}
# note: if a specific vulkan version needs testing, you can add it here:
vulkan-sdk: ["latest", "1.3.216.0"]
vulkan-sdk: ["latest", "1.3.243.0"]

steps:
# IMPORTANT: apparently checkout@v3 pulls to ${{ github.event.repository.name }}/${{ github.event.repository.name }} instead of just ${{ github.event.repository.name }} on windows
Expand Down
2 changes: 1 addition & 1 deletion auto_vk
2 changes: 1 addition & 1 deletion auto_vk_toolkit/include/camera.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ namespace avk
float bottom_border() const { return mBottom; }

// sets the projection matrix
camera& set_projection_matrix(const glm::mat4& aMatrix);
camera& set_projection_matrix(const glm::mat4& aMatrix, avk::projection_type aProjectionType = avk::projection_type::unknown);
// Constructs and sets a perspective projection matrix with the given parameters
camera& set_perspective_projection(float aFov, float aAspect, float aNear, float aFar);
// Constructs and sets an orthographic projection matrix with the given parameters
Expand Down
4 changes: 2 additions & 2 deletions auto_vk_toolkit/src/camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ namespace avk
, mBottom{ 0 }
{}

camera& camera::set_projection_matrix(const glm::mat4& aMatrix)
camera& camera::set_projection_matrix(const glm::mat4& aMatrix, avk::projection_type aProjectionType)
{
mProjectionType = projection_type::unknown;
mProjectionType = aProjectionType;
mProjectionMatrix = aMatrix;
return *this;
}
Expand Down
4 changes: 3 additions & 1 deletion auto_vk_toolkit/src/context_vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,9 @@ namespace avk
void context_vulkan::check_vk_result(VkResult err)
{
const auto& inst = context().vulkan_instance();
#if VK_HEADER_VERSION >= 216
#if VK_HEADER_VERSION >= 290
vk::detail::createResultValueType(static_cast<vk::Result>(err), "check_vk_result");
#elif VK_HEADER_VERSION >= 216
vk::createResultValueType(static_cast<vk::Result>(err), "check_vk_result");
#else
createResultValue(static_cast<vk::Result>(err), inst, "check_vk_result");
Expand Down
8 changes: 4 additions & 4 deletions cmake/assimp.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ if(UNIX)
endif()
endif (NOT assimp_FOUND OR avk_toolkit_ForceAssimpBuild)
else()
set(avk_toolkit_AssimpReleaseDLLPath "${PROJECT_SOURCE_DIR}/external/release/bin/x64/assimp-vc140-mt.dll")
set(avk_toolkit_AssimpDebugDLLPath "${PROJECT_SOURCE_DIR}/external/debug/bin/x64/assimp-vc140-mt.dll")
set(avk_toolkit_AssimpReleaseLIBPath "${PROJECT_SOURCE_DIR}/external/release/lib/x64/assimp-vc140-mt.lib")
set(avk_toolkit_AssimpDebugLIBPath "${PROJECT_SOURCE_DIR}/external/debug/lib/x64/assimp-vc140-mt.lib")
set(avk_toolkit_AssimpReleaseDLLPath "${PROJECT_SOURCE_DIR}/external/release/bin/x64/assimp-vc143-mt.dll")
set(avk_toolkit_AssimpDebugDLLPath "${PROJECT_SOURCE_DIR}/external/debug/bin/x64/assimp-vc143-mt.dll")
set(avk_toolkit_AssimpReleaseLIBPath "${PROJECT_SOURCE_DIR}/external/release/lib/x64/assimp-vc143-mt.lib")
set(avk_toolkit_AssimpDebugLIBPath "${PROJECT_SOURCE_DIR}/external/debug/lib/x64/assimp-vc143-mt.lib")

add_library(assimp::assimp SHARED IMPORTED)
set_target_properties(assimp::assimp PROPERTIES
Expand Down
55 changes: 55 additions & 0 deletions docs/dynamic_rendering.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Dynamic Rendering

**Table of Contents:**
- [Enabling the Extension](#enabling-the-extension)
- [Pipeline Creation](#pipeline-creation)
- [Recording Dynamic Rendering Commands](#recording-dynamic-rendering-commands)

The standard way of writing renderpasses and pipelines can become overly verbose when the codebase starts to grow. Specifically the need to recreate renderpass objects and framebuffers for each pipeline iteration is of concern. To alleviate this issue Vulkan API provides an extension called dynamic rendering. With this extension, the renderpass and framebuffer construction are no longer constructed statically, typically before the command recording. Instead, their creation is moved inside of the command recording phase, which offers much greater flexibility. Additionally, the pipeline creation needs to be modified to be compatible with the dynamic rendering equation.

## Enabling the Extension

Because dynamic rendering is an extension, it needs to be enabled. This is done by providing the `VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME` into the required device extensions, when creating the composition.

## Pipeline Creation

The creation of the pipeline needs to be sligthly modified to enable dynamic rendering. First, the pipeline needs to be notified, stating that we intend to use it together with dynamic rendering by passing the enum value `avk::cfg::dynamic_rendering::enabled` as a parameter to the pipeline constructor or pipeline creation function `create_graphics_pipeline_for`.

Second, the attachments passed into the pipeline also need to be differently declared: Analogous to how attachments for typical pipelines are created, the API offers three functions for creating dynamic attachments. These are:
- `declare_dynamic(std::tuple<vk::Format, vk::SampleCountFlagBits> aFormatAndSamples, subpass_usages aUsage);`
- `declare_dynamic(vk::Format aFormat, subpass_usages aUsage);`
- `declare_dynamic_for(const image_view_t& aImageView, subpass_usages aUsage);`.

Compared to the typical attachment declaration, these don't contain the load and store operation. It should be noted that dynamic rendering does not support subpasses in any extent. In the context of dynamic attachments, the `aUsage` parameter thus has completely different meaning. Instead of containing multiple subpass usages, `aUsage` must contain only a single subpass usage, which denotes how the attachment will be used in the **dynamic rendering** pass.

Finally, while the option to derive most of the required parameters from a given image view is provided, the attachments created in this way will be compatible with any other image view, that has the same parameters. That is, one can create a pipeline with dynamic attachment created by `declare_dynamic_for()` function, and then provide a completely different image view in the actuall `begin_dynamic_rendering()` call.

The following shows an example of creating a pipeline for dynamic rendering:
```cpp
auto Pipeline = avk::context().create_graphics_pipeline_for(
avk::vertex_shader("shader.vert"),
avk::fragment_shader("shader.frag"),
avk::cfg::viewport_depth_scissors_config::from_framebuffer(...),
avk::cfg::dynamic_rendering::enabled,
avk::attachment::declare_dynamic_for(colorImage, avk::usage::color(0))
);
```

## Recording Dynamic Rendering Commands

Dynamic rendering can be started with the `begin_dynamic_rendering()` command. This command requires two vectors as an input. The first vector must contain all dynamic rendering attachments that will be written to by the renderpass. The second vector contains the image views matching the attachments. It is again important to note, that the attachments do not need to be created from the actual image views used. One can think of these more as a template for the renderpass. That is an attachment created from image view `a` can be used to begin rendering with image view `b` as long as their required parameters are equal.

Additionally to these two vectors, `begin_dynamic_rendering()` has a set of optional parameters. Particularly noteworthy are `aRenderAreaOffset` and `aRenderAreaExtent` used to dynamically declare the bounds of the renderpass. With these, one can clearly start to see the benefits dynamic rendering offers as there is no need to recreate the whole renderpass when the required rendering window changes. Additionally, when no value is provided as `aRenderAreaExtent` the command attempts to automatically deduce the extent from the image views provided. For example, if a renderpass shall cover the entire extent of the image views provided, the auto deduction functionallity will be sufficient (unless the physical extents of the provided image views differ).

To end the renderpass one must call the `end_dynamic_rendering()` function. It is important to end each begun dynamic rendering instance. Dynamic rendering instances are not recursive. Because of this, dynamic rendering instance must be ended before beginning a new one. The code to record a simple dynamic rendering example, which begins dynamic rendering, dispatches a draw call and ends dynamic rendering is provided below:

```cpp
renderCommands.emplace_back(
avk::command::begin_dynamic_rendering(
{colorAttachment.value()},
{colorImageView},
vkOffset2D{0, 0}));
renderCommands.emplace_back(avk::command::bind_pipeline(pipeline.as_reference()));
renderCommands.emplace_back(avk::command::draw(3u, 1u, 0u, 0u));
renderCommands.emplace_back(avk::command::end_dynamic_rendering());
```
Binary file removed external/debug/bin/x64/assimp-vc140-mt.dll
Binary file not shown.
Binary file added external/debug/bin/x64/assimp-vc143-mt.dll
Binary file not shown.
Binary file removed external/debug/lib/x64/assimp-vc140-mt.lib
Binary file not shown.
Binary file added external/debug/lib/x64/assimp-vc143-mt.lib
Binary file not shown.
Binary file removed external/release/bin/x64/assimp-vc140-mt.dll
Binary file not shown.
Binary file added external/release/bin/x64/assimp-vc143-mt.dll
Binary file not shown.
Binary file removed external/release/lib/x64/assimp-vc140-mt.lib
Binary file not shown.
Binary file added external/release/lib/x64/assimp-vc143-mt.lib
Binary file not shown.
79 changes: 79 additions & 0 deletions external/universal/include/assimp/AssertHandler.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2020, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the
following conditions are met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other
materials provided with the distribution.
* Neither the name of the assimp team, nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior
written permission of the assimp team.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
*/

/** @file Provides facilities to replace the default assert handler. */

#ifndef INCLUDED_AI_ASSERTHANDLER_H
#define INCLUDED_AI_ASSERTHANDLER_H

#include <assimp/ai_assert.h>
#include <assimp/defs.h>

namespace Assimp {

// ---------------------------------------------------------------------------
/**
* @brief Signature of functions which handle assert violations.
*/
using AiAssertHandler = void (*)(const char* failedExpression, const char* file, int line);

// ---------------------------------------------------------------------------
/**
* @brief Set the assert handler.
*/
ASSIMP_API void setAiAssertHandler(AiAssertHandler handler);

// ---------------------------------------------------------------------------
/** The assert handler which is set by default.
*
* @brief This issues a message to stderr and calls abort.
*/
AI_WONT_RETURN ASSIMP_API void defaultAiAssertHandler(const char* failedExpression, const char* file, int line) AI_WONT_RETURN_SUFFIX;

// ---------------------------------------------------------------------------
/**
* @brief Dispatches an assert violation to the assert handler.
*/
ASSIMP_API void aiAssertViolation(const char* failedExpression, const char* file, int line);

} // end of namespace Assimp

#endif // INCLUDED_AI_ASSERTHANDLER_H
92 changes: 92 additions & 0 deletions external/universal/include/assimp/Base64.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*
---------------------------------------------------------------------------
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
Copyright (c) 2006-2024, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following
conditions are met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other
materials provided with the distribution.
* Neither the name of the assimp team, nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior
written permission of the assimp team.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------
*/

#pragma once
#ifndef AI_BASE64_HPP_INC
#define AI_BASE64_HPP_INC

#include <assimp/defs.h>

#include <stdint.h>
#include <vector>
#include <string>

namespace Assimp {
namespace Base64 {

/// @brief Will encode the given character buffer from UTF64 to ASCII
/// @param in The UTF-64 buffer.
/// @param inLength The size of the buffer
/// @param out The encoded ASCII string.
ASSIMP_API void Encode(const uint8_t *in, size_t inLength, std::string &out);

/// @brief Will encode the given character buffer from UTF64 to ASCII.
/// @param in A vector, which contains the buffer for encoding.
/// @param out The encoded ASCII string.
ASSIMP_API void Encode(const std::vector<uint8_t> &in, std::string &out);

/// @brief Will encode the given character buffer from UTF64 to ASCII.
/// @param in A vector, which contains the buffer for encoding.
/// @return The encoded ASCII string.
ASSIMP_API std::string Encode(const std::vector<uint8_t> &in);

/// @brief Will decode the given character buffer from ASCII to UTF64.
/// @param in The ASCII buffer to decode.
/// @param inLength The size of the buffer.
/// @param out The decoded buffer.
/// @return The new buffer size.
ASSIMP_API size_t Decode(const char *in, size_t inLength, uint8_t *&out);

/// @brief Will decode the given character buffer from ASCII to UTF64.
/// @param in The ASCII buffer to decode as a std::string.
/// @param out The decoded buffer.
/// @return The new buffer size.
ASSIMP_API size_t Decode(const std::string &in, std::vector<uint8_t> &out);

/// @brief Will decode the given character buffer from ASCII to UTF64.
/// @param in The ASCII string.
/// @return The decoded buffer in a vector.
ASSIMP_API std::vector<uint8_t> Decode(const std::string &in);

} // namespace Base64
} // namespace Assimp

#endif // AI_BASE64_HPP_INC
Loading

0 comments on commit 9b12820

Please sign in to comment.