mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 01:50:38 +00:00
Extract out shader saving code into common pipeline state viewer
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user