1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 16:29:16 +01:00

[dxvk] Add debug labels for pipeline binding

This commit is contained in:
Philip Rebohle 2025-01-08 15:43:02 +01:00 committed by Philip Rebohle
parent ca2afb0b8b
commit 9bb06baaaa
5 changed files with 76 additions and 4 deletions

View File

@ -24,7 +24,8 @@ namespace dxvk {
m_library (library), m_library (library),
m_libraryHandle (VK_NULL_HANDLE), m_libraryHandle (VK_NULL_HANDLE),
m_shaders (std::move(shaders)), m_shaders (std::move(shaders)),
m_bindings (layout) { m_bindings (layout),
m_debugName (createDebugName()) {
} }
@ -157,4 +158,12 @@ namespace dxvk {
Logger::log(level, sstr.str()); Logger::log(level, sstr.str());
} }
std::string DxvkComputePipeline::createDebugName() const {
std::string shaderName = m_shaders.cs->debugName();
size_t len = std::min(shaderName.size(), size_t(10));
return str::format("[", shaderName.substr(0, len), "]");
}
} }

View File

@ -120,6 +120,16 @@ namespace dxvk {
void compilePipeline( void compilePipeline(
const DxvkComputePipelineStateInfo& state); const DxvkComputePipelineStateInfo& state);
/**
* \brief Debug name
*
* Consists of the compute shader's debug name.
* \returns Debug name
*/
const char* debugName() const {
return m_debugName.c_str();
}
private: private:
DxvkDevice* m_device; DxvkDevice* m_device;
@ -132,6 +142,8 @@ namespace dxvk {
DxvkComputePipelineShaders m_shaders; DxvkComputePipelineShaders m_shaders;
DxvkBindingLayoutObjects* m_bindings; DxvkBindingLayoutObjects* m_bindings;
std::string m_debugName;
alignas(CACHE_LINE_SIZE) alignas(CACHE_LINE_SIZE)
dxvk::mutex m_mutex; dxvk::mutex m_mutex;
sync::List<DxvkComputePipelineInstance> m_pipelines; sync::List<DxvkComputePipelineInstance> m_pipelines;
@ -152,6 +164,8 @@ namespace dxvk {
LogLevel level, LogLevel level,
const DxvkComputePipelineStateInfo& state) const; const DxvkComputePipelineStateInfo& state) const;
std::string createDebugName() const;
}; };
} }

View File

@ -4940,6 +4940,11 @@ namespace dxvk {
if (newPipeline->getBindings()->layout().getPushConstantRange(true).size) if (newPipeline->getBindings()->layout().getPushConstantRange(true).size)
m_flags.set(DxvkContextFlag::DirtyPushConstants); m_flags.set(DxvkContextFlag::DirtyPushConstants);
if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) {
m_cmd->cmdInsertDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer,
vk::makeLabel(0xf0dca2, newPipeline->debugName()));
}
m_flags.clr(DxvkContextFlag::CpDirtyPipelineState); m_flags.clr(DxvkContextFlag::CpDirtyPipelineState);
return true; return true;
} }
@ -5108,6 +5113,11 @@ namespace dxvk {
dstBarrier.stages, dstBarrier.access); dstBarrier.stages, dstBarrier.access);
} }
if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) {
m_cmd->cmdInsertDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer,
vk::makeLabel(0xa2dcf0, m_state.gp.pipeline->debugName()));
}
m_flags.clr(DxvkContextFlag::GpDirtyPipelineState); m_flags.clr(DxvkContextFlag::GpDirtyPipelineState);
return true; return true;
} }

View File

@ -945,7 +945,8 @@ namespace dxvk {
m_bindings (layout), m_bindings (layout),
m_barrier (layout->getGlobalBarrier()), m_barrier (layout->getGlobalBarrier()),
m_vsLibrary (vsLibrary), m_vsLibrary (vsLibrary),
m_fsLibrary (fsLibrary) { m_fsLibrary (fsLibrary),
m_debugName (createDebugName()) {
m_vsIn = m_shaders.vs != nullptr ? m_shaders.vs->info().inputMask : 0; m_vsIn = m_shaders.vs != nullptr ? m_shaders.vs->info().inputMask : 0;
m_fsOut = m_shaders.fs != nullptr ? m_shaders.fs->info().outputMask : 0; m_fsOut = m_shaders.fs != nullptr ? m_shaders.fs->info().outputMask : 0;
m_specConstantMask = this->computeSpecConstantMask(); m_specConstantMask = this->computeSpecConstantMask();
@ -1674,4 +1675,27 @@ namespace dxvk {
Logger::log(level, sstr.str()); Logger::log(level, sstr.str());
} }
std::string DxvkGraphicsPipeline::createDebugName() const {
std::stringstream name;
std::array<Rc<DxvkShader>, 5> shaders = {{
m_shaders.vs,
m_shaders.tcs,
m_shaders.tes,
m_shaders.gs,
m_shaders.fs,
}};
for (const auto& shader : shaders) {
if (shader) {
std::string shaderName = shader->debugName();
size_t len = std::min(shaderName.size(), size_t(10));
name << "[" << shaderName.substr(0, len) << "] ";
}
}
return name.str();
}
} }

View File

@ -561,6 +561,17 @@ namespace dxvk {
*/ */
void releasePipeline(); void releasePipeline();
/**
* \brief Queries debug name for the pipeline
*
* The pipeline debug name contains the debug name of
* each shader included in the pipeline.
* \returns Pipeline debug name
*/
const char* debugName() const {
return m_debugName.c_str();
}
private: private:
DxvkDevice* m_device; DxvkDevice* m_device;
@ -582,6 +593,8 @@ namespace dxvk {
uint32_t m_specConstantMask = 0; uint32_t m_specConstantMask = 0;
std::string m_debugName;
alignas(CACHE_LINE_SIZE) alignas(CACHE_LINE_SIZE)
dxvk::mutex m_mutex; dxvk::mutex m_mutex;
sync::List<DxvkGraphicsPipelineInstance> m_pipelines; sync::List<DxvkGraphicsPipelineInstance> m_pipelines;
@ -643,6 +656,8 @@ namespace dxvk {
LogLevel level, LogLevel level,
const DxvkGraphicsPipelineStateInfo& state) const; const DxvkGraphicsPipelineStateInfo& state) const;
std::string createDebugName() const;
}; };
} }