From 8bcaacd63ca4eccd12939e196040ed35b3e514ed Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 5 Mar 2018 02:48:36 -0800 Subject: [PATCH] Resolve MSAA properly; --- src/graphics/canvas.c | 8 ++++++++ src/graphics/canvas.h | 1 + src/graphics/graphics.c | 10 +++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/graphics/canvas.c b/src/graphics/canvas.c index 9740323a..c1d8709e 100644 --- a/src/graphics/canvas.c +++ b/src/graphics/canvas.c @@ -94,6 +94,14 @@ void lovrCanvasDestroy(void* ref) { lovrTextureDestroy(ref); } +void lovrCanvasResolve(Canvas* canvas) { + int width = canvas->texture.width; + int height = canvas->texture.height; + glBindFramebuffer(GL_READ_FRAMEBUFFER, canvas->framebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, canvas->resolveFramebuffer); + glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR); +} + TextureFormat lovrCanvasGetFormat(Canvas* canvas) { return canvas->texture.slices[0]->format; } diff --git a/src/graphics/canvas.h b/src/graphics/canvas.h index 8dccda62..543d54ab 100644 --- a/src/graphics/canvas.h +++ b/src/graphics/canvas.h @@ -16,5 +16,6 @@ bool lovrCanvasSupportsFormat(TextureFormat format); Canvas* lovrCanvasCreate(int width, int height, TextureFormat format, int msaa, bool depth, bool stencil); void lovrCanvasDestroy(void* ref); +void lovrCanvasResolve(Canvas* canvas); TextureFormat lovrCanvasGetFormat(Canvas* canvas); int lovrCanvasGetMSAA(Canvas* canvas); diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 5f738333..0a429baf 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -355,11 +355,7 @@ void lovrGraphicsSetCanvas(Canvas** canvas, int count) { lovrAssert(count <= MAX_CANVASES, "Attempt to simultaneously render to %d canvases (the maximum is %d)", count, MAX_CANVASES); if (state.canvasCount > 0 && state.canvas[0]->msaa > 0) { - int width = state.canvas[0]->texture.width; - int height = state.canvas[0]->texture.height; - glBindFramebuffer(GL_READ_FRAMEBUFFER, state.canvas[0]->framebuffer); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, state.canvas[0]->resolveFramebuffer); - glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR); + lovrCanvasResolve(state.canvas[0]); } for (int i = 0; i < count; i++) { @@ -1108,6 +1104,10 @@ void lovrGraphicsPushLayer(Layer layer) { } void lovrGraphicsPopLayer() { + if (state.canvasCount == 0 && state.layers[state.layer].canvas) { + lovrCanvasResolve(state.layers[state.layer].canvas); + } + if (--state.layer < 0) { lovrThrow("Layer underflow"); }