| 256 | } |
| 257 | |
| 258 | void ResourceInspector::Inspect(ResourceId id) |
| 259 | { |
| 260 | if(m_Resource == id) |
| 261 | return; |
| 262 | |
| 263 | // cancel any rename in progress |
| 264 | ui->resourceNameEdit->hide(); |
| 265 | ui->resourceName->show(); |
| 266 | |
| 267 | if(m_Resource != ResourceId()) |
| 268 | ui->initChunks->saveExpansion(ui->initChunks->getInternalExpansion(qHash(ToQStr(m_Resource))), 0); |
| 269 | |
| 270 | m_Resource = id; |
| 271 | |
| 272 | ui->viewContents->setVisible(m_Ctx.GetTexture(id) || m_Ctx.GetBuffer(id) || |
| 273 | m_Ctx.GetDescriptorStore(id)); |
| 274 | |
| 275 | m_Entries.clear(); |
| 276 | |
| 277 | if(m_ResourceCacheID != m_Ctx.ResourceNameCacheID()) |
| 278 | { |
| 279 | m_ResourceCacheID = m_Ctx.ResourceNameCacheID(); |
| 280 | m_ResourceModel->reset(); |
| 281 | } |
| 282 | |
| 283 | m_ResourceModel->bumpLastUse(id); |
| 284 | |
| 285 | m_FilterModel->invalidate(); |
| 286 | m_FilterModel->sort(0); |
| 287 | |
| 288 | if(m_Ctx.HasResourceCustomName(id)) |
| 289 | ui->resetName->show(); |
| 290 | else |
| 291 | ui->resetName->hide(); |
| 292 | |
| 293 | ui->initChunks->setUpdatesEnabled(false); |
| 294 | ui->resourceUsage->clear(); |
| 295 | ui->resourceUsage->setEnabled(true); |
| 296 | |
| 297 | const SDFile &file = m_Ctx.GetStructuredFile(); |
| 298 | const ResourceDescription *desc = m_Ctx.GetResource(id); |
| 299 | |
| 300 | m_Ctx.Replay().AsyncInvoke([this, id](IReplayController *r) { |
| 301 | rdcarray<EventUsage> usage = r->GetUsage(id); |
| 302 | |
| 303 | rdcarray<ShaderEntryPoint> entries = r->GetShaderEntryPoints(id); |
| 304 | |
| 305 | GUIInvoke::call(this, [this, entries, usage] { |
| 306 | if(!entries.isEmpty()) |
| 307 | { |
| 308 | m_Entries = entries; |
| 309 | ui->viewContents->setVisible(true); |
| 310 | } |
| 311 | |
| 312 | ui->resourceUsage->beginUpdate(); |
| 313 | |
| 314 | if(usage.size() == 1 && usage[0].eventId == 0 && usage[0].usage == ResourceUsage::Unused) |
| 315 | { |
no test coverage detected