diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index 9d7069b00..6af1c5d48 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -31,6 +31,7 @@ #include "Windows/MainWindow.h" #include "Windows/ShaderViewer.h" #include "Windows/TextureViewer.h" +#include "PipelineStateViewer.h" #include "ui_D3D11PipelineStateViewer.h" Q_DECLARE_METATYPE(ResourceId); @@ -73,8 +74,9 @@ struct ViewTag Q_DECLARE_METATYPE(ViewTag); -D3D11PipelineStateViewer::D3D11PipelineStateViewer(CaptureContext &ctx, QWidget *parent) - : QFrame(parent), ui(new Ui::D3D11PipelineStateViewer), m_Ctx(ctx) +D3D11PipelineStateViewer::D3D11PipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent) + : QFrame(parent), ui(new Ui::D3D11PipelineStateViewer), m_Ctx(ctx), m_Common(common) { ui->setupUi(this); @@ -2191,32 +2193,7 @@ void D3D11PipelineStateViewer::shaderSave_clicked() if(stage->Shader == ResourceId()) return; - QString filename = RDDialog::getSaveFileName(this, tr("Save Shader As"), QString(), - "DXBC Shader files (*.dxbc)"); - - if(filename != "") - { - QDir dirinfo = QFileInfo(filename).dir(); - if(dirinfo.exists()) - { - QFile f(filename); - if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) - { - f.write((const char *)shaderDetails->RawBytes.elems, (qint64)shaderDetails->RawBytes.count); - } - else - { - RDDialog::critical( - this, tr("Error saving shader"), - tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); - } - } - else - { - RDDialog::critical(this, tr("Invalid directory"), - tr("Cannot find target directory to save to")); - } - } + m_Common.SaveShaderFile(shaderDetails); } void D3D11PipelineStateViewer::on_exportHTML_clicked() diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h index ebf7bf966..593508181 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h @@ -35,13 +35,15 @@ class D3D11PipelineStateViewer; class RDTreeWidget; class QTreeWidgetItem; struct ViewTag; +class PipelineStateViewer; class D3D11PipelineStateViewer : public QFrame, public ILogViewerForm { Q_OBJECT public: - explicit D3D11PipelineStateViewer(CaptureContext &ctx, QWidget *parent = 0); + explicit D3D11PipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent = 0); ~D3D11PipelineStateViewer(); void OnLogfileLoaded(); @@ -63,6 +65,7 @@ private slots: // manual slots void shaderView_clicked(); void shaderEdit_clicked(); + void shaderSave_clicked(); void resource_itemActivated(QTreeWidgetItem *item, int column); void cbuffer_itemActivated(QTreeWidgetItem *item, int column); @@ -71,6 +74,7 @@ private slots: private: Ui::D3D11PipelineStateViewer *ui; CaptureContext &m_Ctx; + PipelineStateViewer &m_Common; enum D3DBufferViewFlags { diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 75cf0a222..495447c4d 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -31,6 +31,7 @@ #include "Windows/MainWindow.h" #include "Windows/ShaderViewer.h" #include "Windows/TextureViewer.h" +#include "PipelineStateViewer.h" #include "ui_D3D12PipelineStateViewer.h" Q_DECLARE_METATYPE(ResourceId); @@ -97,8 +98,9 @@ struct ViewTag Q_DECLARE_METATYPE(ViewTag); -D3D12PipelineStateViewer::D3D12PipelineStateViewer(CaptureContext &ctx, QWidget *parent) - : QFrame(parent), ui(new Ui::D3D12PipelineStateViewer), m_Ctx(ctx) +D3D12PipelineStateViewer::D3D12PipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent) + : QFrame(parent), ui(new Ui::D3D12PipelineStateViewer), m_Ctx(ctx), m_Common(common) { ui->setupUi(this); @@ -2185,32 +2187,7 @@ void D3D12PipelineStateViewer::shaderSave_clicked() if(stage->Shader == ResourceId()) return; - QString filename = RDDialog::getSaveFileName(this, tr("Save Shader As"), QString(), - "DXBC Shader files (*.dxbc)"); - - if(filename != "") - { - QDir dirinfo = QFileInfo(filename).dir(); - if(dirinfo.exists()) - { - QFile f(filename); - if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) - { - f.write((const char *)shaderDetails->RawBytes.elems, (qint64)shaderDetails->RawBytes.count); - } - else - { - RDDialog::critical( - this, tr("Error saving shader"), - tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); - } - } - else - { - RDDialog::critical(this, tr("Invalid directory"), - tr("Cannot find target directory to save to")); - } - } + m_Common.SaveShaderFile(shaderDetails); } void D3D12PipelineStateViewer::on_exportHTML_clicked() diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h index b828f01b2..745b45ab9 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h @@ -35,13 +35,15 @@ class D3D12PipelineStateViewer; class RDTreeWidget; class QTreeWidgetItem; struct ViewTag; +class PipelineStateViewer; class D3D12PipelineStateViewer : public QFrame, public ILogViewerForm { Q_OBJECT public: - explicit D3D12PipelineStateViewer(CaptureContext &ctx, QWidget *parent = 0); + explicit D3D12PipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent = 0); ~D3D12PipelineStateViewer(); void OnLogfileLoaded(); @@ -71,6 +73,7 @@ private slots: private: Ui::D3D12PipelineStateViewer *ui; CaptureContext &m_Ctx; + PipelineStateViewer &m_Common; enum D3DBufferViewFlags { diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index d5e0a68b5..f37efdc8a 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -31,6 +31,7 @@ #include "Windows/MainWindow.h" #include "Windows/ShaderViewer.h" #include "Windows/TextureViewer.h" +#include "PipelineStateViewer.h" #include "ui_GLPipelineStateViewer.h" Q_DECLARE_METATYPE(ResourceId); @@ -72,8 +73,9 @@ struct ReadWriteTag Q_DECLARE_METATYPE(ReadWriteTag); -GLPipelineStateViewer::GLPipelineStateViewer(CaptureContext &ctx, QWidget *parent) - : QFrame(parent), ui(new Ui::GLPipelineStateViewer), m_Ctx(ctx) +GLPipelineStateViewer::GLPipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent) + : QFrame(parent), ui(new Ui::GLPipelineStateViewer), m_Ctx(ctx), m_Common(common) { ui->setupUi(this); @@ -2282,32 +2284,7 @@ void GLPipelineStateViewer::shaderSave_clicked() if(stage->Shader == ResourceId()) return; - QString filename = - RDDialog::getSaveFileName(this, tr("Save Shader As"), QString(), "GLSL files (*.glsl)"); - - if(filename != "") - { - QDir dirinfo = QFileInfo(filename).dir(); - if(dirinfo.exists()) - { - QFile f(filename); - if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) - { - f.write((const char *)shaderDetails->RawBytes.elems, (qint64)shaderDetails->RawBytes.count); - } - else - { - RDDialog::critical( - this, tr("Error saving shader"), - tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); - } - } - else - { - RDDialog::critical(this, tr("Invalid directory"), - tr("Cannot find target directory to save to")); - } - } + m_Common.SaveShaderFile(shaderDetails); } void GLPipelineStateViewer::on_exportHTML_clicked() diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h index af843ba55..065b0ecc5 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h @@ -34,13 +34,15 @@ class GLPipelineStateViewer; class RDTreeWidget; class QTreeWidgetItem; +class PipelineStateViewer; class GLPipelineStateViewer : public QFrame, public ILogViewerForm { Q_OBJECT public: - explicit GLPipelineStateViewer(CaptureContext &ctx, QWidget *parent = 0); + explicit GLPipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent = 0); ~GLPipelineStateViewer(); void OnLogfileLoaded(); @@ -70,6 +72,7 @@ private slots: private: Ui::GLPipelineStateViewer *ui; CaptureContext &m_Ctx; + PipelineStateViewer &m_Common; enum class GLReadWriteType { diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index 9b3da2eed..184ec5719 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -140,7 +140,7 @@ void PipelineStateViewer::setToD3D11() reset(); - m_D3D11 = new D3D11PipelineStateViewer(m_Ctx, this); + m_D3D11 = new D3D11PipelineStateViewer(m_Ctx, *this, this); ui->layout->addWidget(m_D3D11); m_Current = m_D3D11; m_Ctx.CurPipelineState.DefaultType = eGraphicsAPI_D3D11; @@ -153,7 +153,7 @@ void PipelineStateViewer::setToD3D12() reset(); - m_D3D12 = new D3D12PipelineStateViewer(m_Ctx, this); + m_D3D12 = new D3D12PipelineStateViewer(m_Ctx, *this, this); ui->layout->addWidget(m_D3D12); m_Current = m_D3D12; m_Ctx.CurPipelineState.DefaultType = eGraphicsAPI_D3D12; @@ -166,7 +166,7 @@ void PipelineStateViewer::setToGL() reset(); - m_GL = new GLPipelineStateViewer(m_Ctx, this); + m_GL = new GLPipelineStateViewer(m_Ctx, *this, this); ui->layout->addWidget(m_GL); m_Current = m_GL; m_Ctx.CurPipelineState.DefaultType = eGraphicsAPI_OpenGL; @@ -179,8 +179,58 @@ void PipelineStateViewer::setToVulkan() reset(); - m_Vulkan = new VulkanPipelineStateViewer(m_Ctx, this); + m_Vulkan = new VulkanPipelineStateViewer(m_Ctx, *this, this); ui->layout->addWidget(m_Vulkan); m_Current = m_Vulkan; m_Ctx.CurPipelineState.DefaultType = eGraphicsAPI_Vulkan; -} + +bool PipelineStateViewer::SaveShaderFile(const ShaderReflection *shader) +{ + if(!shader) + return false; + + QString filter; + + if(m_Ctx.CurPipelineState.IsLogD3D11() || m_Ctx.CurPipelineState.IsLogD3D12()) + { + filter = tr("DXBC Shader files (*.dxbc)"); + } + else if(m_Ctx.CurPipelineState.IsLogGL()) + { + filter = tr("GLSL files (*.glsl)"); + } + else if(m_Ctx.CurPipelineState.IsLogVK()) + { + filter = tr("SPIR-V files (*.spv)"); + } + + QString filename = RDDialog::getSaveFileName(this, tr("Save Shader As"), QString(), filter); + + if(filename != "") + { + QDir dirinfo = QFileInfo(filename).dir(); + if(dirinfo.exists()) + { + QFile f(filename); + if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + f.write((const char *)shader->RawBytes.elems, (qint64)shader->RawBytes.count); + } + else + { + RDDialog::critical( + this, tr("Error saving shader"), + tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); + return false; + } + } + else + { + RDDialog::critical(this, tr("Invalid directory"), + tr("Cannot find target directory to save to")); + return false; + } + } + + return true; +} \ No newline at end of file diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h index 5fe1debee..9c0b85519 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h @@ -55,6 +55,8 @@ public: QVariant persistData(); void setPersistData(const QVariant &persistData); + bool SaveShaderFile(const ShaderReflection *shader); + private: Ui::PipelineStateViewer *ui; CaptureContext &m_Ctx; diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index b6ed414f3..c0b9a6575 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -31,6 +31,7 @@ #include "Windows/MainWindow.h" #include "Windows/ShaderViewer.h" #include "Windows/TextureViewer.h" +#include "PipelineStateViewer.h" #include "ui_VulkanPipelineStateViewer.h" Q_DECLARE_METATYPE(ResourceId); @@ -90,8 +91,9 @@ struct BufferTag Q_DECLARE_METATYPE(BufferTag); -VulkanPipelineStateViewer::VulkanPipelineStateViewer(CaptureContext &ctx, QWidget *parent) - : QFrame(parent), ui(new Ui::VulkanPipelineStateViewer), m_Ctx(ctx) +VulkanPipelineStateViewer::VulkanPipelineStateViewer(CaptureContext &ctx, + PipelineStateViewer &common, QWidget *parent) + : QFrame(parent), ui(new Ui::VulkanPipelineStateViewer), m_Ctx(ctx), m_Common(common) { ui->setupUi(this); @@ -2384,32 +2386,7 @@ void VulkanPipelineStateViewer::shaderSave_clicked() if(stage->Shader == ResourceId()) return; - QString filename = - RDDialog::getSaveFileName(this, tr("Save Shader As"), QString(), "SPIR-V files (*.spv)"); - - if(filename != "") - { - QDir dirinfo = QFileInfo(filename).dir(); - if(dirinfo.exists()) - { - QFile f(filename); - if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) - { - f.write((const char *)shaderDetails->RawBytes.elems, (qint64)shaderDetails->RawBytes.count); - } - else - { - RDDialog::critical( - this, tr("Error saving shader"), - tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); - } - } - else - { - RDDialog::critical(this, tr("Invalid directory"), - tr("Cannot find target directory to save to")); - } - } + m_Common.SaveShaderFile(shaderDetails); } void VulkanPipelineStateViewer::on_exportHTML_clicked() diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h index 7bc338124..a24aef42b 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h @@ -34,6 +34,7 @@ class VulkanPipelineStateViewer; class RDTreeWidget; class QTreeWidgetItem; +class PipelineStateViewer; struct SamplerData { @@ -47,7 +48,8 @@ class VulkanPipelineStateViewer : public QFrame, public ILogViewerForm Q_OBJECT public: - explicit VulkanPipelineStateViewer(CaptureContext &ctx, QWidget *parent = 0); + explicit VulkanPipelineStateViewer(CaptureContext &ctx, PipelineStateViewer &common, + QWidget *parent = 0); ~VulkanPipelineStateViewer(); void OnLogfileLoaded(); @@ -77,6 +79,7 @@ private slots: private: Ui::VulkanPipelineStateViewer *ui; CaptureContext &m_Ctx; + PipelineStateViewer &m_Common; QVariantList makeSampler( const QString &bindset, const QString &slotname,