Pica/citra-qt: Replace command list view and command list debugging code with something more sophisticated.
This commit is contained in:
parent
0465adf206
commit
26ade98411
8 changed files with 142 additions and 194 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue