[PATCH vkd3d 2/6] vkd3d: Use a binary search for matching a descriptor to an allocation.
Henri Verbeet
hverbeet at gmail.com
Wed Dec 15 12:18:05 CST 2021
On Fri, 10 Dec 2021 at 06:07, Conor McCarthy <cmccarthy at codeweavers.com> wrote:
> @@ -2199,7 +2200,13 @@ bool vkd3d_gpu_descriptor_allocator_register_range(struct vkd3d_gpu_descriptor_a
> return false;
> }
>
> - allocation = &allocator->allocations[allocator->allocation_count++];
> + for (i = 0; i < allocator->allocation_count; ++i)
> + if (base < allocator->allocations[i].base)
> + break;
> +
We could use a binary search here...
> + allocation = &allocator->allocations[i];
> + memmove(allocation + 1, allocation, (allocator->allocation_count++ - i) * sizeof(*allocation));
> +
"&allocation[1]", arguably.
> +/* We could use bsearch() or recursion here, but it probably helps to omit
> + * all the extra function calls. */
> +static struct vkd3d_gpu_descriptor_allocation *vkd3d_gpu_descriptor_allocator_binary_search(
> + const struct vkd3d_gpu_descriptor_allocator *allocator, const struct d3d12_desc *desc)
> +{
The fact that this is using a binary search is really just an
implementation detail; callers wouldn't care if this e.g. used an
rbtree instead. Something like
vkd3d_gpu_descriptor_allocator_find()/_search()/_get() seems more
appropriate.
> + struct vkd3d_gpu_descriptor_allocation *allocations = allocator->allocations;
> + const struct d3d12_desc *base;
> + size_t centre, count;
> +
> + for (count = allocator->allocation_count; count > 1; )
> + {
> + centre = count >> 1;
> + base = allocations[centre].base;
> + if (base <= desc)
> + {
> + allocations += centre;
> + count -= centre;
> + }
> + else
> + {
> + count = centre;
> + }
> + }
> +
> + return (desc >= allocations->base && desc < allocations->base + allocations->count) ? allocations : NULL;
> +}
> +
"allocations->base + allocations->count" probably can't overflow
because of other constraints, but by convention, we'd probably want
that check to be "desc - allocations->base < allocations->count".
More information about the wine-devel
mailing list