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
This commit is contained in:
baldurk
2016-10-07 15:58:44 +02:00
parent a901fc0d5b
commit ccfa1ceaed
6 changed files with 86 additions and 73 deletions
+6 -6
View File
@@ -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;
+7 -7
View File
@@ -124,8 +124,8 @@ public:
void AddMessages(rdctype::array<DebugMessage> &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<FetchDrawcall> &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;
+44 -40
View File
@@ -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<VertexInputAttribute> CommonPipelineState::GetVertexInputs()
QVector<VertexInputAttribute> 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<VertexInputAttribute> CommonPipelineState::GetVertexInputs()
rdctype::array<SigParameter> &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<VertexInputAttribute> CommonPipelineState::GetVertexInputs()
QVector<VertexInputAttribute> 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<VertexInputAttribute> CommonPipelineState::GetVertexInputs()
rdctype::array<SigParameter> &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<VertexInputAttribute> 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<VertexInputAttribute> 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;
+4 -5
View File
@@ -131,8 +131,7 @@ uint EventBrowser::AddDrawcalls(QTreeWidgetItem *parent, const rdctype::array<Fe
for(int32_t i = 0; i < draws.count; i++)
{
QTreeWidgetItem *child = new QTreeWidgetItem(
parent,
QStringList{QString(draws[i].name.elems), QString("%1").arg(draws[i].eventID), "0.0"});
parent, QStringList{QString(draws[i].name), QString("%1").arg(draws[i].eventID), "0.0"});
lastEID = AddDrawcalls(child, draws[i].children);
@@ -170,10 +169,10 @@ void EventBrowser::SetDrawcallTimes(QTreeWidgetItem *node,
duration = -1.0;
for(int32_t i = 0; i < results.count; i++)
for(const CounterResult &r : results)
{
if(results[i].eventID == eid)
duration = results[i].value.d;
if(r.eventID == eid)
duration = r.value.d;
}
node->setText(COL_DURATION, duration < 0.0f ? "" : QString::number(duration * 1000000.0));
+14 -13
View File
@@ -176,10 +176,11 @@ QVector<BoundResource> 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;
}
+11 -2
View File
@@ -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<char>
@@ -168,6 +174,9 @@ struct str : public rdctype::array<char>
return *this;
}
operator const char *() const { return elems ? elems : ""; }
const char *c_str() const { return elems ? elems : ""; }
};
}; // namespace rdctype