diff options
| author | Tony Wasserka <neobrainx@gmail.com> | 2015-07-13 21:39:58 +0200 | 
|---|---|---|
| committer | Tony Wasserka <neobrainx@gmail.com> | 2015-07-13 21:39:58 +0200 | 
| commit | 884b681ccaf3cb4057ca0ed0102e446736bb535f (patch) | |
| tree | 9359e9b88f0147879c672638d8c02960d2179d3a /src/core/hw | |
| parent | c4e11519afb8c51b591b88f6bfa531b04d15d588 (diff) | |
| parent | 29abb11e8fbb6a78edf84496979ef946bf4e45a7 (diff) | |
Merge pull request #702 from neobrain/citrace
Add CiTrace recording support.
Diffstat (limited to 'src/core/hw')
| -rw-r--r-- | src/core/hw/gpu.cpp | 78 | ||||
| -rw-r--r-- | src/core/hw/hw.cpp | 30 | ||||
| -rw-r--r-- | src/core/hw/lcd.cpp | 10 | 
3 files changed, 91 insertions, 27 deletions
| diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp index a1789f9c7..a3a7d128f 100644 --- a/src/core/hw/gpu.cpp +++ b/src/core/hw/gpu.cpp @@ -21,12 +21,17 @@  #include "core/hw/hw.h"  #include "core/hw/gpu.h" +#include "core/tracer/recorder.h" +  #include "video_core/command_processor.h"  #include "video_core/hwrasterizer_base.h"  #include "video_core/renderer_base.h"  #include "video_core/utils.h"  #include "video_core/video_core.h" +#include "video_core/debug_utils/debug_utils.h" + +  namespace GPU {  Regs g_regs; @@ -101,39 +106,43 @@ inline void Write(u32 addr, const T data) {          const bool is_second_filler = (index != GPU_REG_INDEX(memory_fill_config[0].trigger));          auto& config = g_regs.memory_fill_config[is_second_filler]; -        if (config.address_start && config.trigger) { -            u8* start = Memory::GetPhysicalPointer(config.GetStartAddress()); -            u8* end = Memory::GetPhysicalPointer(config.GetEndAddress()); - -            if (config.fill_24bit) { -                // fill with 24-bit values -                for (u8* ptr = start; ptr < end; ptr += 3) { -                    ptr[0] = config.value_24bit_r; -                    ptr[1] = config.value_24bit_g; -                    ptr[2] = config.value_24bit_b; +        if (config.trigger) { +            if (config.address_start) { // Some games pass invalid values here +                u8* start = Memory::GetPhysicalPointer(config.GetStartAddress()); +                u8* end = Memory::GetPhysicalPointer(config.GetEndAddress()); + +                if (config.fill_24bit) { +                    // fill with 24-bit values +                    for (u8* ptr = start; ptr < end; ptr += 3) { +                        ptr[0] = config.value_24bit_r; +                        ptr[1] = config.value_24bit_g; +                        ptr[2] = config.value_24bit_b; +                    } +                } else if (config.fill_32bit) { +                    // fill with 32-bit values +                    for (u32* ptr = (u32*)start; ptr < (u32*)end; ++ptr) +                        *ptr = config.value_32bit; +                } else { +                    // fill with 16-bit values +                    for (u16* ptr = (u16*)start; ptr < (u16*)end; ++ptr) +                        *ptr = config.value_16bit;                  } -            } else if (config.fill_32bit) { -                // fill with 32-bit values -                for (u32* ptr = (u32*)start; ptr < (u32*)end; ++ptr) -                    *ptr = config.value_32bit; -            } else { -                // fill with 16-bit values -                for (u16* ptr = (u16*)start; ptr < (u16*)end; ++ptr) -                    *ptr = config.value_16bit; -            } -            LOG_TRACE(HW_GPU, "MemoryFill from 0x%08x to 0x%08x", config.GetStartAddress(), config.GetEndAddress()); +                LOG_TRACE(HW_GPU, "MemoryFill from 0x%08x to 0x%08x", config.GetStartAddress(), config.GetEndAddress()); -            config.trigger = 0; -            config.finished = 1; +                if (!is_second_filler) { +                    GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC0); +                } else { +                    GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC1); +                } -            if (!is_second_filler) { -                GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC0); -            } else { -                GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC1); +                VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetStartAddress(), config.GetEndAddress() - config.GetStartAddress());              } -            VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetStartAddress(), config.GetEndAddress() - config.GetStartAddress()); +            // Reset "trigger" flag and set the "finish" flag +            // NOTE: This was confirmed to happen on hardware even if "address_start" is zero. +            config.trigger = 0; +            config.finished = 1;          }          break;      } @@ -270,6 +279,7 @@ inline void Write(u32 addr, const T data) {                        config.GetPhysicalOutputAddress(), output_width, output_height,                        config.output_format.Value(), config.flags); +            g_regs.display_transfer_config.trigger = 0;              GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PPF);              VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetPhysicalOutputAddress(), output_size); @@ -284,7 +294,14 @@ inline void Write(u32 addr, const T data) {          if (config.trigger & 1)          {              u32* buffer = (u32*)Memory::GetPhysicalPointer(config.GetPhysicalAddress()); + +            if (Pica::g_debug_context && Pica::g_debug_context->recorder) { +                Pica::g_debug_context->recorder->MemoryAccessed((u8*)buffer, config.size * sizeof(u32), config.GetPhysicalAddress()); +            } +              Pica::CommandProcessor::ProcessCommandList(buffer, config.size); + +            g_regs.command_processor_config.trigger = 0;          }          break;      } @@ -292,6 +309,13 @@ inline void Write(u32 addr, const T data) {      default:          break;      } + +    // Notify tracer about the register write +    // This is happening *after* handling the write to make sure we properly catch all memory reads. +    if (Pica::g_debug_context && Pica::g_debug_context->recorder) { +        // addr + GPU VBase - IO VBase + IO PBase +        Pica::g_debug_context->recorder->RegisterWritten<T>(addr + 0x1EF00000 - 0x1EC00000 + 0x10100000, data); +    }  }  // Explicitly instantiate template functions because we aren't defining this in the header: diff --git a/src/core/hw/hw.cpp b/src/core/hw/hw.cpp index c7006a498..b5fdbf9c1 100644 --- a/src/core/hw/hw.cpp +++ b/src/core/hw/hw.cpp @@ -15,6 +15,21 @@ template <typename T>  inline void Read(T &var, const u32 addr) {      switch (addr & 0xFFFFF000) {      case VADDR_GPU: +    case VADDR_GPU + 0x1000: +    case VADDR_GPU + 0x2000: +    case VADDR_GPU + 0x3000: +    case VADDR_GPU + 0x4000: +    case VADDR_GPU + 0x5000: +    case VADDR_GPU + 0x6000: +    case VADDR_GPU + 0x7000: +    case VADDR_GPU + 0x8000: +    case VADDR_GPU + 0x9000: +    case VADDR_GPU + 0xA000: +    case VADDR_GPU + 0xB000: +    case VADDR_GPU + 0xC000: +    case VADDR_GPU + 0xD000: +    case VADDR_GPU + 0xE000: +    case VADDR_GPU + 0xF000:          GPU::Read(var, addr);          break;      case VADDR_LCD: @@ -29,6 +44,21 @@ template <typename T>  inline void Write(u32 addr, const T data) {      switch (addr & 0xFFFFF000) {      case VADDR_GPU: +    case VADDR_GPU + 0x1000: +    case VADDR_GPU + 0x2000: +    case VADDR_GPU + 0x3000: +    case VADDR_GPU + 0x4000: +    case VADDR_GPU + 0x5000: +    case VADDR_GPU + 0x6000: +    case VADDR_GPU + 0x7000: +    case VADDR_GPU + 0x8000: +    case VADDR_GPU + 0x9000: +    case VADDR_GPU + 0xA000: +    case VADDR_GPU + 0xB000: +    case VADDR_GPU + 0xC000: +    case VADDR_GPU + 0xD000: +    case VADDR_GPU + 0xE000: +    case VADDR_GPU + 0xF000:          GPU::Write(addr, data);          break;      case VADDR_LCD: diff --git a/src/core/hw/lcd.cpp b/src/core/hw/lcd.cpp index cdb757a18..6f93709e3 100644 --- a/src/core/hw/lcd.cpp +++ b/src/core/hw/lcd.cpp @@ -10,6 +10,9 @@  #include "core/hw/hw.h"  #include "core/hw/lcd.h" +#include "core/tracer/recorder.h" +#include "video_core/debug_utils/debug_utils.h" +  namespace LCD {  Regs g_regs; @@ -40,6 +43,13 @@ inline void Write(u32 addr, const T data) {      }      g_regs[index] = static_cast<u32>(data); + +    // Notify tracer about the register write +    // This is happening *after* handling the write to make sure we properly catch all memory reads. +    if (Pica::g_debug_context && Pica::g_debug_context->recorder) { +        // addr + GPU VBase - IO VBase + IO PBase +        Pica::g_debug_context->recorder->RegisterWritten<T>(addr + HW::VADDR_LCD - 0x1EC00000 + 0x10100000, data); +    }  }  // Explicitly instantiate template functions because we aren't defining this in the header: | 
