Ping!

Am 11.01.2018 04:53, schrieb Dave Airlie:
From: Dave Airlie <airl...@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,
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to