On 6/4/20 4:17 PM, Henri Verbeet wrote:
On Fri, 5 Jun 2020 at 01:30, Zebediah Figura <zfigura(a)codeweavers.com> wrote:
On 6/4/20 3:48 PM, Henri Verbeet wrote:
On Thu, 4 Jun 2020 at 06:19, Zebediah Figura <zfigura(a)codeweavers.com> wrote:
@@ -2678,14 +2679,20 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list unsigned int register_idx = range->base_register_idx + j;
/* Track UAV counters. */ - if (range->descriptor_magic == VKD3D_DESCRIPTOR_MAGIC_UAV - && register_idx < ARRAY_SIZE(bindings->vk_uav_counter_views)) + if (range->descriptor_magic == VKD3D_DESCRIPTOR_MAGIC_UAV) { - VkBufferView vk_counter_view = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV - ? descriptor->u.view->vk_counter_view : VK_NULL_HANDLE; - if (bindings->vk_uav_counter_views[register_idx] != vk_counter_view) - bindings->uav_counter_dirty_mask |= 1u << register_idx; - bindings->vk_uav_counter_views[register_idx] = vk_counter_view; + for (k = 0; k < vkd3d_popcount(state->uav_counter_mask); ++k) + { + if (state->uav_counters[k].register_index == register_idx) + { + VkBufferView vk_counter_view = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV + ? descriptor->u.view->vk_counter_view : VK_NULL_HANDLE; + if (bindings->vk_uav_counter_views[k] != vk_counter_view) + bindings->uav_counter_dirty_mask |= 1u << k;
Note that after this patch, "uav_counter_dirty_mask" isn't really being used as a mask anymore.
Well, unless I've made a mistake, it's still a mask; it's just masking indices to the uav_counters/vk_uav_counter_views array instead of register indices...
Yes, but after
- if (!state || !(state->uav_counter_mask & bindings->uav_counter_dirty_mask)) + if (!state || !bindings->uav_counter_dirty_mask) we never check or clear individual indices.
Ah, right. I'll flatten it down to a single flag, then.