[Mesa-dev] [PATCH] radv/winsys: replace bo list searchs with a hash table.
Dave Airlie
airlied at gmail.com
Wed Jan 31 02:38:54 UTC 2018
On 31 January 2018 at 12:27, Dieter Nützel <Dieter at nuetzel-hh.de> wrote:
> Ping!
I'm not sure this was much of a win, and if it makes things worse in some cases,
then it needs a lot more investigation, so probably consider it dead for now.
Dave.
>
> Am 11.01.2018 04:53, schrieb Dave Airlie:
>>
>> From: Dave Airlie <airlied at redhat.com>
>>
>> This should make the merging of cmd buffers less CPU intensive,
>> note I said *should* :)
>> ---
>> src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 47
>> ++++++++++++---------------
>> 1 file changed, 20 insertions(+), 27 deletions(-)
>>
>> diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
>> b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
>> index 0ee56f91447..9a39d237ae8 100644
>> --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
>> +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
>> @@ -33,6 +33,7 @@
>> #include "radv_amdgpu_bo.h"
>> #include "sid.h"
>>
>> +#include "util/hash_table.h"
>>
>> enum {
>> VIRTUAL_BUFFER_HASH_TABLE_SIZE = 1024
>> @@ -584,6 +585,9 @@ static int radv_amdgpu_create_bo_list(struct
>> radv_amdgpu_winsys *ws,
>> priorities[0] = 8;
>> }
>>
>> + struct hash_table *ht = _mesa_hash_table_create(NULL,
>> _mesa_hash_pointer,
>> +
>> _mesa_key_pointer_equal);
>> +
>> for (unsigned i = 0; i < count + !!extra_cs; ++i) {
>> struct radv_amdgpu_cs *cs;
>>
>> @@ -595,50 +599,39 @@ static int radv_amdgpu_create_bo_list(struct
>> radv_amdgpu_winsys *ws,
>> if (!cs->num_buffers)
>> continue;
>>
>> - if (unique_bo_count == 0) {
>> - memcpy(handles, cs->handles,
>> cs->num_buffers * sizeof(amdgpu_bo_handle));
>> - memcpy(priorities, cs->priorities,
>> cs->num_buffers * sizeof(uint8_t));
>> - unique_bo_count = cs->num_buffers;
>> - continue;
>> - }
>> - int unique_bo_so_far = unique_bo_count;
>> for (unsigned j = 0; j < cs->num_buffers; ++j) {
>> - bool found = false;
>> - for (unsigned k = 0; k < unique_bo_so_far;
>> ++k) {
>> - if (handles[k] == cs->handles[j])
>> {
>> - found = true;
>> - priorities[k] =
>> MAX2(priorities[k],
>> -
>> cs->priorities[j]);
>> - break;
>> - }
>> - }
>> - if (!found) {
>> + struct hash_entry *entry =
>> _mesa_hash_table_search(ht, (void
>> *)cs->handles[j]);
>> + if (!entry) {
>> + _mesa_hash_table_insert(ht, (void
>> *)cs->handles[j], (void
>> *)(uintptr_t)unique_bo_count);
>> handles[unique_bo_count] =
>> cs->handles[j];
>> priorities[unique_bo_count] =
>> cs->priorities[j];
>> ++unique_bo_count;
>> + } else {
>> + int bo_idx = (uint32_t)(unsigned
>> long)entry->data;
>> + priorities[bo_idx] =
>> MAX2(priorities[bo_idx],
>> +
>> cs->priorities[j]);
>> }
>> }
>> for (unsigned j = 0; j < cs->num_virtual_buffers;
>> ++j) {
>> struct radv_amdgpu_winsys_bo *virtual_bo =
>> radv_amdgpu_winsys_bo(cs->virtual_buffers[j]);
>> for(unsigned k = 0; k <
>> virtual_bo->bo_count; ++k) {
>> struct radv_amdgpu_winsys_bo *bo =
>> virtual_bo->bos[k];
>> - bool found = false;
>> - for (unsigned m = 0; m <
>> unique_bo_count; ++m) {
>> - if (handles[m] == bo->bo)
>> {
>> - found = true;
>> - priorities[m] =
>> MAX2(priorities[m],
>> -
>> cs->virtual_buffer_priorities[j]);
>> - break;
>> - }
>> - }
>> - if (!found) {
>> +
>> + struct hash_entry *entry =
>> _mesa_hash_table_search(ht, (void *)bo->bo);
>> + if (!entry) {
>> +
>> _mesa_hash_table_insert(ht, (void *)bo->bo, (void
>> *)(uintptr_t)unique_bo_count);
>> handles[unique_bo_count] =
>> bo->bo;
>>
>> priorities[unique_bo_count] = cs->virtual_buffer_priorities[j];
>> ++unique_bo_count;
>> + } else {
>> + int bo_idx =
>> (uint32_t)(unsigned long)entry->data;
>> + priorities[bo_idx] =
>> MAX2(priorities[bo_idx],
>> +
>> cs->virtual_buffer_priorities[j]);
>> }
>> }
>> }
>> }
>> + _mesa_hash_table_destroy(ht, NULL);
>>
>> if (unique_bo_count > 0) {
>> r = amdgpu_bo_list_create(ws->dev,
>> unique_bo_count, handles,
More information about the mesa-dev
mailing list