Extract out shader saving code into common pipeline state viewer

This commit is contained in:
baldurk
2017-02-10 21:41:44 +00:00
parent 73a694904a
commit 235167f6df
10 changed files with 94 additions and 121 deletions
@@ -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()
@@ -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
{
@@ -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()
@@ -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
{
@@ -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()
@@ -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
{
@@ -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;
}
@@ -55,6 +55,8 @@ public:
QVariant persistData();
void setPersistData(const QVariant &persistData);
bool SaveShaderFile(const ShaderReflection *shader);
private:
Ui::PipelineStateViewer *ui;
CaptureContext &m_Ctx;
@@ -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()
@@ -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,