فهرست منبع

GSP: Toggle active framebuffer each frame

bunnei 11 سال پیش
والد
کامیت
f7a3f45f1e
2فایلهای تغییر یافته به همراه8 افزوده شده و 2 حذف شده
  1. 4 1
      src/core/hle/service/gsp_gpu.cpp
  2. 4 1
      src/video_core/renderer_opengl/renderer_opengl.cpp

+ 4 - 1
src/core/hle/service/gsp_gpu.cpp

@@ -291,8 +291,11 @@ static void ExecuteCommand(const Command& command, u32 thread_id) {
         // Update framebuffer information if requested
         // Update framebuffer information if requested
         for (int screen_id = 0; screen_id < 2; ++screen_id) {
         for (int screen_id = 0; screen_id < 2; ++screen_id) {
             FrameBufferUpdate* info = GetFrameBufferInfo(thread_id, screen_id);
             FrameBufferUpdate* info = GetFrameBufferInfo(thread_id, screen_id);
-            if (info->is_dirty)
+
+            if (info->is_dirty) {
                 SetBufferSwap(screen_id, info->framebuffer_info[info->index]);
                 SetBufferSwap(screen_id, info->framebuffer_info[info->index]);
+                info->framebuffer_info->active_fb = info->framebuffer_info->active_fb ^ 1;
+            }
 
 
             info->is_dirty = false;
             info->is_dirty = false;
         }
         }

+ 4 - 1
src/video_core/renderer_opengl/renderer_opengl.cpp

@@ -87,8 +87,11 @@ void RendererOpenGL::SwapBuffers() {
  */
  */
 void RendererOpenGL::LoadFBToActiveGLTexture(const GPU::Regs::FramebufferConfig& framebuffer,
 void RendererOpenGL::LoadFBToActiveGLTexture(const GPU::Regs::FramebufferConfig& framebuffer,
                                              const TextureInfo& texture) {
                                              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(
     const VAddr framebuffer_vaddr = Memory::PhysicalToVirtualAddress(
-        framebuffer.active_fb == 1 ? framebuffer.address_left2 : framebuffer.address_left1);
+        framebuffer.active_fb == 0 ? framebuffer.address_left2 : framebuffer.address_left1);
 
 
     LOG_TRACE(Render_OpenGL, "0x%08x bytes from 0x%08x(%dx%d), fmt %x",
     LOG_TRACE(Render_OpenGL, "0x%08x bytes from 0x%08x(%dx%d), fmt %x",
         framebuffer.stride * framebuffer.height,
         framebuffer.stride * framebuffer.height,