Pica/citra-qt: Replace command list view and command list debugging code with something more sophisticated.

This commit is contained in:
Tony Wasserka 2014-08-14 19:21:55 +02:00
parent 0465adf206
commit 26ade98411
8 changed files with 142 additions and 194 deletions

View file

@ -4,6 +4,7 @@
#include <algorithm>
#include <fstream>
#include <mutex>
#include <string>
#include "video_core/pica.h"
@ -260,6 +261,60 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
}
}
static std::unique_ptr<PicaTrace> pica_trace;
static std::mutex pica_trace_mutex;
static int is_pica_tracing = false;
void StartPicaTracing()
{
if (is_pica_tracing) {
ERROR_LOG(GPU, "StartPicaTracing called even though tracing already running!");
return;
}
pica_trace_mutex.lock();
pica_trace = std::unique_ptr<PicaTrace>(new PicaTrace);
is_pica_tracing = true;
pica_trace_mutex.unlock();
}
bool IsPicaTracing()
{
return is_pica_tracing;
}
void OnPicaRegWrite(u32 id, u32 value)
{
// Double check for is_pica_tracing to avoid pointless locking overhead
if (!is_pica_tracing)
return;
std::unique_lock<std::mutex> lock(pica_trace_mutex);
if (!is_pica_tracing)
return;
pica_trace->writes.push_back({id, value});
}
std::unique_ptr<PicaTrace> FinishPicaTracing()
{
if (!is_pica_tracing) {
ERROR_LOG(GPU, "FinishPicaTracing called even though tracing already running!");
return {};
}
// signalize that no further tracing should be performed
is_pica_tracing = false;
// Wait until running tracing is finished
pica_trace_mutex.lock();
std::unique_ptr<PicaTrace> ret(std::move(pica_trace));
pica_trace_mutex.unlock();
return std::move(ret);
}
} // namespace
} // namespace

View file

@ -5,6 +5,7 @@
#pragma once
#include <array>
#include <memory>
#include <vector>
#include "video_core/pica.h"
@ -38,6 +39,26 @@ private:
void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data, u32 swizzle_size,
u32 main_offset, const Regs::VSOutputAttributes* output_attributes);
// Utility class to log Pica commands.
struct PicaTrace {
struct Write : public std::pair<u32,u32> {
Write(u32 id, u32 value) : std::pair<u32,u32>(id, value) {}
u32& Id() { return first; }
const u32& Id() const { return first; }
u32& Value() { return second; }
const u32& Value() const { return second; }
};
std::vector<Write> writes;
};
void StartPicaTracing();
bool IsPicaTracing();
void OnPicaRegWrite(u32 id, u32 value);
std::unique_ptr<PicaTrace> FinishPicaTracing();
} // namespace
} // namespace