From 1c61b82221b83b1fc764b333d85a4c07c77dea64 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 11 Nov 2016 14:27:36 +0100 Subject: [PATCH] Add stub ToStr copied functions to fix up some implementations * Eventually the main project's ToStr will move into a header file so that we don't have to duplicate any code. --- qrenderdoc/Code/CaptureContext.cpp | 4 +- qrenderdoc/Code/QRDUtils.cpp | 146 ++++++++++++++++++ qrenderdoc/Code/QRDUtils.h | 122 +++++++++++++++ qrenderdoc/Code/RenderManager.h | 35 ++++- .../Windows/Dialogs/TextureSaveDialog.cpp | 71 +++++---- .../Windows/Dialogs/TextureSaveDialog.h | 3 + qrenderdoc/Windows/TextureViewer.cpp | 9 +- renderdoc/api/replay/replay_enums.h | 7 + 8 files changed, 354 insertions(+), 43 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index 1a8cf308f..88a809792 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -171,9 +171,7 @@ void CaptureContext::LoadLogfileThreaded(const QString &logFile, const QString & if(!m_Renderer.IsRunning()) { QString errmsg = "Unknown error message"; - - // TODO ToStr - // errmsg = m_Renderer.GetCreateStatus(); + errmsg = ToQStr(m_Renderer.GetCreateStatus()); progressThread.acquire(); progressTickerThread.wait(); diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index adf0d910f..bcd154cda 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -28,6 +28,152 @@ #include #include +QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype) +{ + if(IsD3D(apitype)) + { + switch(usage) + { + case eUsage_VertexBuffer: return "Vertex Buffer"; + case eUsage_IndexBuffer: return "Index Buffer"; + + case eUsage_VS_Constants: return "VS - Constant Buffer"; + case eUsage_GS_Constants: return "GS - Constant Buffer"; + case eUsage_HS_Constants: return "HS - Constant Buffer"; + case eUsage_DS_Constants: return "DS - Constant Buffer"; + case eUsage_CS_Constants: return "CS - Constant Buffer"; + case eUsage_PS_Constants: return "PS - Constant Buffer"; + case eUsage_All_Constants: return "All - Constant Buffer"; + + case eUsage_SO: return "Stream Out"; + + case eUsage_VS_Resource: return "VS - Resource"; + case eUsage_GS_Resource: return "GS - Resource"; + case eUsage_HS_Resource: return "HS - Resource"; + case eUsage_DS_Resource: return "DS - Resource"; + case eUsage_CS_Resource: return "CS - Resource"; + case eUsage_PS_Resource: return "PS - Resource"; + case eUsage_All_Resource: return "All - Resource"; + + case eUsage_VS_RWResource: return "VS - UAV"; + case eUsage_HS_RWResource: return "HS - UAV"; + case eUsage_DS_RWResource: return "DS - UAV"; + case eUsage_GS_RWResource: return "GS - UAV"; + case eUsage_PS_RWResource: return "PS - UAV"; + case eUsage_CS_RWResource: return "CS - UAV"; + case eUsage_All_RWResource: return "All - UAV"; + + case eUsage_InputTarget: return "Colour Input"; + case eUsage_ColourTarget: return "Rendertarget"; + case eUsage_DepthStencilTarget: return "Depthstencil"; + + case eUsage_Indirect: return "Indirect argument"; + + case eUsage_Clear: return "Clear"; + + case eUsage_GenMips: return "Generate Mips"; + case eUsage_Resolve: return "Resolve"; + case eUsage_ResolveSrc: return "Resolve - Source"; + case eUsage_ResolveDst: return "Resolve - Dest"; + case eUsage_Copy: return "Copy"; + case eUsage_CopySrc: return "Copy - Source"; + case eUsage_CopyDst: return "Copy - Dest"; + + case eUsage_Barrier: return "Barrier"; + default: break; + } + } + else if(apitype == eGraphicsAPI_OpenGL || apitype == eGraphicsAPI_Vulkan) + { + const bool vk = (apitype == eGraphicsAPI_Vulkan); + + switch(usage) + { + case eUsage_VertexBuffer: return "Vertex Buffer"; + case eUsage_IndexBuffer: return "Index Buffer"; + + case eUsage_VS_Constants: return "VS - Uniform Buffer"; + case eUsage_GS_Constants: return "GS - Uniform Buffer"; + case eUsage_HS_Constants: return "HS - Uniform Buffer"; + case eUsage_DS_Constants: return "DS - Uniform Buffer"; + case eUsage_CS_Constants: return "CS - Uniform Buffer"; + case eUsage_PS_Constants: return "PS - Uniform Buffer"; + case eUsage_All_Constants: return "All - Uniform Buffer"; + + case eUsage_SO: return "Transform Feedback"; + + case eUsage_VS_Resource: return "VS - Texture"; + case eUsage_GS_Resource: return "GS - Texture"; + case eUsage_HS_Resource: return "HS - Texture"; + case eUsage_DS_Resource: return "DS - Texture"; + case eUsage_CS_Resource: return "CS - Texture"; + case eUsage_PS_Resource: return "PS - Texture"; + case eUsage_All_Resource: return "All - Texture"; + + case eUsage_VS_RWResource: return "VS - Image/SSBO"; + case eUsage_HS_RWResource: return "HS - Image/SSBO"; + case eUsage_DS_RWResource: return "DS - Image/SSBO"; + case eUsage_GS_RWResource: return "GS - Image/SSBO"; + case eUsage_PS_RWResource: return "PS - Image/SSBO"; + case eUsage_CS_RWResource: return "CS - Image/SSBO"; + case eUsage_All_RWResource: return "All - Image/SSBO"; + + case eUsage_InputTarget: return "FBO Input"; + case eUsage_ColourTarget: return "FBO Colour"; + case eUsage_DepthStencilTarget: return "FBO Depthstencil"; + + case eUsage_Indirect: return "Indirect argument"; + + case eUsage_Clear: return "Clear"; + + case eUsage_GenMips: return "Generate Mips"; + case eUsage_Resolve: return vk ? "Resolve" : "Framebuffer blit"; + case eUsage_ResolveSrc: return vk ? "Resolve - Source" : "Framebuffer blit - Source"; + case eUsage_ResolveDst: return vk ? "Resolve - Dest" : "Framebuffer blit - Dest"; + case eUsage_Copy: return "Copy"; + case eUsage_CopySrc: return "Copy - Source"; + case eUsage_CopyDst: return "Copy - Dest"; + + case eUsage_Barrier: return "Barrier"; + default: break; + } + } + + return "Unknown"; +} + +QString ToQStr(const ShaderStageType stage, const GraphicsAPI apitype) +{ + if(IsD3D(apitype)) + { + switch(stage) + { + case eShaderStage_Vertex: return "Vertex"; + case eShaderStage_Hull: return "Hull"; + case eShaderStage_Domain: return "Domain"; + case eShaderStage_Geometry: return "Geometry"; + case eShaderStage_Pixel: return "Pixel"; + case eShaderStage_Compute: return "Compute"; + default: break; + } + } + else if(apitype == eGraphicsAPI_OpenGL || apitype == eGraphicsAPI_Vulkan) + { + switch(stage) + { + case eShaderStage_Vertex: return "Vertex"; + case eShaderStage_Tess_Control: return "Tess. Control"; + case eShaderStage_Tess_Eval: return "Tess. Eval"; + case eShaderStage_Geometry: return "Geometry"; + case eShaderStage_Fragment: return "Fragment"; + case eShaderStage_Compute: return "Compute"; + default: break; + } + } + + return "Unknown"; +} + bool SaveToJSON(QVariantMap &data, QIODevice &f, const char *magicIdentifier, uint32_t magicVersion) { // marker that this data is valid diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index 55ac0fc69..406510f00 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -28,6 +28,128 @@ #include #include #include +#include "renderdoc_replay.h" + +// total hack, expose the same basic interface as on renderdoc side. +// Eventually we want to move the code in the main project into header-only +// and .inl implementations for at least the public API, so it can be compiled +// directly without duplication + +struct ToStr +{ + static std::string Get(const ReplayCreateStatus &el) + { + switch(el) + { + case eReplayCreate_Success: return "Success"; + case eReplayCreate_UnknownError: return "Unknown error"; + case eReplayCreate_InternalError: return "Internal error"; + case eReplayCreate_FileNotFound: return "File not found"; + case eReplayCreate_InjectionFailed: return "RenderDoc injection failed"; + case eReplayCreate_IncompatibleProcess: return "Process is incompatible"; + case eReplayCreate_NetworkIOFailed: return "Network I/O operation failed"; + case eReplayCreate_NetworkRemoteBusy: return "Remote side of network connection is busy"; + case eReplayCreate_NetworkVersionMismatch: return "Version mismatch between network clients"; + case eReplayCreate_FileIOFailed: return "File I/O failed"; + case eReplayCreate_FileIncompatibleVersion: return "File of incompatible version"; + case eReplayCreate_FileCorrupted: return "File corrupted"; + case eReplayCreate_APIUnsupported: return "API unsupported"; + case eReplayCreate_APIInitFailed: return "API initialisation failed"; + case eReplayCreate_APIIncompatibleVersion: return "API incompatible version"; + case eReplayCreate_APIHardwareUnsupported: return "API hardware unsupported"; + default: break; + } + return "Invalid error code"; + } + + static std::string Get(const FormatComponentType &el) + { + switch(el) + { + case eCompType_None: return "Typeless"; + case eCompType_Float: return "Float"; + case eCompType_UNorm: return "UNorm"; + case eCompType_SNorm: return "SNorm"; + case eCompType_UInt: return "UInt"; + case eCompType_SInt: return "SInt"; + case eCompType_UScaled: return "UScaled"; + case eCompType_SScaled: return "SScaled"; + case eCompType_Depth: return "Depth/Stencil"; + case eCompType_Double: return "Double"; + default: break; + } + return "Invalid component type"; + } + + static std::string Get(const FileType &el) + { + switch(el) + { + case eFileType_DDS: return "DDS"; + case eFileType_PNG: return "PNG"; + case eFileType_JPG: return "JPG"; + case eFileType_BMP: return "BMP"; + case eFileType_TGA: return "TGA"; + case eFileType_HDR: return "HDR"; + case eFileType_EXR: return "EXR"; + default: break; + } + return "Invalid file type"; + } + + static std::string Get(const AlphaMapping &el) + { + switch(el) + { + case eAlphaMap_Discard: return "Discard"; + case eAlphaMap_BlendToColour: return "Blend to Colour"; + case eAlphaMap_BlendToCheckerboard: return "Blend to Checkerboard"; + case eAlphaMap_Preserve: return "Preserve"; + default: break; + } + return "Invalid mapping"; + } + + static std::string Get(const EnvironmentModificationType &el) + { + switch(el) + { + case eEnvMod_Set: return "Set"; + case eEnvMod_Append: return "Append"; + case eEnvMod_Prepend: return "Prepend"; + default: break; + } + return "Invalid modification"; + } + + static std::string Get(const EnvironmentSeparator &el) + { + switch(el) + { + case eEnvSep_Platform: return "Platform style"; + case eEnvSep_SemiColon: return "Semi-colon (;)"; + case eEnvSep_Colon: return "Colon (:)"; + case eEnvSep_None: return "No Separator"; + default: break; + } + return "Invalid separator"; + } +}; + +// this will be here to lighten the burden of converting from std::string to +// QString everywhere. + +template +QString ToQStr(const T &el) +{ + return QString::fromStdString(ToStr::Get(el)); +} + +// overload for a couple of things that need to know the pipeline type when converting +QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype); + +// overload for a couple of things that need to know the pipeline type when converting +QString ToQStr(const ShaderStageType stage, const GraphicsAPI apitype); bool SaveToJSON(QVariantMap &data, QIODevice &f, const char *magicIdentifier, uint32_t magicVersion); bool LoadFromJSON(QVariantMap &data, QIODevice &f, const char *magicIdentifier, diff --git a/qrenderdoc/Code/RenderManager.h b/qrenderdoc/Code/RenderManager.h index f270e4798..7c776ab1a 100644 --- a/qrenderdoc/Code/RenderManager.h +++ b/qrenderdoc/Code/RenderManager.h @@ -32,6 +32,7 @@ #include #include #include +#include "QRDUtils.h" #include "renderdoc_replay.h" struct IReplayRenderer; @@ -54,9 +55,9 @@ struct EnvironmentModification QString ret; if(type == eEnvMod_Append) - ret = QString("Append, %1").arg("TODO ToStr"); + ret = QString("Append, %1").arg(ToQStr(separator)); else if(type == eEnvMod_Prepend) - ret = QString("Prepend, %1").arg("TODO ToStr"); + ret = QString("Prepend, %1").arg(ToQStr(separator)); else ret = "Set"; @@ -68,9 +69,9 @@ struct EnvironmentModification QString ret; if(type == eEnvMod_Append) - ret = QString("Append %1 with %2 using %3").arg(variable).arg(value).arg("TODO ToStr"); + ret = QString("Append %1 with %2 using %3").arg(variable).arg(value).arg(ToQStr(separator)); else if(type == eEnvMod_Prepend) - ret = QString("Prepend %1 with %2 using %3").arg(variable).arg(value).arg("TODO ToStr"); + ret = QString("Prepend %1 with %2 using %3").arg(variable).arg(value).arg(ToQStr(separator)); else ret = QString("Set %1 to %2").arg(variable).arg(value); @@ -82,8 +83,8 @@ struct EnvironmentModification QVariantMap ret; ret["variable"] = variable; ret["value"] = value; - ret["type"] = "Append"; // TODO ToStr - ret["separator"] = "Semi-colon"; // TODO ToStr + ret["type"] = ToQStr(type); + ret["separator"] = ToQStr(separator); return ret; } @@ -91,8 +92,26 @@ struct EnvironmentModification { variable = data["variable"].toString(); value = data["value"].toString(); - type = eEnvMod_Append; // TODO ToStr - separator = eEnvSep_SemiColon; // TODO ToStr + + QString t = data["type"].toString(); + + if(t == ToQStr(eEnvMod_Append)) + type = eEnvMod_Append; + else if(t == ToQStr(eEnvMod_Prepend)) + type = eEnvMod_Prepend; + else + type = eEnvMod_Set; + + QString s = data["separator"].toString(); + + if(s == ToQStr(eEnvSep_SemiColon)) + separator = eEnvSep_SemiColon; + else if(s == ToQStr(eEnvSep_Colon)) + separator = eEnvSep_Colon; + else if(s == ToQStr(eEnvSep_Platform)) + separator = eEnvSep_Platform; + else + separator = eEnvSep_None; } }; diff --git a/qrenderdoc/Windows/Dialogs/TextureSaveDialog.cpp b/qrenderdoc/Windows/Dialogs/TextureSaveDialog.cpp index f878f19ff..17ea9b878 100644 --- a/qrenderdoc/Windows/Dialogs/TextureSaveDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/TextureSaveDialog.cpp @@ -35,11 +35,21 @@ TextureSaveDialog::TextureSaveDialog(const FetchTexture &t, const TextureSave &s setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); ui->setupUi(this); + QObject::connect(&typingTimer, &QTimer::timeout, [this] { SetFiletypeFromFilename(); }); + ui->fileFormat->clear(); - // TODO ToStr - ui->fileFormat->addItems({"DDS", "PNG", "JPG", "BMP", "TGA", "HDR", "EXR"}); - ui->alphaMap->addItems({"Discard", "Blend to Colour", "Blend to Checkerboard"}); + QStringList strs; + for(int i = 0; i < eFileType_Count; i++) + strs << ToQStr((FileType)i); + + ui->fileFormat->addItems(strs); + + strs.clear(); + for(int i = 0; i < eAlphaMap_Count; i++) + strs << ToQStr((AlphaMapping)i); + + ui->alphaMap->addItems(strs); tex = t; saveData = s; @@ -81,9 +91,9 @@ TextureSaveDialog::TextureSaveDialog(const FetchTexture &t, const TextureSave &s if(tex.cubemap) { QString name = cubeFaces[i % 6]; + // Front 1, Back 2, 3, 4 etc for cube arrays if(numSlices > 6) - name = QString("[%1] %2").arg(i / 6).arg( - cubeFaces[i % 6]); // Front 1, Back 2, 3, 4 etc for cube arrays + name = QString("[%1] %2").arg(i / 6).arg(cubeFaces[i % 6]); ui->sliceSelect->addItem(name); } else @@ -130,38 +140,32 @@ void TextureSaveDialog::SetFiletypeFromFilename() QFileInfo path(ui->filename->text()); QString ext = path.suffix().toUpper(); - // TODO ToStr - - /* - foreach(var ft in(FileType[])Enum.GetValues(typeof(FileType))) + for(int i = 0; i < eFileType_Count; i++) { - if(ft.ToString().ToUpperInvariant() == ext) - { - fileFormat.SelectedIndex = (int)ft; - break; - } + if(ToQStr((FileType)i) == ext) + ui->fileFormat->setCurrentIndex(i); } - */ } void TextureSaveDialog::SetFilenameFromFiletype() { QFileInfo path(ui->filename->text()); - QString ext = path.suffix().toUpper(); + QString ext = path.suffix().toLower(); - // TODO ToStr + int idx = ui->fileFormat->currentIndex(); - /* - FileType[] types = (FileType[])Enum.GetValues(typeof(FileType)); - - string selectedExt = types[fileFormat.SelectedIndex].ToString().ToLowerInvariant(); - - if(selectedExt != filenameExt) + if(idx >= 0 && idx < eFileType_Count) { - filename.Text = filename.Text.Substring(0, filename.Text.Length - filenameExt.Length); - filename.Text += selectedExt; + QString selectedExt = ToQStr((FileType)idx).toLower(); + + if(ext != selectedExt && ext != "") + { + QString fn = ui->filename->text(); + fn.chop(ext.length()); + fn += selectedExt; + ui->filename->setText(fn); + } } - */ } void TextureSaveDialog::on_fileFormat_currentIndexChanged(int index) @@ -488,7 +492,17 @@ void TextureSaveDialog::on_whitePoint_textEdited(const QString &arg) void TextureSaveDialog::on_browse_clicked() { - QString filter = "TODO ToStr"; + QString filter = ""; + + for(int i = 0; i < eFileType_Count; i++) + { + QString ext = ToQStr((FileType)i); + + if(filter.length() > 0) + filter += ";;"; + filter += tr("%1 Files (*.%2)").arg(ext).arg(ext.toLower()); + } + QString *selectedFilter = NULL; QString filename = @@ -504,6 +518,9 @@ void TextureSaveDialog::on_browse_clicked() void TextureSaveDialog::on_filename_textEdited(const QString &arg1) { + typingTimer.stop(); + typingTimer.setSingleShot(true); + typingTimer.start(500); } void TextureSaveDialog::on_saveCancelButtons_accepted() diff --git a/qrenderdoc/Windows/Dialogs/TextureSaveDialog.h b/qrenderdoc/Windows/Dialogs/TextureSaveDialog.h index bdbb05e79..6be05dc0a 100644 --- a/qrenderdoc/Windows/Dialogs/TextureSaveDialog.h +++ b/qrenderdoc/Windows/Dialogs/TextureSaveDialog.h @@ -25,6 +25,7 @@ #pragma once #include +#include #include "renderdoc_replay.h" namespace Ui @@ -76,6 +77,8 @@ private: void SetFilenameFromFiletype(); void SetFiletypeFromFilename(); + QTimer typingTimer; + FetchTexture tex; TextureSave saveData; diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 84c00765b..e74a15bfc 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -1000,7 +1000,7 @@ void TextureViewer::UI_UpdateTextureDetails() if(current.format.compType != m_TexDisplay.typeHint && m_TexDisplay.typeHint != eCompType_None) { - status += tr(" Viewed as TODO ToStr"); // m_TexDisplay.typeHint.Str(); + status += tr(" Viewed as %1").arg(ToQStr(m_TexDisplay.typeHint)); } ui->texStatusDim->setText(status); @@ -1747,12 +1747,11 @@ void TextureViewer::AddResourceUsageEntry(QMenu &menu, uint32_t start, uint32_t QAction *item = NULL; if(start == end) - item = new QAction("EID " + QString::number(start) + ": " + - "TODO ToStr" /*usage.Str(m_Core.APIProps.pipelineType)*/, - this); + item = new QAction( + "EID " + QString::number(start) + ": " + ToQStr(usage, m_Ctx->APIProps().pipelineType), this); else item = new QAction("EID " + QString::number(start) + "-" + QString::number(end) + ": " + - "TODO ToStr" /*usage.Str(m_Core.APIProps.pipelineType)*/, + ToQStr(usage, m_Ctx->APIProps().pipelineType), this); QObject::connect(item, &QAction::triggered, this, &TextureViewer::texContextItem_triggered); diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 35225c4a4..67bda399b 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -181,6 +181,7 @@ enum FileType eFileType_TGA, eFileType_HDR, eFileType_EXR, + eFileType_Count, }; enum AlphaMapping @@ -189,6 +190,7 @@ enum AlphaMapping eAlphaMap_BlendToColour, eAlphaMap_BlendToCheckerboard, eAlphaMap_Preserve, + eAlphaMap_Count, }; enum SpecialFormat @@ -233,6 +235,11 @@ enum GraphicsAPI eGraphicsAPI_Vulkan, }; +inline bool IsD3D(GraphicsAPI api) +{ + return api == eGraphicsAPI_D3D11 || api == eGraphicsAPI_D3D12; +} + enum PrimitiveTopology { eTopology_Unknown,