From ccfa1ceaed4f4051afab27a097711a62bd93380e Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 7 Oct 2016 11:20:29 +0200 Subject: [PATCH] Add some utility functions to rdctype::array/str * Avoids the need to directly reference .elems to cast to const char* for strings, and has begin()/end() for C++11 foreach loops --- qrenderdoc/Code/CaptureContext.cpp | 12 ++-- qrenderdoc/Code/CaptureContext.h | 14 ++--- qrenderdoc/Code/CommonPipelineState.cpp | 84 +++++++++++++------------ qrenderdoc/Windows/EventBrowser.cpp | 9 ++- qrenderdoc/Windows/TextureViewer.cpp | 27 ++++---- renderdoc/api/replay/basic_types.h | 13 +++- 6 files changed, 86 insertions(+), 73 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index e6d55f34d..aceeea8e5 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -130,9 +130,9 @@ void CaptureContext::LoadLogfile(int proxyRenderer, QString replayHost, QString m_CurWinSystem = eWindowingSystem_Xlib; // prefer XCB, if supported - for(int32_t i = 0; i < m_WinSystems.count; i++) + for(WindowingSystem sys : m_WinSystems) { - if(m_WinSystems[i] == eWindowingSystem_XCB) + if(sys == eWindowingSystem_XCB) { m_CurWinSystem = eWindowingSystem_XCB; break; @@ -146,14 +146,14 @@ void CaptureContext::LoadLogfile(int proxyRenderer, QString replayHost, QString #endif r->GetBuffers(&m_BufferList); - for(int i = 0; i < m_BufferList.count; i++) - m_Buffers[m_BufferList[i].ID] = &m_BufferList[i]; + for(FetchBuffer &b : m_BufferList) + m_Buffers[b.ID] = &b; postloadProgress = 0.8f; r->GetTextures(&m_TextureList); - for(int i = 0; i < m_TextureList.count; i++) - m_Textures[m_TextureList[i].ID] = &m_TextureList[i]; + for(FetchTexture &t : m_TextureList) + m_Textures[t.ID] = &t; postloadProgress = 0.9f; diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index 66dc6bff3..823cd6236 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -124,8 +124,8 @@ public: void AddMessages(rdctype::array &msgs) { UnreadMessageCount += msgs.count; - for(int i = 0; i < msgs.count; i++) - DebugMessages.push_back(msgs[i]); + for(DebugMessage &msg : msgs) + DebugMessages.push_back(msg); } WindowingSystem m_CurWinSystem; @@ -150,17 +150,17 @@ private: const FetchDrawcall *GetDrawcall(const rdctype::array &draws, uint32_t eventID) { - for(int i = 0; i < draws.count; i++) + for(const FetchDrawcall &d : draws) { - if(draws[i].children.count > 0) + if(!d.children.empty()) { - const FetchDrawcall *draw = GetDrawcall(draws[i].children, eventID); + const FetchDrawcall *draw = GetDrawcall(d.children, eventID); if(draw != NULL) return draw; } - if(draws[i].eventID == eventID) - return &draws[i]; + if(d.eventID == eventID) + return &d; } return NULL; diff --git a/qrenderdoc/Code/CommonPipelineState.cpp b/qrenderdoc/Code/CommonPipelineState.cpp index 8961c2ed5..66f613d10 100644 --- a/qrenderdoc/Code/CommonPipelineState.cpp +++ b/qrenderdoc/Code/CommonPipelineState.cpp @@ -252,21 +252,23 @@ ShaderReflection *CommonPipelineState::GetShaderReflection(ShaderStageType stage QString CommonPipelineState::GetShaderEntryPoint(ShaderStageType stage) { + QString ret; + if(LogLoaded() && IsLogVK()) { switch(stage) { - case eShaderStage_Vertex: return m_Vulkan->VS.entryPoint.elems; - case eShaderStage_Tess_Control: return m_Vulkan->TCS.entryPoint.elems; - case eShaderStage_Tess_Eval: return m_Vulkan->TES.entryPoint.elems; - case eShaderStage_Geometry: return m_Vulkan->GS.entryPoint.elems; - case eShaderStage_Fragment: return m_Vulkan->FS.entryPoint.elems; - case eShaderStage_Compute: return m_Vulkan->CS.entryPoint.elems; + case eShaderStage_Vertex: ret = m_Vulkan->VS.entryPoint; + case eShaderStage_Tess_Control: ret = m_Vulkan->TCS.entryPoint; + case eShaderStage_Tess_Eval: ret = m_Vulkan->TES.entryPoint; + case eShaderStage_Geometry: ret = m_Vulkan->GS.entryPoint; + case eShaderStage_Fragment: ret = m_Vulkan->FS.entryPoint; + case eShaderStage_Compute: ret = m_Vulkan->CS.entryPoint; default: break; } } - return ""; + return ret; } ResourceId CommonPipelineState::GetShader(ShaderStageType stage) @@ -332,18 +334,20 @@ ResourceId CommonPipelineState::GetShader(ShaderStageType stage) QString CommonPipelineState::GetShaderName(ShaderStageType stage) { + QString ret; + if(LogLoaded()) { if(IsLogD3D11()) { switch(stage) { - case eShaderStage_Vertex: return m_D3D11->m_VS.ShaderName.elems; - case eShaderStage_Domain: return m_D3D11->m_DS.ShaderName.elems; - case eShaderStage_Hull: return m_D3D11->m_HS.ShaderName.elems; - case eShaderStage_Geometry: return m_D3D11->m_GS.ShaderName.elems; - case eShaderStage_Pixel: return m_D3D11->m_PS.ShaderName.elems; - case eShaderStage_Compute: return m_D3D11->m_CS.ShaderName.elems; + case eShaderStage_Vertex: ret = m_D3D11->m_VS.ShaderName; + case eShaderStage_Domain: ret = m_D3D11->m_DS.ShaderName; + case eShaderStage_Hull: ret = m_D3D11->m_HS.ShaderName; + case eShaderStage_Geometry: ret = m_D3D11->m_GS.ShaderName; + case eShaderStage_Pixel: ret = m_D3D11->m_PS.ShaderName; + case eShaderStage_Compute: ret = m_D3D11->m_CS.ShaderName; default: break; } } @@ -351,12 +355,12 @@ QString CommonPipelineState::GetShaderName(ShaderStageType stage) { switch(stage) { - case eShaderStage_Vertex: return QString(m_D3D12->PipelineName.elems) + " VS"; - case eShaderStage_Domain: return QString(m_D3D12->PipelineName.elems) + " DS"; - case eShaderStage_Hull: return QString(m_D3D12->PipelineName.elems) + " HS"; - case eShaderStage_Geometry: return QString(m_D3D12->PipelineName.elems) + " GS"; - case eShaderStage_Pixel: return QString(m_D3D12->PipelineName.elems) + " PS"; - case eShaderStage_Compute: return QString(m_D3D12->PipelineName.elems) + " CS"; + case eShaderStage_Vertex: ret = QString(m_D3D12->PipelineName) + " VS"; + case eShaderStage_Domain: ret = QString(m_D3D12->PipelineName) + " DS"; + case eShaderStage_Hull: ret = QString(m_D3D12->PipelineName) + " HS"; + case eShaderStage_Geometry: ret = QString(m_D3D12->PipelineName) + " GS"; + case eShaderStage_Pixel: ret = QString(m_D3D12->PipelineName) + " PS"; + case eShaderStage_Compute: ret = QString(m_D3D12->PipelineName) + " CS"; default: break; } } @@ -364,12 +368,12 @@ QString CommonPipelineState::GetShaderName(ShaderStageType stage) { switch(stage) { - case eShaderStage_Vertex: return m_GL->m_VS.ShaderName.elems; - case eShaderStage_Tess_Control: return m_GL->m_TCS.ShaderName.elems; - case eShaderStage_Tess_Eval: return m_GL->m_TES.ShaderName.elems; - case eShaderStage_Geometry: return m_GL->m_GS.ShaderName.elems; - case eShaderStage_Fragment: return m_GL->m_FS.ShaderName.elems; - case eShaderStage_Compute: return m_GL->m_CS.ShaderName.elems; + case eShaderStage_Vertex: ret = m_GL->m_VS.ShaderName; + case eShaderStage_Tess_Control: ret = m_GL->m_TCS.ShaderName; + case eShaderStage_Tess_Eval: ret = m_GL->m_TES.ShaderName; + case eShaderStage_Geometry: ret = m_GL->m_GS.ShaderName; + case eShaderStage_Fragment: ret = m_GL->m_FS.ShaderName; + case eShaderStage_Compute: ret = m_GL->m_CS.ShaderName; default: break; } } @@ -377,18 +381,18 @@ QString CommonPipelineState::GetShaderName(ShaderStageType stage) { switch(stage) { - case eShaderStage_Vertex: return m_Vulkan->VS.ShaderName.elems; - case eShaderStage_Domain: return m_Vulkan->TCS.ShaderName.elems; - case eShaderStage_Hull: return m_Vulkan->TES.ShaderName.elems; - case eShaderStage_Geometry: return m_Vulkan->GS.ShaderName.elems; - case eShaderStage_Pixel: return m_Vulkan->FS.ShaderName.elems; - case eShaderStage_Compute: return m_Vulkan->CS.ShaderName.elems; + case eShaderStage_Vertex: ret = m_Vulkan->VS.ShaderName; + case eShaderStage_Domain: ret = m_Vulkan->TCS.ShaderName; + case eShaderStage_Hull: ret = m_Vulkan->TES.ShaderName; + case eShaderStage_Geometry: ret = m_Vulkan->GS.ShaderName; + case eShaderStage_Pixel: ret = m_Vulkan->FS.ShaderName; + case eShaderStage_Compute: ret = m_Vulkan->CS.ShaderName; default: break; } } } - return ""; + return ret; } void CommonPipelineState::GetIBuffer(ResourceId &buf, uint64_t &ByteOffset) @@ -547,12 +551,12 @@ QVector CommonPipelineState::GetVertexInputs() QVector ret(layouts.count); for(int i = 0; i < layouts.count; i++) { - QString semName(layouts[i].SemanticName.elems); + QString semName(layouts[i].SemanticName); bool needsSemanticIdx = false; for(int j = 0; j < layouts.count; j++) { - if(i != j && !semName.compare(QString(layouts[j].SemanticName.elems), Qt::CaseInsensitive)) + if(i != j && !semName.compare(QString(layouts[j].SemanticName), Qt::CaseInsensitive)) { needsSemanticIdx = true; break; @@ -582,7 +586,7 @@ QVector CommonPipelineState::GetVertexInputs() rdctype::array &sig = m_D3D11->m_IA.Bytecode->InputSig; for(int ia = 0; ia < sig.count; ia++) { - if(!semName.compare(QString(sig[ia].semanticName.elems), Qt::CaseInsensitive) && + if(!semName.compare(QString(sig[ia].semanticName), Qt::CaseInsensitive) && sig[ia].semanticIndex == layouts[i].SemanticIndex) { ret[i].Used = true; @@ -603,12 +607,12 @@ QVector CommonPipelineState::GetVertexInputs() QVector ret(layouts.count); for(int i = 0; i < layouts.count; i++) { - QString semName(layouts[i].SemanticName.elems); + QString semName(layouts[i].SemanticName); bool needsSemanticIdx = false; for(int j = 0; j < layouts.count; j++) { - if(i != j && !semName.compare(QString(layouts[j].SemanticName.elems), Qt::CaseInsensitive)) + if(i != j && !semName.compare(QString(layouts[j].SemanticName), Qt::CaseInsensitive)) { needsSemanticIdx = true; break; @@ -638,7 +642,7 @@ QVector CommonPipelineState::GetVertexInputs() rdctype::array &sig = m_D3D12->m_VS.ShaderDetails->InputSig; for(int ia = 0; ia < sig.count; ia++) { - if(!semName.compare(QString(sig[ia].semanticName.elems), Qt::CaseInsensitive) && + if(!semName.compare(QString(sig[ia].semanticName), Qt::CaseInsensitive) && sig[ia].semanticIndex == layouts[i].SemanticIndex) { ret[i].Used = true; @@ -685,7 +689,7 @@ QVector CommonPipelineState::GetVertexInputs() int attrib = m_GL->m_VS.BindpointMapping.InputAttributes[i]; if(attrib >= 0 && attrib < m_GL->m_VS.ShaderDetails->InputSig.count) - ret[a].Name = m_GL->m_VS.ShaderDetails->InputSig[attrib].varName.elems; + ret[a].Name = m_GL->m_VS.ShaderDetails->InputSig[attrib].varName; if(attrib == -1) continue; @@ -767,7 +771,7 @@ QVector CommonPipelineState::GetVertexInputs() attrib = m_Vulkan->VS.BindpointMapping.InputAttributes[attrs[i].location]; if(attrib >= 0 && attrib < m_Vulkan->VS.ShaderDetails->InputSig.count) - ret[a].Name = m_Vulkan->VS.ShaderDetails->InputSig[attrib].varName.elems; + ret[a].Name = m_Vulkan->VS.ShaderDetails->InputSig[attrib].varName; if(attrib == -1) continue; diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index 1dd065144..409b4c33e 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -131,8 +131,7 @@ uint EventBrowser::AddDrawcalls(QTreeWidgetItem *parent, const rdctype::arraysetText(COL_DURATION, duration < 0.0f ? "" : QString::number(duration * 1000000.0)); diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 6470e7595..2ee4d6c0f 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -176,10 +176,11 @@ QVector Following::GetOutputTargets(CaptureContext *ctx) if(curDraw->copyDestination != ResourceId()) return {BoundResource(curDraw->copyDestination)}; - auto &texlist = ctx->GetTextures(); - for(int i = 0; i < texlist.count; i++) - if((texlist[i].creationFlags & eTextureCreate_SwapBuffer)) - return {BoundResource(texlist[i].ID)}; + for(const FetchTexture &tex : ctx->GetTextures()) + { + if(tex.creationFlags & eTextureCreate_SwapBuffer) + return {BoundResource(tex.ID)}; + } } return ret; @@ -764,9 +765,9 @@ void TextureViewer::UI_UpdateTextureDetails() QString name; if(followtex) - name = followtex->name.elems; + name = followtex->name; else - name = followbuf->name.elems; + name = followbuf->name; switch(m_Following.Type) { @@ -802,7 +803,7 @@ void TextureViewer::UI_UpdateTextureDetails() ui->renderContainer->setWindowTitle(title); } - status = QString(current.name.elems) + " - "; + status = QString(current.name) + " - "; if(current.dimension >= 1) status += QString::number(current.width); @@ -819,7 +820,7 @@ void TextureViewer::UI_UpdateTextureDetails() status += QString(" %1 mips").arg(current.mips); - status += " - " + QString(current.format.strname.elems); + status += " - " + QString(current.format.strname); if(current.format.compType != m_TexDisplay.typeHint && m_TexDisplay.typeHint != eCompType_None) { @@ -1363,10 +1364,10 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, { if(!fullname.isEmpty()) fullname += " = "; - fullname += texptr->name.elems; + fullname += texptr->name; } if(fullname.isEmpty()) - fullname = texptr->name.elems; + fullname = texptr->name; prev->setResourceName(fullname); WId handle = prev->thumbWinId(); @@ -1381,10 +1382,10 @@ void TextureViewer::InitResourcePreview(ResourcePreview *prev, ResourceId id, { if(!fullname.isEmpty()) fullname += " = "; - fullname += bufptr->name.elems; + fullname += bufptr->name; } if(fullname.isEmpty()) - fullname = bufptr->name.elems; + fullname = bufptr->name; prev->setResourceName(fullname); WId handle = prev->thumbWinId(); @@ -1463,7 +1464,7 @@ void TextureViewer::InitStageResourcePreviews(ShaderStageType stage, const ShaderResource &bind = resourceDetails[b]; if(bind.bindPoint == idx && bind.IsSRV) { - bindName = bind.name.elems; + bindName = bind.name; otherBind = true; break; } diff --git a/renderdoc/api/replay/basic_types.h b/renderdoc/api/replay/basic_types.h index 93a29b047..2255c2425 100644 --- a/renderdoc/api/replay/basic_types.h +++ b/renderdoc/api/replay/basic_types.h @@ -75,8 +75,6 @@ struct array T &operator[](size_t i) { return elems[i]; } const T &operator[](size_t i) const { return elems[i]; } - // to help simple template specializations for vector/rdctype::array - size_t size() { return (size_t)count; } array(const T *const in) { elems = 0; @@ -135,6 +133,14 @@ struct array } return *this; } + + // provide some of the familiar stl interface + size_t size() const { return (size_t)count; } + bool empty() const { return count == 0; } + T *begin() { return elems ? elems : end(); } + T *end() { return elems ? elems + count : NULL; } + const T *begin() const { return elems ? elems : end(); } + const T *end() const { return elems ? elems + count : NULL; } }; struct str : public rdctype::array @@ -168,6 +174,9 @@ struct str : public rdctype::array return *this; } + + operator const char *() const { return elems ? elems : ""; } + const char *c_str() const { return elems ? elems : ""; } }; }; // namespace rdctype