Resolve supports multiple color attachments;

This commit is contained in:
bjorn 2018-08-29 13:20:13 -07:00
parent 6104d3362e
commit 06fa846680
3 changed files with 25 additions and 10 deletions

View File

@ -31,6 +31,7 @@ const Attachment* lovrCanvasGetAttachments(Canvas* canvas, int* count);
void lovrCanvasSetAttachments(Canvas* canvas, Attachment* attachments, int count);
void lovrCanvasBind(Canvas* canvas);
void lovrCanvasResolve(Canvas* canvas);
void lovrCanvasBlit(Canvas* canvas);
bool lovrCanvasIsStereo(Canvas* canvas);
uint32_t lovrCanvasGetWidth(Canvas* canvas);
uint32_t lovrCanvasGetHeight(Canvas* canvas);

View File

@ -921,13 +921,6 @@ void lovrGpuDraw(DrawCommand* command) {
}
}
void lovrGpuBlit(Canvas* canvas) {
lovrCanvasBind(canvas);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, canvas->width, canvas->height, 0, 0, lovrGraphicsGetWidth(), lovrGraphicsGetHeight(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
state.framebuffer = 0;
}
void lovrGpuCompute(Shader* shader, int x, int y, int z) {
#ifdef EMSCRIPTEN
lovrThrow("Compute shaders are not supported on this system");
@ -1410,10 +1403,31 @@ void lovrCanvasResolve(Canvas* canvas) {
int w = canvas->width;
int h = canvas->height;
lovrGpuBindFramebuffer(canvas->resolveBuffer);
glBindFramebuffer(GL_READ_FRAMEBUFFER, canvas->framebuffer);
glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, canvas->resolveBuffer);
state.framebuffer = canvas->resolveBuffer;
canvas->needsResolve = false;
if (canvas->count == 1) {
glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
} else {
GLenum buffers[MAX_CANVAS_ATTACHMENTS] = { GL_NONE };
for (int i = 0; i < canvas->count; i++) {
buffers[i] = GL_COLOR_ATTACHMENT0 + i;
glReadBuffer(i);
glDrawBuffers(1, &buffers[i]);
glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
}
glReadBuffer(0);
glDrawBuffers(canvas->count, buffers);
}
}
void lovrCanvasBlit(Canvas* canvas) {
glBindFramebuffer(GL_READ_FRAMEBUFFER, canvas->framebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, canvas->width, canvas->height, 0, 0, lovrGraphicsGetWidth(), lovrGraphicsGetHeight(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
state.framebuffer = 0;
}
bool lovrCanvasIsStereo(Canvas* canvas) {

View File

@ -693,7 +693,7 @@ static void openvrRenderTo(void (*callback)(void*), void* userdata) {
lovrGpuDirtyTexture(0);
if (state.isMirrored) {
lovrGraphicsBlit(state.canvas);
lovrCanvasBlit(state.canvas);
}
}