Vulkan renderer backend (#2564)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bart Louwers <bart.louwers@gmail.com>
This commit is contained in:
Adrian Cojocaru
2024-08-01 22:49:49 +03:00
committed by GitHub
parent 88993b9420
commit 072aa32e8b
103 changed files with 11459 additions and 135 deletions

View File

@@ -16,6 +16,12 @@
#include <mbgl/shaders/mtl/clipping_mask.hpp>
#endif // MLN_RENDER_BACKEND_METAL
#if MLN_RENDER_BACKEND_VULKAN
#include <mbgl/vulkan/render_pass.hpp>
#include <mbgl/shaders/vulkan/clipping_mask.hpp>
#include <mbgl/vulkan/context.hpp>
#endif // MLN_RENDER_BACKEND_VULKAN
namespace mbgl {
TransformParameters::TransformParameters(const TransformState& state_)
@@ -139,6 +145,11 @@ void PaintParameters::clearStencil() {
0,
0}};
mtlContext.renderTileClippingMasks(*renderPass, staticData, tileUBO);
context.renderingStats().stencilClears++;
#elif MLN_RENDER_BACKEND_VULKAN
const auto& vulkanRenderPass = static_cast<vulkan::RenderPass&>(*renderPass);
vulkanRenderPass.clearStencil();
context.renderingStats().stencilClears++;
#else // !MLN_RENDER_BACKEND_METAL
context.clearStencilBuffer(0b00000000);
@@ -198,6 +209,39 @@ void PaintParameters::renderTileClippingMasks(const RenderTiles& renderTiles) {
mtlContext.renderingStats().stencilUpdates++;
}
#elif MLN_RENDER_BACKEND_VULKAN
std::vector<shaders::ClipUBO> tileUBOs;
for (const auto& tileRef : *renderTiles) {
const auto& tileID = tileRef.get().id;
const uint32_t stencilID = nextStencilID;
const auto result = tileClippingMaskIDs.insert(std::make_pair(tileID, stencilID));
if (result.second) {
// inserted
nextStencilID++;
} else {
// already present
continue;
}
if (tileUBOs.empty()) {
tileUBOs.reserve(count);
}
tileUBOs.emplace_back(shaders::ClipUBO{util::cast<float>(matrixForTile(tileID)), stencilID});
}
if (!tileUBOs.empty()) {
#if !defined(NDEBUG)
const auto debugGroup = renderPass->createDebugGroup("tile-clip-masks");
#endif
auto& vulkanContext = static_cast<vulkan::Context&>(context);
vulkanContext.renderTileClippingMasks(*renderPass, staticData, tileUBOs);
vulkanContext.renderingStats().stencilUpdates++;
}
#else // !MLN_RENDER_BACKEND_METAL
auto program = staticData.shaders->getLegacyGroup().get<ClippingMaskProgram>();