citra-qt: Improve shader debugger.

Now supports dumping the current shader and recognizes a larger number of output semantics.
master
Tony Wasserka 2015-05-27 16:20:46 +07:00
parent 6a5d560c4f
commit 4cb302c8ae
6 changed files with 48 additions and 16 deletions

@ -6,6 +6,8 @@
#include <sstream> #include <sstream>
#include <QBoxLayout> #include <QBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QTreeView> #include <QTreeView>
#include "video_core/shader/shader_interpreter.h" #include "video_core/shader/shader_interpreter.h"
@ -253,18 +255,27 @@ void GraphicsVertexShaderModel::OnUpdate()
info.Clear(); info.Clear();
for (auto instr : Pica::g_state.vs.program_code) auto& shader_setup = Pica::g_state.vs;
for (auto instr : shader_setup.program_code)
info.code.push_back({instr}); info.code.push_back({instr});
for (auto pattern : Pica::g_state.vs.swizzle_data) for (auto pattern : shader_setup.swizzle_data)
info.swizzle_info.push_back({pattern}); info.swizzle_info.push_back({pattern});
info.labels.insert({ Pica::g_state.regs.vs.main_offset, "main" }); u32 entry_point = Pica::g_state.regs.vs.main_offset;
info.labels.insert({ entry_point, "main" });
endResetModel(); endResetModel();
} }
void GraphicsVertexShaderModel::DumpShader() {
auto& setup = Pica::g_state.vs;
auto& config = Pica::g_state.regs.vs;
Pica::DebugUtils::DumpShader(setup.program_code.data(), setup.program_code.size(),
setup.swizzle_data.data(), setup.swizzle_data.size(),
config.main_offset, Pica::g_state.regs.vs_output_attributes);
}
GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::DebugContext > debug_context, GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::DebugContext > debug_context,
QWidget* parent) QWidget* parent)
: BreakPointObserverDock(debug_context, "Pica Vertex Shader", parent) { : BreakPointObserverDock(debug_context, "Pica Vertex Shader", parent) {
@ -276,6 +287,9 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::De
binary_list->setRootIsDecorated(false); binary_list->setRootIsDecorated(false);
binary_list->setAlternatingRowColors(true); binary_list->setAlternatingRowColors(true);
auto dump_shader = new QPushButton(tr("Dump"));
connect(dump_shader, SIGNAL(clicked()), binary_model, SLOT(DumpShader()));
connect(this, SIGNAL(Update()), binary_model, SLOT(OnUpdate())); connect(this, SIGNAL(Update()), binary_model, SLOT(OnUpdate()));
auto main_widget = new QWidget; auto main_widget = new QWidget;
@ -285,6 +299,7 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget(std::shared_ptr< Pica::De
sub_layout->addWidget(binary_list); sub_layout->addWidget(binary_list);
main_layout->addLayout(sub_layout); main_layout->addLayout(sub_layout);
} }
main_layout->addWidget(dump_shader);
main_widget->setLayout(main_layout); main_widget->setLayout(main_layout);
setWidget(main_widget); setWidget(main_widget);
} }

@ -26,6 +26,8 @@ public:
public slots: public slots:
void OnUpdate(); void OnUpdate();
void DumpShader();
private: private:
nihstro::ShaderInfo info; nihstro::ShaderInfo info;
}; };

@ -132,10 +132,13 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
union OutputRegisterInfo { union OutputRegisterInfo {
enum Type : u64 { enum Type : u64 {
POSITION = 0, POSITION = 0,
QUATERNION = 1,
COLOR = 2, COLOR = 2,
TEXCOORD0 = 3, TEXCOORD0 = 3,
TEXCOORD1 = 5, TEXCOORD1 = 5,
TEXCOORD2 = 6, TEXCOORD2 = 6,
VIEW = 8,
}; };
BitField< 0, 64, u64> hex; BitField< 0, 64, u64> hex;
@ -157,6 +160,10 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
{ OutputAttributes::POSITION_Y, { OutputRegisterInfo::POSITION, 2} }, { OutputAttributes::POSITION_Y, { OutputRegisterInfo::POSITION, 2} },
{ OutputAttributes::POSITION_Z, { OutputRegisterInfo::POSITION, 4} }, { OutputAttributes::POSITION_Z, { OutputRegisterInfo::POSITION, 4} },
{ OutputAttributes::POSITION_W, { OutputRegisterInfo::POSITION, 8} }, { OutputAttributes::POSITION_W, { OutputRegisterInfo::POSITION, 8} },
{ OutputAttributes::QUATERNION_X, { OutputRegisterInfo::QUATERNION, 1} },
{ OutputAttributes::QUATERNION_Y, { OutputRegisterInfo::QUATERNION, 2} },
{ OutputAttributes::QUATERNION_Z, { OutputRegisterInfo::QUATERNION, 4} },
{ OutputAttributes::QUATERNION_W, { OutputRegisterInfo::QUATERNION, 8} },
{ OutputAttributes::COLOR_R, { OutputRegisterInfo::COLOR, 1} }, { OutputAttributes::COLOR_R, { OutputRegisterInfo::COLOR, 1} },
{ OutputAttributes::COLOR_G, { OutputRegisterInfo::COLOR, 2} }, { OutputAttributes::COLOR_G, { OutputRegisterInfo::COLOR, 2} },
{ OutputAttributes::COLOR_B, { OutputRegisterInfo::COLOR, 4} }, { OutputAttributes::COLOR_B, { OutputRegisterInfo::COLOR, 4} },
@ -166,7 +173,10 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
{ OutputAttributes::TEXCOORD1_U, { OutputRegisterInfo::TEXCOORD1, 1} }, { OutputAttributes::TEXCOORD1_U, { OutputRegisterInfo::TEXCOORD1, 1} },
{ OutputAttributes::TEXCOORD1_V, { OutputRegisterInfo::TEXCOORD1, 2} }, { OutputAttributes::TEXCOORD1_V, { OutputRegisterInfo::TEXCOORD1, 2} },
{ OutputAttributes::TEXCOORD2_U, { OutputRegisterInfo::TEXCOORD2, 1} }, { OutputAttributes::TEXCOORD2_U, { OutputRegisterInfo::TEXCOORD2, 1} },
{ OutputAttributes::TEXCOORD2_V, { OutputRegisterInfo::TEXCOORD2, 2} } { OutputAttributes::TEXCOORD2_V, { OutputRegisterInfo::TEXCOORD2, 2} },
{ OutputAttributes::VIEW_X, { OutputRegisterInfo::VIEW, 1} },
{ OutputAttributes::VIEW_Y, { OutputRegisterInfo::VIEW, 2} },
{ OutputAttributes::VIEW_Z, { OutputRegisterInfo::VIEW, 4} }
}; };
for (const auto& semantic : std::vector<OutputAttributes::Semantic>{ for (const auto& semantic : std::vector<OutputAttributes::Semantic>{
@ -239,6 +249,7 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
// TODO: Create a label table for "main" // TODO: Create a label table for "main"
// TODO: Write uniforms as constants
// Write data to file // Write data to file
static int dump_index = 0; static int dump_index = 0;

@ -158,7 +158,6 @@ extern std::shared_ptr<DebugContext> g_debug_context; // TODO: Get rid of this g
namespace DebugUtils { namespace DebugUtils {
#define PICA_DUMP_GEOMETRY 0 #define PICA_DUMP_GEOMETRY 0
#define PICA_DUMP_SHADERS 0
#define PICA_DUMP_TEXTURES 0 #define PICA_DUMP_TEXTURES 0
#define PICA_LOG_TEV 0 #define PICA_LOG_TEV 0

@ -80,6 +80,11 @@ struct Regs {
POSITION_Z = 2, POSITION_Z = 2,
POSITION_W = 3, POSITION_W = 3,
QUATERNION_X = 4,
QUATERNION_Y = 5,
QUATERNION_Z = 6,
QUATERNION_W = 7,
COLOR_R = 8, COLOR_R = 8,
COLOR_G = 9, COLOR_G = 9,
COLOR_B = 10, COLOR_B = 10,
@ -89,6 +94,12 @@ struct Regs {
TEXCOORD0_V = 13, TEXCOORD0_V = 13,
TEXCOORD1_U = 14, TEXCOORD1_U = 14,
TEXCOORD1_V = 15, TEXCOORD1_V = 15,
// TODO: Not verified
VIEW_X = 18,
VIEW_Y = 19,
VIEW_Z = 20,
TEXCOORD2_U = 22, TEXCOORD2_U = 22,
TEXCOORD2_V = 23, TEXCOORD2_V = 23,

@ -96,12 +96,6 @@ OutputVertex Run(UnitState& state, const InputVertex& input, int num_attributes)
RunInterpreter(state); RunInterpreter(state);
#endif // ARCHITECTURE_x86_64 #endif // ARCHITECTURE_x86_64
#if PICA_DUMP_SHADERS
DebugUtils::DumpShader(setup.program_code.data(), state.debug.max_offset, setup.swizzle_data.data(),
state.debug.max_opdesc_id, config.main_offset,
g_state.regs.vs_output_attributes); // TODO: Don't hardcode VS here
#endif
// Setup output data // Setup output data
OutputVertex ret; OutputVertex ret;
// TODO(neobrain): Under some circumstances, up to 16 attributes may be output. We need to // TODO(neobrain): Under some circumstances, up to 16 attributes may be output. We need to