-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'development' into custom_tangent_space
- Loading branch information
Showing
109 changed files
with
7,521 additions
and
5,182 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule auto_vk
updated
6 files
+88 −9 | .github/workflows/build.yml | |
+1 −1 | README.md | |
+11 −1 | include/avk/avk.hpp | |
+33 −32 | include/avk/buffer.hpp | |
+11 −0 | include/avk/commands.hpp | |
+31 −55 | src/avk.cpp |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.