|
|
|
@ -86,28 +86,22 @@ public:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ReloadRenderFrame(Frame* frame, u32 width, u32 height) {
|
|
|
|
|
OpenGLState prev_state = OpenGLState::GetCurState();
|
|
|
|
|
OpenGLState state = OpenGLState::GetCurState();
|
|
|
|
|
|
|
|
|
|
// Recreate the color texture attachment
|
|
|
|
|
frame->color.Release();
|
|
|
|
|
frame->color.Create();
|
|
|
|
|
state.renderbuffer = frame->color.handle;
|
|
|
|
|
state.Apply();
|
|
|
|
|
glRenderbufferStorage(GL_RENDERBUFFER, frame->is_srgb ? GL_SRGB8 : GL_RGB8, width, height);
|
|
|
|
|
const GLenum internal_format = frame->is_srgb ? GL_SRGB8 : GL_RGB8;
|
|
|
|
|
glNamedRenderbufferStorage(frame->color.handle, internal_format, width, height);
|
|
|
|
|
|
|
|
|
|
// Recreate the FBO for the render target
|
|
|
|
|
frame->render.Release();
|
|
|
|
|
frame->render.Create();
|
|
|
|
|
state.draw.read_framebuffer = frame->render.handle;
|
|
|
|
|
state.draw.draw_framebuffer = frame->render.handle;
|
|
|
|
|
state.Apply();
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, frame->render.handle);
|
|
|
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
|
|
|
|
frame->color.handle);
|
|
|
|
|
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
|
|
|
LOG_CRITICAL(Render_OpenGL, "Failed to recreate render FBO!");
|
|
|
|
|
}
|
|
|
|
|
prev_state.Apply();
|
|
|
|
|
|
|
|
|
|
frame->width = width;
|
|
|
|
|
frame->height = height;
|
|
|
|
|
frame->color_reloaded = true;
|
|
|
|
@ -353,8 +347,7 @@ void RendererOpenGL::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
|
|
|
|
|
frame->is_srgb = screen_info.display_srgb;
|
|
|
|
|
frame_mailbox->ReloadRenderFrame(frame, layout.width, layout.height);
|
|
|
|
|
}
|
|
|
|
|
state.draw.draw_framebuffer = frame->render.handle;
|
|
|
|
|
state.Apply();
|
|
|
|
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frame->render.handle);
|
|
|
|
|
DrawScreen(layout);
|
|
|
|
|
// Create a fence for the frontend to wait on and swap this frame to OffTex
|
|
|
|
|
frame->render_fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
|
|
@ -647,12 +640,14 @@ void RendererOpenGL::RenderScreenshot() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GLint old_read_fb;
|
|
|
|
|
GLint old_draw_fb;
|
|
|
|
|
glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &old_read_fb);
|
|
|
|
|
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &old_draw_fb);
|
|
|
|
|
|
|
|
|
|
// Draw the current frame to the screenshot framebuffer
|
|
|
|
|
screenshot_framebuffer.Create();
|
|
|
|
|
GLuint old_read_fb = state.draw.read_framebuffer;
|
|
|
|
|
GLuint old_draw_fb = state.draw.draw_framebuffer;
|
|
|
|
|
state.draw.read_framebuffer = state.draw.draw_framebuffer = screenshot_framebuffer.handle;
|
|
|
|
|
state.Apply();
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, screenshot_framebuffer.handle);
|
|
|
|
|
|
|
|
|
|
Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout};
|
|
|
|
|
|
|
|
|
@ -669,11 +664,11 @@ void RendererOpenGL::RenderScreenshot() {
|
|
|
|
|
renderer_settings.screenshot_bits);
|
|
|
|
|
|
|
|
|
|
screenshot_framebuffer.Release();
|
|
|
|
|
state.draw.read_framebuffer = old_read_fb;
|
|
|
|
|
state.draw.draw_framebuffer = old_draw_fb;
|
|
|
|
|
state.Apply();
|
|
|
|
|
glDeleteRenderbuffers(1, &renderbuffer);
|
|
|
|
|
|
|
|
|
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, old_read_fb);
|
|
|
|
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, old_draw_fb);
|
|
|
|
|
|
|
|
|
|
renderer_settings.screenshot_complete_callback();
|
|
|
|
|
renderer_settings.screenshot_requested = false;
|
|
|
|
|
}
|
|
|
|
|