core: refactor renderable size ownership (#4512)

This commit is contained in:
Bart Louwers
2026-09-01 17:35:29 +02:00
committed by GitHub
parent be3f03b86e
commit e5d0fce32a
35 changed files with 131 additions and 122 deletions

View File

@@ -23,6 +23,6 @@ public:
}
virtual mln::gfx::RendererBackend& getRendererBackend() = 0;
virtual mln::Size getSize() const = 0;
virtual void setSize(mln::Size) = 0;
virtual mln::Size getFramebufferSize() const = 0;
virtual void setFramebufferSize(mln::Size) = 0;
};

View File

@@ -15,7 +15,7 @@ public:
MLN_TRACE_FUNC();
backend.setFramebufferBinding(0);
backend.setViewport(0, 0, backend.getSize());
backend.setViewport(0, 0, backend.getFramebufferSize());
}
void swap() override {
@@ -72,15 +72,15 @@ void GLFWGLBackend::updateAssumedState() {
MLN_TRACE_FUNC();
assumeFramebufferBinding(0);
setViewport(0, 0, size);
setViewport(0, 0, getSize());
}
mln::Size GLFWGLBackend::getSize() const {
return size;
mln::Size GLFWGLBackend::getFramebufferSize() const {
return getSize();
}
void GLFWGLBackend::setSize(const mln::Size newSize) {
size = newSize;
void GLFWGLBackend::setFramebufferSize(const mln::Size newSize) {
setRenderableSize(newSize);
}
void GLFWGLBackend::swap() {

View File

@@ -17,8 +17,8 @@ public:
// GLFWRendererBackend implementation
public:
mln::gfx::RendererBackend& getRendererBackend() override { return *this; }
mln::Size getSize() const override;
void setSize(mln::Size) override;
mln::Size getFramebufferSize() const override;
void setFramebufferSize(mln::Size) override;
// mln::gfx::RendererBackend implementation
public:

View File

@@ -14,8 +14,8 @@ public:
GLFWMetalBackend(GLFWwindow *window_, const bool capFrameRate);
~GLFWMetalBackend() = default;
mln::gfx::RendererBackend &getRendererBackend() override;
void setSize(mln::Size) override;
mln::Size getSize() const override;
void setFramebufferSize(mln::Size) override;
mln::Size getFramebufferSize() const override;
private:
NSWindow *window;

View File

@@ -11,6 +11,6 @@ GLFWMetalBackend::GLFWMetalBackend(GLFWwindow* window_, [[maybe_unused]] const b
mln::gfx::RendererBackend& GLFWMetalBackend::getRendererBackend() { return rendererBackend; }
void GLFWMetalBackend::setSize(mln::Size size) { rendererBackend.setSize(size); }
void GLFWMetalBackend::setFramebufferSize(mln::Size size) { rendererBackend.setSize(size); }
mln::Size GLFWMetalBackend::getSize() const { return rendererBackend.getSize(); }
mln::Size GLFWMetalBackend::getFramebufferSize() const { return rendererBackend.getSize(); }

View File

@@ -312,10 +312,10 @@ GLFWView::GLFWView(bool fullscreen_,
#if defined(__APPLE__) && !defined(MLN_RENDER_BACKEND_VULKAN)
int fbW, fbH;
glfwGetFramebufferSize(window, &fbW, &fbH);
backend->setSize({static_cast<uint32_t>(fbW), static_cast<uint32_t>(fbH)});
backend->setFramebufferSize({static_cast<uint32_t>(fbW), static_cast<uint32_t>(fbH)});
#endif
pixelRatio = static_cast<float>(backend->getSize().width) / width;
pixelRatio = static_cast<float>(backend->getFramebufferSize().width) / width;
glfwMakeContextCurrent(nullptr);
@@ -1026,7 +1026,7 @@ void GLFWView::onWindowResize(GLFWwindow *window, int width, int height) {
#ifdef __APPLE__
int fbW, fbH;
glfwGetFramebufferSize(window, &fbW, &fbH);
view->backend->setSize({static_cast<uint32_t>(fbW), static_cast<uint32_t>(fbH)});
view->backend->setFramebufferSize({static_cast<uint32_t>(fbW), static_cast<uint32_t>(fbH)});
#endif
}
@@ -1034,7 +1034,7 @@ void GLFWView::onFramebufferResize(GLFWwindow *window, int width, int height) {
MLN_TRACE_FUNC();
auto *view = reinterpret_cast<GLFWView *>(glfwGetWindowUserPointer(window));
view->backend->setSize({static_cast<uint32_t>(width), static_cast<uint32_t>(height)});
view->backend->setFramebufferSize({static_cast<uint32_t>(width), static_cast<uint32_t>(height)});
// This is only triggered when the framebuffer is resized, but not the
// window. It can happen when you move the window between screens with a

View File

@@ -156,12 +156,12 @@ GLFWVulkanBackend::GLFWVulkanBackend(GLFWwindow* window_, const bool capFrameRat
GLFWVulkanBackend::~GLFWVulkanBackend() {}
mln::Size GLFWVulkanBackend::getSize() const {
return size;
mln::Size GLFWVulkanBackend::getFramebufferSize() const {
return getSize();
}
void GLFWVulkanBackend::setSize(const mln::Size newSize) {
size = newSize;
void GLFWVulkanBackend::setFramebufferSize(const mln::Size newSize) {
setRenderableSize(newSize);
auto& contextImpl = static_cast<mln::vulkan::Context&>(*context);
contextImpl.requestSurfaceUpdate();

View File

@@ -23,8 +23,8 @@ public:
// GLFWRendererBackend implementation
public:
mln::gfx::RendererBackend& getRendererBackend() override { return *this; }
mln::Size getSize() const override;
void setSize(mln::Size) override;
mln::Size getFramebufferSize() const override;
void setFramebufferSize(mln::Size) override;
// mln::gfx::RendererBackend implementation
public:

View File

@@ -34,8 +34,8 @@ public:
// GLFWBackend implementation
public:
mln::gfx::RendererBackend& getRendererBackend() override;
mln::Size getSize() const override;
void setSize(mln::Size) override;
mln::Size getFramebufferSize() const override;
void setFramebufferSize(mln::Size) override;
// mln::gfx::RendererBackend implementation
public:
@@ -50,7 +50,6 @@ public:
// Override virtual methods from RendererBackend
void* getCurrentTextureView() override;
void* getDepthStencilView() override;
mln::Size getFramebufferSize() const override;
private:
class SpinLock {

View File

@@ -896,13 +896,13 @@ void GLFWWebGPUBackend::deactivate() {
// WebGPU doesn't need explicit context deactivation like OpenGL
}
mln::Size GLFWWebGPUBackend::getSize() const {
return size;
mln::Size GLFWWebGPUBackend::getFramebufferSize() const {
return getSize();
}
void GLFWWebGPUBackend::setSize(mln::Size newSize) {
void GLFWWebGPUBackend::setFramebufferSize(mln::Size newSize) {
// Update swap chain size if needed
if (size != newSize) {
if (getSize() != newSize) {
#ifdef __APPLE__
int width = 0;
int height = 0;
@@ -918,7 +918,7 @@ void GLFWWebGPUBackend::setSize(mln::Size newSize) {
}
}
#endif
size = newSize;
setRenderableSize(newSize);
surfaceNeedsReconfigure = true;
}
}
@@ -1066,10 +1066,6 @@ void* GLFWWebGPUBackend::getCurrentTextureView() {
#endif
}
mln::Size GLFWWebGPUBackend::getFramebufferSize() const {
return getSize();
}
void* GLFWWebGPUBackend::getDepthStencilView() {
std::lock_guard<SpinLock> guard(textureStateLock);
if (!depthStencilView) {
@@ -1126,7 +1122,8 @@ void GLFWWebGPUBackend::reconfigureSurface() {
return;
}
size = {static_cast<uint32_t>(std::max(width, 0)), static_cast<uint32_t>(std::max(height, 0))};
setRenderableSize(
{static_cast<uint32_t>(std::max(width, 0)), static_cast<uint32_t>(std::max(height, 0))});
// Configure surface
wgpu::SurfaceConfiguration config = {};

View File

@@ -15,5 +15,4 @@ public:
void activate() override;
void deactivate() override;
void setSize(mln::Size size_);
mln::Size getSize() const;
};

View File

@@ -19,15 +19,12 @@ public:
swapchain->setDevice(backend.getDevice().get());
}
void setBackendSize(mln::Size size_) {
size = size_;
void setDrawableSize(const mln::Size& drawableSize) {
swapchain->setDrawableSize(
{static_cast<CGFloat>(size.width), static_cast<CGFloat>(size.height)});
{static_cast<CGFloat>(drawableSize.width), static_cast<CGFloat>(drawableSize.height)});
buffersInvalid = true;
}
mln::Size getSize() const { return size; }
void bind() override {
surface = NS::TransferPtr(swapchain->nextDrawable());
auto texSize = mln::Size{static_cast<uint32_t>(swapchain->drawableSize().width),
@@ -107,7 +104,6 @@ private:
CAMetalLayerPtr swapchain;
gfx::Texture2DPtr depthTexture;
gfx::Texture2DPtr stencilTexture;
mln::Size size;
bool buffersInvalid = true;
};
@@ -129,10 +125,6 @@ void MetalBackend::activate() {}
void MetalBackend::deactivate() {}
void MetalBackend::setSize(mln::Size size_) {
size = size_;
getResource<mln::MetalRenderableResource>().setBackendSize(size_);
}
mln::Size MetalBackend::getSize() const {
return getResource<mln::MetalRenderableResource>().getSize();
setRenderableSize(size_);
getResource<mln::MetalRenderableResource>().setDrawableSize(size_);
}