1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[dxvk] Avoid redundant resource tracking

Only tracks a shader resource if the resource bound to the slot
has actually changed, or if we began recording a new command
buffer. Reduces the number of atomic operations in some games.
This commit is contained in:
Philip Rebohle 2019-06-23 18:55:49 +02:00
parent 924ca9eaec
commit 81e7a8d1f6
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 31 additions and 11 deletions

View File

@ -41,6 +41,9 @@ namespace dxvk {
void DxvkContext::beginRecording(const Rc<DxvkCommandList>& cmdList) { void DxvkContext::beginRecording(const Rc<DxvkCommandList>& cmdList) {
m_cmd = cmdList; m_cmd = cmdList;
m_cmd->beginRecording(); m_cmd->beginRecording();
// Mark all resources as untracked
m_rcTracked.clear();
// The current state of the internal command buffer is // The current state of the internal command buffer is
// undefined, so we have to bind and set up everything // undefined, so we have to bind and set up everything
@ -161,6 +164,7 @@ namespace dxvk {
const DxvkBufferSlice& buffer) { const DxvkBufferSlice& buffer) {
if (!m_rc[slot].bufferSlice.matches(buffer)) { if (!m_rc[slot].bufferSlice.matches(buffer)) {
m_rc[slot].bufferSlice = buffer; m_rc[slot].bufferSlice = buffer;
m_rcTracked.clr(slot);
m_flags.set( m_flags.set(
DxvkContextFlag::CpDirtyResources, DxvkContextFlag::CpDirtyResources,
@ -180,6 +184,7 @@ namespace dxvk {
m_rc[slot].bufferSlice = bufferView != nullptr m_rc[slot].bufferSlice = bufferView != nullptr
? bufferView->slice() ? bufferView->slice()
: DxvkBufferSlice(); : DxvkBufferSlice();
m_rcTracked.clr(slot);
m_flags.set( m_flags.set(
DxvkContextFlag::CpDirtyResources, DxvkContextFlag::CpDirtyResources,
@ -192,7 +197,8 @@ namespace dxvk {
uint32_t slot, uint32_t slot,
const Rc<DxvkSampler>& sampler) { const Rc<DxvkSampler>& sampler) {
if (m_rc[slot].sampler != sampler) { if (m_rc[slot].sampler != sampler) {
m_rc[slot].sampler = sampler; m_rc[slot].sampler = sampler;
m_rcTracked.clr(slot);
m_flags.set( m_flags.set(
DxvkContextFlag::CpDirtyResources, DxvkContextFlag::CpDirtyResources,
@ -3549,7 +3555,8 @@ namespace dxvk {
m_descInfos[i].image.imageView = VK_NULL_HANDLE; m_descInfos[i].image.imageView = VK_NULL_HANDLE;
m_descInfos[i].image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; m_descInfos[i].image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
m_cmd->trackResource(res.sampler); if (m_rcTracked.set(binding.slot))
m_cmd->trackResource(res.sampler);
} else { } else {
updatePipelineState |= bindMask.clr(i); updatePipelineState |= bindMask.clr(i);
m_descInfos[i].image = m_device->dummySamplerDescriptor(); m_descInfos[i].image = m_device->dummySamplerDescriptor();
@ -3567,8 +3574,10 @@ namespace dxvk {
if (unlikely(res.imageView->imageHandle() == depthImage)) if (unlikely(res.imageView->imageHandle() == depthImage))
m_descInfos[i].image.imageLayout = depthLayout; m_descInfos[i].image.imageLayout = depthLayout;
m_cmd->trackResource(res.imageView); if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource(res.imageView->image()); m_cmd->trackResource(res.imageView);
m_cmd->trackResource(res.imageView->image());
}
} else { } else {
updatePipelineState |= bindMask.clr(i); updatePipelineState |= bindMask.clr(i);
m_descInfos[i].image = m_device->dummyImageViewDescriptor(binding.view); m_descInfos[i].image = m_device->dummyImageViewDescriptor(binding.view);
@ -3586,9 +3595,11 @@ namespace dxvk {
if (unlikely(res.imageView->imageHandle() == depthImage)) if (unlikely(res.imageView->imageHandle() == depthImage))
m_descInfos[i].image.imageLayout = depthLayout; m_descInfos[i].image.imageLayout = depthLayout;
m_cmd->trackResource(res.sampler); if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource(res.imageView); m_cmd->trackResource(res.sampler);
m_cmd->trackResource(res.imageView->image()); m_cmd->trackResource(res.imageView);
m_cmd->trackResource(res.imageView->image());
}
} else { } else {
updatePipelineState |= bindMask.clr(i); updatePipelineState |= bindMask.clr(i);
m_descInfos[i].image = m_device->dummyImageSamplerDescriptor(binding.view); m_descInfos[i].image = m_device->dummyImageSamplerDescriptor(binding.view);
@ -3602,8 +3613,10 @@ namespace dxvk {
res.bufferView->updateView(); res.bufferView->updateView();
m_descInfos[i].texelBuffer = res.bufferView->handle(); m_descInfos[i].texelBuffer = res.bufferView->handle();
m_cmd->trackResource(res.bufferView); if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource(res.bufferView->buffer()); m_cmd->trackResource(res.bufferView);
m_cmd->trackResource(res.bufferView->buffer());
}
} else { } else {
updatePipelineState |= bindMask.clr(i); updatePipelineState |= bindMask.clr(i);
m_descInfos[i].texelBuffer = m_device->dummyBufferViewDescriptor(); m_descInfos[i].texelBuffer = m_device->dummyBufferViewDescriptor();
@ -3615,7 +3628,8 @@ namespace dxvk {
updatePipelineState |= bindMask.set(i); updatePipelineState |= bindMask.set(i);
m_descInfos[i] = res.bufferSlice.getDescriptor(); m_descInfos[i] = res.bufferSlice.getDescriptor();
m_cmd->trackResource(res.bufferSlice.buffer()); if (m_rcTracked.set(binding.slot))
m_cmd->trackResource(res.bufferSlice.buffer());
} else { } else {
updatePipelineState |= bindMask.clr(i); updatePipelineState |= bindMask.clr(i);
m_descInfos[i].buffer = m_device->dummyBufferDescriptor(); m_descInfos[i].buffer = m_device->dummyBufferDescriptor();
@ -3628,7 +3642,8 @@ namespace dxvk {
m_descInfos[i] = res.bufferSlice.getDescriptor(); m_descInfos[i] = res.bufferSlice.getDescriptor();
m_descInfos[i].buffer.offset = 0; m_descInfos[i].buffer.offset = 0;
m_cmd->trackResource(res.bufferSlice.buffer()); if (m_rcTracked.set(binding.slot))
m_cmd->trackResource(res.bufferSlice.buffer());
} else { } else {
updatePipelineState |= bindMask.clr(i); updatePipelineState |= bindMask.clr(i);
m_descInfos[i].buffer = m_device->dummyBufferDescriptor(); m_descInfos[i].buffer = m_device->dummyBufferDescriptor();

View File

@ -994,6 +994,8 @@ namespace dxvk {
VkDescriptorSet m_gpSet = VK_NULL_HANDLE; VkDescriptorSet m_gpSet = VK_NULL_HANDLE;
VkDescriptorSet m_cpSet = VK_NULL_HANDLE; VkDescriptorSet m_cpSet = VK_NULL_HANDLE;
DxvkBindingSet<MaxNumResourceSlots> m_rcTracked;
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc; std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
std::array<DxvkDescriptorInfo, MaxNumActiveBindings> m_descInfos; std::array<DxvkDescriptorInfo, MaxNumActiveBindings> m_descInfos;
std::array<uint32_t, MaxNumActiveBindings> m_descOffsets; std::array<uint32_t, MaxNumActiveBindings> m_descOffsets;
@ -1086,6 +1088,9 @@ namespace dxvk {
void updateGraphicsShaderResources(); void updateGraphicsShaderResources();
void updateGraphicsShaderDescriptors(); void updateGraphicsShaderDescriptors();
void updateShaderSamplers(
const DxvkPipelineLayout* layout);
void updateShaderResources( void updateShaderResources(
VkPipelineBindPoint bindPoint, VkPipelineBindPoint bindPoint,