Metal setup merge (#1616)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Alex Cristici <alex.cristici@gmail.com>
Co-authored-by: mwilsnd <mwilsnd@gmail.com>
Co-authored-by: Stefan Karschti <stefan.karschti@gmail.com>
Co-authored-by: Bart Louwers <bart@emeel.net>
Co-authored-by: Alex Cristici <alex@skoon.energy>
Co-authored-by: Bart Louwers <bart.louwers@gmail.com>
Co-authored-by: Wei Chen <alanchenboy@gmail.com>
Co-authored-by: Siarhei Fedartsou <siarhei.fedartsou@gmail.com>
Co-authored-by: tdcosta100 <tdcosta100@gmail.com>
This commit is contained in:
Tim Sylvester
2023-09-13 11:35:20 -07:00
committed by GitHub
parent 085b0ced6d
commit 82ec59a2b0
284 changed files with 32357 additions and 1155 deletions

View File

@@ -0,0 +1,92 @@
#include <mbgl/mtl/command_encoder.hpp>
#include <mbgl/mtl/context.hpp>
#include <mbgl/mtl/render_pass.hpp>
#include <mbgl/mtl/renderable_resource.hpp>
#include <mbgl/mtl/upload_pass.hpp>
#include <Metal/Metal.hpp>
#include <cstring>
namespace mbgl {
namespace mtl {
CommandEncoder::CommandEncoder(Context& context_)
: context(context_) {}
CommandEncoder::~CommandEncoder() {
context.performCleanup();
}
std::unique_ptr<gfx::UploadPass> CommandEncoder::createUploadPass(const char* name, gfx::Renderable& renderable) {
return std::make_unique<UploadPass>(renderable, *this, name);
}
std::unique_ptr<gfx::RenderPass> CommandEncoder::createRenderPass(const char* name,
const gfx::RenderPassDescriptor& descriptor) {
return std::make_unique<RenderPass>(*this, name, descriptor);
}
void CommandEncoder::present(gfx::Renderable& renderable) {
renderable.getResource<RenderableResource>().swap();
}
void CommandEncoder::pushDebugGroup(const char* name) {
// Debug groups exist in MTLBuffer and MTLCommandEncoder, but these are associated with the
// renderable provided in the RenderPassDescriptor, and so may not have been created yet.
// Instead, maintain a stack of names and push them to each render pass as we create it.
debugGroupNames.push_back({name ? name : std::string(), renderPasses.size(), uploadPasses.size()});
// Apply it to any groups that are already active
for (auto* pass : renderPasses) {
renderDebugGroups.emplace_back(gfx::DebugGroup<gfx::RenderPass>{*pass, name});
}
for (auto* pass : uploadPasses) {
uploadDebugGroups.emplace_back(gfx::DebugGroup<gfx::UploadPass>{*pass, name});
}
}
void CommandEncoder::popDebugGroup() {
assert(!debugGroupNames.empty());
if (!debugGroupNames.empty()) {
// Pop the entries we added for each active encoder when this item was added
for (std::size_t i = 0; i < debugGroupNames.back().renderGroups; ++i) {
assert(!renderDebugGroups.empty());
if (!renderDebugGroups.empty()) {
renderDebugGroups.pop_back();
}
}
for (std::size_t i = 0; i < debugGroupNames.back().uploadGroups; ++i) {
assert(!uploadDebugGroups.empty());
if (!uploadDebugGroups.empty()) {
uploadDebugGroups.pop_back();
}
}
debugGroupNames.pop_back();
}
}
void CommandEncoder::trackRenderPass(RenderPass* pass) {
if (pass) {
renderPasses.insert(pass);
}
}
void CommandEncoder::forgetRenderPass(RenderPass* pass) {
renderPasses.erase(pass);
}
void CommandEncoder::trackUploadPass(UploadPass* pass) {
if (pass) {
uploadPasses.insert(pass);
}
}
void CommandEncoder::forgetUploadPass(UploadPass* pass) {
uploadPasses.erase(pass);
}
} // namespace mtl
} // namespace mbgl