summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2015-01-14 02:55:56 +0100
committerYuri Kunde Schlesner <yuriks@yuriks.net>2015-01-14 08:20:12 +0100
commit5961a2852dc2b603a896afd9b38b0ded26503849 (patch)
tree124f746b6cb1fefc7ac1a29de7bdb42d92a74b59
parentGPU: Fire GPU interrupts at the correct places. (diff)
downloadyuzu-5961a2852dc2b603a896afd9b38b0ded26503849.tar
yuzu-5961a2852dc2b603a896afd9b38b0ded26503849.tar.gz
yuzu-5961a2852dc2b603a896afd9b38b0ded26503849.tar.bz2
yuzu-5961a2852dc2b603a896afd9b38b0ded26503849.tar.lz
yuzu-5961a2852dc2b603a896afd9b38b0ded26503849.tar.xz
yuzu-5961a2852dc2b603a896afd9b38b0ded26503849.tar.zst
yuzu-5961a2852dc2b603a896afd9b38b0ded26503849.zip
-rw-r--r--src/core/hle/service/gsp_gpu.cpp25
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp4
2 files changed, 14 insertions, 15 deletions
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp
index 9504ab5bb..00a941658 100644
--- a/src/core/hle/service/gsp_gpu.cpp
+++ b/src/core/hle/service/gsp_gpu.cpp
@@ -218,6 +218,19 @@ void SignalInterrupt(InterruptId interrupt_id) {
interrupt_relay_queue->slot[next] = interrupt_id;
interrupt_relay_queue->error_code = 0x0; // No error
+
+ // Update framebuffer information if requested
+ // TODO(yuriks): Confirm where this code should be called. It is definitely updated without
+ // executing any GSP commands, only waiting on the event.
+ for (int screen_id = 0; screen_id < 2; ++screen_id) {
+ FrameBufferUpdate* info = GetFrameBufferInfo(thread_id, screen_id);
+
+ if (info->is_dirty) {
+ SetBufferSwap(screen_id, info->framebuffer_info[info->index]);
+ }
+
+ info->is_dirty = false;
+ }
}
Kernel::SignalEvent(g_interrupt_event);
}
@@ -281,18 +294,6 @@ static void ExecuteCommand(const Command& command, u32 thread_id) {
WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_size), params.out_buffer_size);
WriteGPURegister(GPU_REG_INDEX(display_transfer_config.flags), params.flags);
WriteGPURegister(GPU_REG_INDEX(display_transfer_config.trigger), 1);
-
- // Update framebuffer information if requested
- for (int screen_id = 0; screen_id < 2; ++screen_id) {
- FrameBufferUpdate* info = GetFrameBufferInfo(thread_id, screen_id);
-
- if (info->is_dirty) {
- SetBufferSwap(screen_id, info->framebuffer_info[info->index]);
- info->framebuffer_info->active_fb = info->framebuffer_info->active_fb ^ 1;
- }
-
- info->is_dirty = false;
- }
break;
}
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 29d220e8d..aa47bd616 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -88,10 +88,8 @@ void RendererOpenGL::SwapBuffers() {
void RendererOpenGL::LoadFBToActiveGLTexture(const GPU::Regs::FramebufferConfig& framebuffer,
const TextureInfo& texture) {
- // TODO: Why are active_fb and the valid framebuffer flipped compared to 3dbrew documentation
- // and GSP definitions?
const VAddr framebuffer_vaddr = Memory::PhysicalToVirtualAddress(
- framebuffer.active_fb == 0 ? framebuffer.address_left2 : framebuffer.address_left1);
+ framebuffer.active_fb == 0 ? framebuffer.address_left1 : framebuffer.address_left2);
LOG_TRACE(Render_OpenGL, "0x%08x bytes from 0x%08x(%dx%d), fmt %x",
framebuffer.stride * framebuffer.height,