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

[dxvk] Move descriptor set updates to updateShaderResources

Saves two state flags and allows us to move the descriptor info
array into the function itself.
This commit is contained in:
Philip Rebohle 2019-10-10 22:44:02 +02:00
parent 7df3b409c3
commit 63cc8cdd35
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 69 additions and 105 deletions

View File

@ -161,8 +161,8 @@ namespace dxvk {
DxvkContextFlag::GpDirtyResources); DxvkContextFlag::GpDirtyResources);
} else { } else {
m_flags.set( m_flags.set(
DxvkContextFlag::CpDirtyDescriptorOffsets, DxvkContextFlag::CpDirtyDescriptorBinding,
DxvkContextFlag::GpDirtyDescriptorOffsets); DxvkContextFlag::GpDirtyDescriptorBinding);
} }
m_rc[slot].bufferSlice = buffer; m_rc[slot].bufferSlice = buffer;
@ -1759,8 +1759,8 @@ namespace dxvk {
m_flags.set(DxvkContextFlag::GpDirtyResources, m_flags.set(DxvkContextFlag::GpDirtyResources,
DxvkContextFlag::CpDirtyResources); DxvkContextFlag::CpDirtyResources);
} else { } else {
m_flags.set(DxvkContextFlag::GpDirtyDescriptorOffsets, m_flags.set(DxvkContextFlag::GpDirtyDescriptorBinding,
DxvkContextFlag::CpDirtyDescriptorOffsets); DxvkContextFlag::CpDirtyDescriptorBinding);
} }
} }
} }
@ -3671,16 +3671,14 @@ namespace dxvk {
return; return;
if ((m_flags.test(DxvkContextFlag::CpDirtyResources)) if ((m_flags.test(DxvkContextFlag::CpDirtyResources))
|| (m_flags.test(DxvkContextFlag::CpDirtyDescriptorOffsets) || (m_flags.test(DxvkContextFlag::CpDirtyDescriptorBinding)
&& m_state.cp.pipeline->layout()->hasStaticBufferBindings())) { && m_state.cp.pipeline->layout()->hasStaticBufferBindings())) {
m_flags.clr(DxvkContextFlag::CpDirtyResources); m_flags.clr(DxvkContextFlag::CpDirtyResources);
if (this->updateShaderResources<VK_PIPELINE_BIND_POINT_COMPUTE>(m_state.cp.pipeline->layout())) if (this->updateShaderResources<VK_PIPELINE_BIND_POINT_COMPUTE>(m_state.cp.pipeline->layout()))
m_flags.set(DxvkContextFlag::CpDirtyPipelineState); m_flags.set(DxvkContextFlag::CpDirtyPipelineState);
m_flags.set( m_flags.set(DxvkContextFlag::CpDirtyDescriptorBinding);
DxvkContextFlag::CpDirtyDescriptorSet,
DxvkContextFlag::CpDirtyDescriptorOffsets);
} }
} }
@ -3689,19 +3687,10 @@ namespace dxvk {
if (m_state.cp.pipeline == nullptr) if (m_state.cp.pipeline == nullptr)
return; return;
if (m_flags.test(DxvkContextFlag::CpDirtyDescriptorSet)) { this->updateShaderDescriptorSetBinding<VK_PIPELINE_BIND_POINT_COMPUTE>(
m_cpSet = this->updateShaderDescriptors( m_cpSet, m_state.cp.pipeline->layout());
m_state.cp.pipeline->layout());
}
if (m_flags.test(DxvkContextFlag::CpDirtyDescriptorOffsets)) { m_flags.clr(DxvkContextFlag::CpDirtyDescriptorBinding);
this->updateShaderDescriptorSetBinding<VK_PIPELINE_BIND_POINT_COMPUTE>(
m_cpSet, m_state.cp.pipeline->layout());
}
m_flags.clr(
DxvkContextFlag::CpDirtyDescriptorOffsets,
DxvkContextFlag::CpDirtyDescriptorSet);
} }
@ -3710,16 +3699,14 @@ namespace dxvk {
return; return;
if ((m_flags.test(DxvkContextFlag::GpDirtyResources)) if ((m_flags.test(DxvkContextFlag::GpDirtyResources))
|| (m_flags.test(DxvkContextFlag::GpDirtyDescriptorOffsets) || (m_flags.test(DxvkContextFlag::GpDirtyDescriptorBinding)
&& m_state.gp.pipeline->layout()->hasStaticBufferBindings())) { && m_state.gp.pipeline->layout()->hasStaticBufferBindings())) {
m_flags.clr(DxvkContextFlag::GpDirtyResources); m_flags.clr(DxvkContextFlag::GpDirtyResources);
if (this->updateShaderResources<VK_PIPELINE_BIND_POINT_GRAPHICS>(m_state.gp.pipeline->layout())) if (this->updateShaderResources<VK_PIPELINE_BIND_POINT_GRAPHICS>(m_state.gp.pipeline->layout()))
m_flags.set(DxvkContextFlag::GpDirtyPipelineState); m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
m_flags.set( m_flags.set(DxvkContextFlag::GpDirtyDescriptorBinding);
DxvkContextFlag::GpDirtyDescriptorSet,
DxvkContextFlag::GpDirtyDescriptorOffsets);
} }
} }
@ -3728,25 +3715,18 @@ namespace dxvk {
if (m_state.gp.pipeline == nullptr) if (m_state.gp.pipeline == nullptr)
return; return;
if (m_flags.test(DxvkContextFlag::GpDirtyDescriptorSet)) { this->updateShaderDescriptorSetBinding<VK_PIPELINE_BIND_POINT_GRAPHICS>(
m_gpSet = this->updateShaderDescriptors( m_gpSet, m_state.gp.pipeline->layout());
m_state.gp.pipeline->layout());
}
if (m_flags.test(DxvkContextFlag::GpDirtyDescriptorOffsets)) { m_flags.clr(DxvkContextFlag::GpDirtyDescriptorBinding);
this->updateShaderDescriptorSetBinding<VK_PIPELINE_BIND_POINT_GRAPHICS>(
m_gpSet, m_state.gp.pipeline->layout());
}
m_flags.clr(
DxvkContextFlag::GpDirtyDescriptorOffsets,
DxvkContextFlag::GpDirtyDescriptorSet);
} }
template<VkPipelineBindPoint BindPoint> template<VkPipelineBindPoint BindPoint>
bool DxvkContext::updateShaderResources( bool DxvkContext::updateShaderResources(const DxvkPipelineLayout* layout) {
const DxvkPipelineLayout* layout) { std::array<DxvkDescriptorInfo, MaxNumActiveBindings> descriptors;
// Assume that all bindings are active as a fast path
DxvkBindingMask bindMask; DxvkBindingMask bindMask;
bindMask.setFirst(layout->bindingCount()); bindMask.setFirst(layout->bindingCount());
@ -3771,25 +3751,25 @@ namespace dxvk {
switch (binding.type) { switch (binding.type) {
case VK_DESCRIPTOR_TYPE_SAMPLER: case VK_DESCRIPTOR_TYPE_SAMPLER:
if (res.sampler != nullptr) { if (res.sampler != nullptr) {
m_descInfos[i].image.sampler = res.sampler->handle(); descriptors[i].image.sampler = res.sampler->handle();
m_descInfos[i].image.imageView = VK_NULL_HANDLE; descriptors[i].image.imageView = VK_NULL_HANDLE;
m_descInfos[i].image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; descriptors[i].image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
if (m_rcTracked.set(binding.slot)) if (m_rcTracked.set(binding.slot))
m_cmd->trackResource<DxvkAccess::None>(res.sampler); m_cmd->trackResource<DxvkAccess::None>(res.sampler);
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].image = m_common->dummyResources().samplerDescriptor(); descriptors[i].image = m_common->dummyResources().samplerDescriptor();
} break; } break;
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
if (res.imageView != nullptr && res.imageView->handle(binding.view) != VK_NULL_HANDLE) { if (res.imageView != nullptr && res.imageView->handle(binding.view) != VK_NULL_HANDLE) {
m_descInfos[i].image.sampler = VK_NULL_HANDLE; descriptors[i].image.sampler = VK_NULL_HANDLE;
m_descInfos[i].image.imageView = res.imageView->handle(binding.view); descriptors[i].image.imageView = res.imageView->handle(binding.view);
m_descInfos[i].image.imageLayout = res.imageView->imageInfo().layout; descriptors[i].image.imageLayout = res.imageView->imageInfo().layout;
if (unlikely(res.imageView->imageHandle() == depthImage)) if (unlikely(res.imageView->imageHandle() == depthImage))
m_descInfos[i].image.imageLayout = depthLayout; descriptors[i].image.imageLayout = depthLayout;
if (m_rcTracked.set(binding.slot)) { if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource<DxvkAccess::None>(res.imageView); m_cmd->trackResource<DxvkAccess::None>(res.imageView);
@ -3797,17 +3777,17 @@ namespace dxvk {
} }
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].image = m_common->dummyResources().imageViewDescriptor(binding.view); descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view);
} break; } break;
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
if (res.imageView != nullptr && res.imageView->handle(binding.view) != VK_NULL_HANDLE) { if (res.imageView != nullptr && res.imageView->handle(binding.view) != VK_NULL_HANDLE) {
m_descInfos[i].image.sampler = VK_NULL_HANDLE; descriptors[i].image.sampler = VK_NULL_HANDLE;
m_descInfos[i].image.imageView = res.imageView->handle(binding.view); descriptors[i].image.imageView = res.imageView->handle(binding.view);
m_descInfos[i].image.imageLayout = res.imageView->imageInfo().layout; descriptors[i].image.imageLayout = res.imageView->imageInfo().layout;
if (unlikely(res.imageView->imageHandle() == depthImage)) if (unlikely(res.imageView->imageHandle() == depthImage))
m_descInfos[i].image.imageLayout = depthLayout; descriptors[i].image.imageLayout = depthLayout;
if (m_rcTracked.set(binding.slot)) { if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource<DxvkAccess::None>(res.imageView); m_cmd->trackResource<DxvkAccess::None>(res.imageView);
@ -3815,18 +3795,18 @@ namespace dxvk {
} }
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].image = m_common->dummyResources().imageViewDescriptor(binding.view); descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view);
} break; } break;
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
if (res.sampler != nullptr && res.imageView != nullptr if (res.sampler != nullptr && res.imageView != nullptr
&& res.imageView->handle(binding.view) != VK_NULL_HANDLE) { && res.imageView->handle(binding.view) != VK_NULL_HANDLE) {
m_descInfos[i].image.sampler = res.sampler->handle(); descriptors[i].image.sampler = res.sampler->handle();
m_descInfos[i].image.imageView = res.imageView->handle(binding.view); descriptors[i].image.imageView = res.imageView->handle(binding.view);
m_descInfos[i].image.imageLayout = res.imageView->imageInfo().layout; descriptors[i].image.imageLayout = res.imageView->imageInfo().layout;
if (unlikely(res.imageView->imageHandle() == depthImage)) if (unlikely(res.imageView->imageHandle() == depthImage))
m_descInfos[i].image.imageLayout = depthLayout; descriptors[i].image.imageLayout = depthLayout;
if (m_rcTracked.set(binding.slot)) { if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource<DxvkAccess::None>(res.sampler); m_cmd->trackResource<DxvkAccess::None>(res.sampler);
@ -3835,13 +3815,13 @@ namespace dxvk {
} }
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].image = m_common->dummyResources().imageSamplerDescriptor(binding.view); descriptors[i].image = m_common->dummyResources().imageSamplerDescriptor(binding.view);
} break; } break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
if (res.bufferView != nullptr) { if (res.bufferView != nullptr) {
res.bufferView->updateView(); res.bufferView->updateView();
m_descInfos[i].texelBuffer = res.bufferView->handle(); descriptors[i].texelBuffer = res.bufferView->handle();
if (m_rcTracked.set(binding.slot)) { if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource<DxvkAccess::None>(res.bufferView); m_cmd->trackResource<DxvkAccess::None>(res.bufferView);
@ -3849,13 +3829,13 @@ namespace dxvk {
} }
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].texelBuffer = m_common->dummyResources().bufferViewDescriptor(); descriptors[i].texelBuffer = m_common->dummyResources().bufferViewDescriptor();
} break; } break;
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
if (res.bufferView != nullptr) { if (res.bufferView != nullptr) {
res.bufferView->updateView(); res.bufferView->updateView();
m_descInfos[i].texelBuffer = res.bufferView->handle(); descriptors[i].texelBuffer = res.bufferView->handle();
if (m_rcTracked.set(binding.slot)) { if (m_rcTracked.set(binding.slot)) {
m_cmd->trackResource<DxvkAccess::None>(res.bufferView); m_cmd->trackResource<DxvkAccess::None>(res.bufferView);
@ -3863,53 +3843,53 @@ namespace dxvk {
} }
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].texelBuffer = m_common->dummyResources().bufferViewDescriptor(); descriptors[i].texelBuffer = m_common->dummyResources().bufferViewDescriptor();
} break; } break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
if (res.bufferSlice.defined()) { if (res.bufferSlice.defined()) {
m_descInfos[i] = res.bufferSlice.getDescriptor(); descriptors[i] = res.bufferSlice.getDescriptor();
if (m_rcTracked.set(binding.slot)) if (m_rcTracked.set(binding.slot))
m_cmd->trackResource<DxvkAccess::Read>(res.bufferSlice.buffer()); m_cmd->trackResource<DxvkAccess::Read>(res.bufferSlice.buffer());
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].buffer = m_common->dummyResources().bufferDescriptor(); descriptors[i].buffer = m_common->dummyResources().bufferDescriptor();
} break; } break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
if (res.bufferSlice.defined()) { if (res.bufferSlice.defined()) {
m_descInfos[i] = res.bufferSlice.getDescriptor(); descriptors[i] = res.bufferSlice.getDescriptor();
if (m_rcTracked.set(binding.slot)) if (m_rcTracked.set(binding.slot))
m_cmd->trackResource<DxvkAccess::Write>(res.bufferSlice.buffer()); m_cmd->trackResource<DxvkAccess::Write>(res.bufferSlice.buffer());
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].buffer = m_common->dummyResources().bufferDescriptor(); descriptors[i].buffer = m_common->dummyResources().bufferDescriptor();
} break; } break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
if (res.bufferSlice.defined()) { if (res.bufferSlice.defined()) {
m_descInfos[i] = res.bufferSlice.getDescriptor(); descriptors[i] = res.bufferSlice.getDescriptor();
m_descInfos[i].buffer.offset = 0; descriptors[i].buffer.offset = 0;
if (m_rcTracked.set(binding.slot)) if (m_rcTracked.set(binding.slot))
m_cmd->trackResource<DxvkAccess::Read>(res.bufferSlice.buffer()); m_cmd->trackResource<DxvkAccess::Read>(res.bufferSlice.buffer());
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].buffer = m_common->dummyResources().bufferDescriptor(); descriptors[i].buffer = m_common->dummyResources().bufferDescriptor();
} break; } break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
if (res.bufferSlice.defined()) { if (res.bufferSlice.defined()) {
m_descInfos[i] = res.bufferSlice.getDescriptor(); descriptors[i] = res.bufferSlice.getDescriptor();
m_descInfos[i].buffer.offset = 0; descriptors[i].buffer.offset = 0;
if (m_rcTracked.set(binding.slot)) if (m_rcTracked.set(binding.slot))
m_cmd->trackResource<DxvkAccess::Write>(res.bufferSlice.buffer()); m_cmd->trackResource<DxvkAccess::Write>(res.bufferSlice.buffer());
} else { } else {
bindMask.clr(i); bindMask.clr(i);
m_descInfos[i].buffer = m_common->dummyResources().bufferDescriptor(); descriptors[i].buffer = m_common->dummyResources().bufferDescriptor();
} break; } break;
default: default:
@ -3917,6 +3897,18 @@ namespace dxvk {
} }
} }
// Allocate and update descriptor set
auto& set = BindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS ? m_gpSet : m_cpSet;
if (layout->bindingCount()) {
set = allocateDescriptorSet(layout->descriptorSetLayout());
m_cmd->updateDescriptorSetWithTemplate(set,
layout->descriptorTemplate(), descriptors.data());
} else {
set = VK_NULL_HANDLE;
}
// Select the active binding mask to update // Select the active binding mask to update
auto& refMask = BindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS auto& refMask = BindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS
? m_state.gp.state.bsBindingMask ? m_state.gp.state.bsBindingMask
@ -3933,23 +3925,6 @@ namespace dxvk {
} }
VkDescriptorSet DxvkContext::updateShaderDescriptors(
const DxvkPipelineLayout* layout) {
VkDescriptorSet descriptorSet = VK_NULL_HANDLE;
if (layout->bindingCount() != 0) {
descriptorSet = allocateDescriptorSet(
layout->descriptorSetLayout());
m_cmd->updateDescriptorSetWithTemplate(
descriptorSet, layout->descriptorTemplate(),
m_descInfos.data());
}
return descriptorSet;
}
template<VkPipelineBindPoint BindPoint> template<VkPipelineBindPoint BindPoint>
void DxvkContext::updateShaderDescriptorSetBinding( void DxvkContext::updateShaderDescriptorSetBinding(
VkDescriptorSet set, VkDescriptorSet set,
@ -4193,15 +4168,13 @@ namespace dxvk {
if (m_flags.any( if (m_flags.any(
DxvkContextFlag::CpDirtyResources, DxvkContextFlag::CpDirtyResources,
DxvkContextFlag::CpDirtyDescriptorOffsets)) DxvkContextFlag::CpDirtyDescriptorBinding))
this->updateComputeShaderResources(); this->updateComputeShaderResources();
if (m_flags.test(DxvkContextFlag::CpDirtyPipelineState)) if (m_flags.test(DxvkContextFlag::CpDirtyPipelineState))
this->updateComputePipelineState(); this->updateComputePipelineState();
if (m_flags.any( if (m_flags.test(DxvkContextFlag::CpDirtyDescriptorBinding))
DxvkContextFlag::CpDirtyDescriptorSet,
DxvkContextFlag::CpDirtyDescriptorOffsets))
this->updateComputeShaderDescriptors(); this->updateComputeShaderDescriptors();
if (m_flags.test(DxvkContextFlag::DirtyPushConstants)) if (m_flags.test(DxvkContextFlag::DirtyPushConstants))
@ -4228,7 +4201,7 @@ namespace dxvk {
if (m_flags.any( if (m_flags.any(
DxvkContextFlag::GpDirtyResources, DxvkContextFlag::GpDirtyResources,
DxvkContextFlag::GpDirtyDescriptorOffsets)) DxvkContextFlag::GpDirtyDescriptorBinding))
this->updateGraphicsShaderResources(); this->updateGraphicsShaderResources();
if (m_flags.test(DxvkContextFlag::GpDirtyPipelineState)) if (m_flags.test(DxvkContextFlag::GpDirtyPipelineState))
@ -4240,9 +4213,7 @@ namespace dxvk {
if (m_flags.test(DxvkContextFlag::GpDirtyPredicate)) if (m_flags.test(DxvkContextFlag::GpDirtyPredicate))
this->updateConditionalRendering(); this->updateConditionalRendering();
if (m_flags.any( if (m_flags.test(DxvkContextFlag::GpDirtyDescriptorBinding))
DxvkContextFlag::GpDirtyDescriptorSet,
DxvkContextFlag::GpDirtyDescriptorOffsets))
this->updateGraphicsShaderDescriptors(); this->updateGraphicsShaderDescriptors();
if (m_flags.any( if (m_flags.any(

View File

@ -1028,8 +1028,6 @@ namespace dxvk {
DxvkBindingSet<MaxNumResourceSlots> m_rcTracked; DxvkBindingSet<MaxNumResourceSlots> m_rcTracked;
std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc; std::array<DxvkShaderResourceSlot, MaxNumResourceSlots> m_rc;
std::array<DxvkDescriptorInfo, MaxNumActiveBindings> m_descInfos;
std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { }; std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { };
std::array<DxvkComputePipeline*, 256> m_cpLookupCache = { }; std::array<DxvkComputePipeline*, 256> m_cpLookupCache = { };
@ -1135,9 +1133,6 @@ namespace dxvk {
bool updateShaderResources( bool updateShaderResources(
const DxvkPipelineLayout* layout); const DxvkPipelineLayout* layout);
VkDescriptorSet updateShaderDescriptors(
const DxvkPipelineLayout* layout);
template<VkPipelineBindPoint BindPoint> template<VkPipelineBindPoint BindPoint>
void updateShaderDescriptorSetBinding( void updateShaderDescriptorSetBinding(
VkDescriptorSet set, VkDescriptorSet set,

View File

@ -29,8 +29,7 @@ namespace dxvk {
GpDirtyPipeline, ///< Graphics pipeline binding is out of date GpDirtyPipeline, ///< Graphics pipeline binding is out of date
GpDirtyPipelineState, ///< Graphics pipeline needs to be recompiled GpDirtyPipelineState, ///< Graphics pipeline needs to be recompiled
GpDirtyResources, ///< Graphics pipeline resource bindings are out of date GpDirtyResources, ///< Graphics pipeline resource bindings are out of date
GpDirtyDescriptorOffsets, ///< Graphics descriptor set needs to be rebound GpDirtyDescriptorBinding, ///< Graphics descriptor set needs to be rebound
GpDirtyDescriptorSet, ///< Graphics descriptor set needs to be updated
GpDirtyVertexBuffers, ///< Vertex buffer bindings are out of date GpDirtyVertexBuffers, ///< Vertex buffer bindings are out of date
GpDirtyIndexBuffer, ///< Index buffer binding are out of date GpDirtyIndexBuffer, ///< Index buffer binding are out of date
GpDirtyXfbBuffers, ///< Transform feedback buffer bindings are out of date GpDirtyXfbBuffers, ///< Transform feedback buffer bindings are out of date
@ -49,8 +48,7 @@ namespace dxvk {
CpDirtyPipeline, ///< Compute pipeline binding are out of date CpDirtyPipeline, ///< Compute pipeline binding are out of date
CpDirtyPipelineState, ///< Compute pipeline needs to be recompiled CpDirtyPipelineState, ///< Compute pipeline needs to be recompiled
CpDirtyResources, ///< Compute pipeline resource bindings are out of date CpDirtyResources, ///< Compute pipeline resource bindings are out of date
CpDirtyDescriptorOffsets, ///< Compute descriptor set needs to be rebound CpDirtyDescriptorBinding, ///< Compute descriptor set needs to be rebound
CpDirtyDescriptorSet, ///< Compute descriptor set needs to be updated
DirtyDrawBuffer, ///< Indirect argument buffer is dirty DirtyDrawBuffer, ///< Indirect argument buffer is dirty
DirtyPushConstants, ///< Push constant data has changed DirtyPushConstants, ///< Push constant data has changed