From 2a6a0f0f957faa08a1280557b27f12c4031ce043 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 8 Jun 2018 19:20:50 +0100 Subject: [PATCH] Support local variables in watch expressions --- qrenderdoc/Windows/ShaderViewer.cpp | 49 ++++++++++++++++++++++++++++- qrenderdoc/Windows/ShaderViewer.h | 1 + 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index 26c5dbbee..baef5a687 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -1459,7 +1459,7 @@ void ShaderViewer::combineStructures(RDTreeWidgetItem *root) }); // create a new parent with just the prefix - QVariantList values = {isArray ? name : name.mid(0, sepIndex)}; + QVariantList values = {name.mid(0, sepIndex)}; for(int i = 1; i < child->dataCount(); i++) values.push_back(QVariant()); RDTreeWidgetItem *parent = new RDTreeWidgetItem(values); @@ -1493,6 +1493,21 @@ void ShaderViewer::combineStructures(RDTreeWidgetItem *root) root->addChild(temp.takeChild(0)); } +RDTreeWidgetItem *ShaderViewer::findLocal(RDTreeWidgetItem *root, QString name) +{ + if(root->tag().toString() == name) + return root; + + for(int i = 0; i < root->childCount(); i++) + { + RDTreeWidgetItem *ret = findLocal(root->child(i), name); + if(ret) + return ret; + } + + return NULL; +} + void ShaderViewer::updateDebugging() { if(!m_Trace || m_CurrentStep < 0 || m_CurrentStep >= m_Trace->states.count()) @@ -1857,6 +1872,8 @@ void ShaderViewer::updateDebugging() RDTreeWidgetItem *node = new RDTreeWidgetItem({localName, regNames, typeName, value}); + node->setTag(localName); + if(modified) node->setForegroundColor(QColor(Qt::red)); @@ -2133,6 +2150,36 @@ void ShaderViewer::updateDebugging() continue; } } + else + { + regexp = QRegularExpression(lit("^(.+)(\\.[xyzwrgba]+)?(,[xfiudb])?$")); + + match = regexp.match(reg); + + if(match.hasMatch()) + { + QString variablename = match.captured(1); + + RDTreeWidgetItem *local = findLocal(ui->locals->invisibleRootItem(), match.captured(1)); + + if(local) + { + // TODO apply swizzle/typecast ? + + if(local->childCount() > 0) + { + // can't display structs + ui->watch->setItem(i, 2, new QTableWidgetItem(lit("{...}"))); + } + else + { + ui->watch->setItem(i, 2, new QTableWidgetItem(local->text(3))); + } + + continue; + } + } + } ui->watch->setItem(i, 2, new QTableWidgetItem(tr("Error evaluating expression"))); } diff --git a/qrenderdoc/Windows/ShaderViewer.h b/qrenderdoc/Windows/ShaderViewer.h index 9a8b6f727..1dc5e2dd6 100644 --- a/qrenderdoc/Windows/ShaderViewer.h +++ b/qrenderdoc/Windows/ShaderViewer.h @@ -252,4 +252,5 @@ private: RDTreeWidgetItem *makeResourceRegister(const Bindpoint &bind, uint32_t idx, const BoundResource &ro, const ShaderResource &resources); void combineStructures(RDTreeWidgetItem *root); + RDTreeWidgetItem *findLocal(RDTreeWidgetItem *root, QString name); };