Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
mwilsnd committed May 28, 2024
1 parent 9e31738 commit 1f2ebc5
Show file tree
Hide file tree
Showing 18 changed files with 111 additions and 43 deletions.
11 changes: 11 additions & 0 deletions include/mbgl/actor/actor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

namespace mbgl {

class TaggedScheduler;

/**
An `Actor<O>` is an owning reference to an asynchronous object of type `O`:
an "actor". Communication with an actor happens via message passing: you send
Expand Down Expand Up @@ -66,11 +68,20 @@ class Actor {
: retainer(std::move(scheduler)),
target(*retainer, parent, std::forward<Args>(args)...) {}

template <class... Args>
Actor(TaggedScheduler& scheduler, Args&&... args)
: schedulerTag(scheduler.tag()),
retainer(scheduler.get()),
target(*retainer, parent, std::forward<Args>(args)...) {}



Actor(const Actor&) = delete;

ActorRef<std::decay_t<Object>> self() { return parent.self(); }

private:
const void* schedulerTag = nullptr;
const std::shared_ptr<Scheduler> retainer;
AspiringActor<Object> parent;
EstablishedActor<Object> target;
Expand Down
12 changes: 8 additions & 4 deletions include/mbgl/actor/scheduler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,11 @@ class Scheduler {

/// Makes a weak pointer to this Scheduler.
virtual mapbox::base::WeakPtr<Scheduler> makeWeakPtr() = 0;
/// Enqueues a function for execution on the render thread.
virtual void runOnRenderThread(std::function<void()>&&) {};
virtual void runRenderJobs() {}

/// Enqueues a function for execution on the render thread owned by the given tag.
virtual void runOnRenderThread(const void*, std::function<void()>&&) {}
/// Run render thread jobs for the given tag address
/// @param closeQueue Runs all render jobs and then removes the internal queue.
virtual void runRenderJobs(const void*, bool closeQueue = false) {}
/// Returns a closure wrapping the given one.
///
/// When the returned closure is invoked for the first time, it schedules
Expand Down Expand Up @@ -130,8 +131,11 @@ class TaggedScheduler {
/// @brief Get the wrapped scheduler
/// @return
const std::shared_ptr<Scheduler>& get() const noexcept { return scheduler; }
const void* tag() const noexcept { return tagAddr; }

void schedule(std::function<void()>&& fn) { scheduler->schedule(tagAddr, std::move(fn)); }
void runOnRenderThread(std::function<void()>&& fn) { scheduler->runOnRenderThread(tagAddr, std::move(fn)); }
void runRenderJobs(bool closeQueue = false) { scheduler->runRenderJobs(tagAddr, closeQueue); }
void waitForEmpty() const noexcept { scheduler->waitForEmpty(tagAddr); }

private:
Expand Down
4 changes: 3 additions & 1 deletion include/mbgl/gfx/renderer_backend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
namespace mbgl {

class ProgramParameters;
class Map;

namespace gfx {

Expand All @@ -24,7 +25,7 @@ enum class ContextMode : bool {

class RendererBackend {
protected:
explicit RendererBackend(ContextMode);
explicit RendererBackend(ContextMode, mbgl::Map*);

public:
virtual ~RendererBackend();
Expand Down Expand Up @@ -69,6 +70,7 @@ class RendererBackend {
protected:
std::unique_ptr<Context> context;
const ContextMode contextMode;
const mbgl::Map* owner;
std::once_flag initialized;

friend class BackendScope;
Expand Down
2 changes: 1 addition & 1 deletion include/mbgl/gl/renderer_backend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ using FramebufferID = uint32_t;

class RendererBackend : public gfx::RendererBackend {
public:
RendererBackend(gfx::ContextMode);
RendererBackend(gfx::ContextMode, mbgl::Map*);
~RendererBackend() override;

/// Called prior to rendering to update the internally assumed OpenGL state.
Expand Down
3 changes: 2 additions & 1 deletion include/mbgl/mtl/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ using UniqueVertexBufferResource = std::unique_ptr<VertexBufferResource>;

class Context final : public gfx::Context {
public:
Context(RendererBackend&);
Context(RendererBackend&, TaggedScheduler);
~Context() noexcept override;
Context(const Context&) = delete;
Context& operator=(const Context& other) = delete;
Expand Down Expand Up @@ -159,6 +159,7 @@ class Context final : public gfx::Context {

private:
RendererBackend& backend;
TaggedScheduler& scheduler;
bool cleanupOnDestruction = true;

std::optional<BufferResource> emptyBuffer;
Expand Down
2 changes: 1 addition & 1 deletion include/mbgl/mtl/renderer_backend.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ using FramebufferID = uint32_t;

class RendererBackend : public gfx::RendererBackend {
public:
RendererBackend(gfx::ContextMode);
RendererBackend(gfx::ContextMode, mbgl::Map*);
~RendererBackend() override;

/// Called prior to rendering to update the internally assumed MetalMetal state.
Expand Down
5 changes: 3 additions & 2 deletions src/mbgl/gfx/renderer_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
namespace mbgl {
namespace gfx {

RendererBackend::RendererBackend(const ContextMode contextMode_)
: contextMode(contextMode_) {}
RendererBackend::RendererBackend(const ContextMode contextMode_, mbgl::Map* map)
: contextMode(contextMode_),
owner(map) {}
RendererBackend::~RendererBackend() = default;

gfx::Context& RendererBackend::getContext() {
Expand Down
9 changes: 5 additions & 4 deletions src/mbgl/gl/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,17 +72,18 @@ GLint getMaxVertexAttribs() {
}
} // namespace

Context::Context(RendererBackend& backend_)
Context::Context(RendererBackend& backend_, TaggedScheduler scheduler_)
: gfx::Context(/*maximumVertexBindingCount=*/getMaxVertexAttribs()),
backend(backend_) {
backend(backend_),
scheduler(std::move(scheduler_)) {
#if MLN_DRAWABLE_RENDERER
uboAllocator = std::make_unique<gl::UniformBufferAllocator>();
#endif
}

Context::~Context() noexcept {
if (cleanupOnDestruction) {
Scheduler::GetBackground()->runRenderJobs();
scheduler.runRenderJobs(true /* closeQueue */);

reset();
#if !defined(NDEBUG)
Expand All @@ -93,7 +94,7 @@ Context::~Context() noexcept {
}

void Context::beginFrame() {
Scheduler::GetBackground()->runRenderJobs();
scheduler.runRenderJobs();

#if MLN_DRAWABLE_RENDERER
frameInFlightFence = std::make_shared<gl::Fence>();
Expand Down
3 changes: 2 additions & 1 deletion src/mbgl/gl/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class Debugging;

class Context final : public gfx::Context {
public:
Context(RendererBackend&);
Context(RendererBackend&, TaggedScheduler);
~Context() noexcept override;
Context(const Context&) = delete;
Context& operator=(const Context& other) = delete;
Expand Down Expand Up @@ -153,6 +153,7 @@ class Context final : public gfx::Context {

private:
RendererBackend& backend;
TaggedScheduler scheduler;
bool cleanupOnDestruction = true;

std::unique_ptr<extension::Debugging> debugging;
Expand Down
7 changes: 4 additions & 3 deletions src/mbgl/gl/renderer_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
namespace mbgl {
namespace gl {

RendererBackend::RendererBackend(const gfx::ContextMode contextMode_)
: gfx::RendererBackend(contextMode_) {}
RendererBackend::RendererBackend(const gfx::ContextMode contextMode_, mbgl::Map* map)
: gfx::RendererBackend(contextMode_, map) {}

std::unique_ptr<gfx::Context> RendererBackend::createContext() {
auto result = std::make_unique<gl::Context>(*this);
auto result = std::make_unique<gl::Context>(*this,
TaggedScheduler{Scheduler::GetBackground(), static_cast<const void*>(owner)});
result->enableDebugging();
result->initializeExtensions(std::bind(&RendererBackend::getExtensionFunctionPointer, this, std::placeholders::_1));
return result;
Expand Down
9 changes: 5 additions & 4 deletions src/mbgl/mtl/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,14 @@ namespace mtl {
// 31 for Apple2-8, Mac2, per https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
constexpr uint32_t maximumVertexBindingCount = 31;

Context::Context(RendererBackend& backend_)
Context::Context(RendererBackend& backend_, TaggedScheduler scheduler_)
: gfx::Context(mtl::maximumVertexBindingCount),
backend(backend_) {}
backend(backend_),
scheduler(std::move(scheduler_)) {}

Context::~Context() noexcept {
if (cleanupOnDestruction) {
Scheduler::GetBackground()->runRenderJobs();
scheduler.runRenderJobs(true /* closeQueue */);
performCleanup();

emptyVertexBuffer.reset();
Expand All @@ -68,7 +69,7 @@ Context::~Context() noexcept {
}

void Context::beginFrame() {
Scheduler::GetBackground()->runRenderJobs();
scheduler.runRenderJobs();
}

void Context::endFrame() {}
Expand Down
7 changes: 4 additions & 3 deletions src/mbgl/mtl/renderer_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
namespace mbgl {
namespace mtl {

RendererBackend::RendererBackend(const gfx::ContextMode contextMode_)
: gfx::RendererBackend(contextMode_),
RendererBackend::RendererBackend(const gfx::ContextMode contextMode_, mbgl::Map* map)
: gfx::RendererBackend(contextMode_, map),
device(NS::TransferPtr(MTL::CreateSystemDefaultDevice())),
commandQueue(NS::TransferPtr(device->newCommandQueue())) {
assert(device);
Expand All @@ -51,7 +51,8 @@ RendererBackend::RendererBackend(const gfx::ContextMode contextMode_)
RendererBackend::~RendererBackend() = default;

std::unique_ptr<gfx::Context> RendererBackend::createContext() {
return std::make_unique<mtl::Context>(*this);
return std::make_unique<mtl::Context>(*this,
TaggedScheduler{Scheduler::GetBackground(), static_cast<const void*>(owner)});
}

PremultipliedImage RendererBackend::readFramebuffer(const Size& size) {
Expand Down
9 changes: 5 additions & 4 deletions src/mbgl/tile/geometry_tile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,14 +156,15 @@ const LayerRenderData* GeometryTileRenderData::getLayerRenderData(const style::L
that could flag the tile as non-pending too early.
*/

GeometryTile::GeometryTile(const OverscaledTileID& id_, std::string sourceID_, const TileParameters& parameters)
GeometryTile::GeometryTile(const OverscaledTileID& id_, std::string sourceID_, const TileParameters& parameters, TaggedScheduler& scheduler)
: Tile(Kind::Geometry, id_),
ImageRequestor(parameters.imageManager),
sourceID(std::move(sourceID_)),
threadPool(Scheduler::GetBackground()),
threadPool(scheduler),
mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())),
worker(threadPool,
worker(threadPool, // TaggedScheduler reference for the Actor retainer
ActorRef<GeometryTile>(*this, mailbox),
threadPool, // TaggedScheduler reference for the worker
id_,
sourceID,
obsolete,
Expand All @@ -183,7 +184,7 @@ GeometryTile::~GeometryTile() {
imageManager->removeRequestor(*this);

if (layoutResult) {
threadPool->runOnRenderThread(
threadPool.runOnRenderThread(
[layoutResult_{std::move(layoutResult)}, atlasTextures_{std::move(atlasTextures)}]() {});
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/mbgl/tile/geometry_tile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class TileAtlasTextures;

class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor {
public:
GeometryTile(const OverscaledTileID&, std::string sourceID, const TileParameters&);
GeometryTile(const OverscaledTileID&, std::string sourceID, const TileParameters&, TaggedScheduler& scheduler);

~GeometryTile() override;

Expand Down Expand Up @@ -106,7 +106,7 @@ class GeometryTile : public Tile, public GlyphRequestor, public ImageRequestor {
// Used to signal the worker that it should abandon parsing this tile as soon as possible.
std::atomic<bool> obsolete{false};

const std::shared_ptr<Scheduler> threadPool;
TaggedScheduler threadPool;

const std::shared_ptr<Mailbox> mailbox;
Actor<GeometryTileWorker> worker;
Expand Down
4 changes: 3 additions & 1 deletion src/mbgl/tile/geometry_tile_worker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ using namespace style;

GeometryTileWorker::GeometryTileWorker(ActorRef<GeometryTileWorker> self_,
ActorRef<GeometryTile> parent_,
TaggedScheduler& scheduler_,
OverscaledTileID id_,
std::string sourceID_,
const std::atomic<bool>& obsolete_,
Expand All @@ -38,6 +39,7 @@ GeometryTileWorker::GeometryTileWorker(ActorRef<GeometryTileWorker> self_,
const bool showCollisionBoxes_)
: self(std::move(self_)),
parent(std::move(parent_)),
scheduler(scheduler_),
id(id_),
sourceID(std::move(sourceID_)),
obsolete(obsolete_),
Expand All @@ -46,7 +48,7 @@ GeometryTileWorker::GeometryTileWorker(ActorRef<GeometryTileWorker> self_,
showCollisionBoxes(showCollisionBoxes_) {}

GeometryTileWorker::~GeometryTileWorker() {
Scheduler::GetBackground()->runOnRenderThread([renderData_{std::move(renderData)}]() {});
scheduler.runOnRenderThread([renderData_{std::move(renderData)}]() {});
}

/*
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/tile/geometry_tile_worker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class GeometryTileWorker {
public:
GeometryTileWorker(ActorRef<GeometryTileWorker> self,
ActorRef<GeometryTile> parent,
TaggedScheduler& scheduler_,
OverscaledTileID,
std::string,
const std::atomic<bool>&,
Expand Down Expand Up @@ -71,6 +72,7 @@ class GeometryTileWorker {

ActorRef<GeometryTileWorker> self;
ActorRef<GeometryTile> parent;
TaggedScheduler scheduler;

const OverscaledTileID id;
const std::string sourceID;
Expand Down
Loading

0 comments on commit 1f2ebc5

Please sign in to comment.