d3d12: Assign up to 16 simultaneously active contexts unique IDs
authorGiancarlo Devich <giancarlodevich@live.com>
Sat, 25 Feb 2023 00:19:16 +0000 (16:19 -0800)
committerMarge Bot <emma+marge@anholt.net>
Sat, 25 Feb 2023 18:14:37 +0000 (18:14 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21528>

src/gallium/drivers/d3d12/d3d12_context.cpp
src/gallium/drivers/d3d12/d3d12_context.h
src/gallium/drivers/d3d12/d3d12_screen.cpp
src/gallium/drivers/d3d12/d3d12_screen.h

index 933c295..d3a0330 100644 (file)
@@ -69,6 +69,8 @@ d3d12_context_destroy(struct pipe_context *pctx)
    struct d3d12_screen *screen = d3d12_screen(pctx->screen);
    mtx_lock(&screen->submit_mutex);
    list_del(&ctx->context_list_entry);
+   if (ctx->id != D3D12_CONTEXT_NO_ID)
+      screen->context_id_list[screen->context_id_count++] = ctx->id;
    mtx_unlock(&screen->submit_mutex);
 
 #ifdef _WIN32
@@ -2589,6 +2591,10 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 
    mtx_lock(&screen->submit_mutex);
    list_addtail(&ctx->context_list_entry, &screen->context_list);
+   if (screen->context_id_count > 0)
+      ctx->id = screen->context_id_list[--screen->context_id_count];
+   else
+      ctx->id = D3D12_CONTEXT_NO_ID;
    mtx_unlock(&screen->submit_mutex);
 
    if (flags & PIPE_CONTEXT_PREFER_THREADED)
index 27ff9ba..7258b0c 100644 (file)
@@ -158,8 +158,12 @@ struct dxil_validator;
 class ResourceStateManager;
 #endif
 
+#define D3D12_CONTEXT_NO_ID 0xffffffff
+
 struct d3d12_context {
    struct pipe_context base;
+
+   unsigned id;
    struct slab_child_pool transfer_pool;
    struct slab_child_pool transfer_pool_unsync;
    struct list_head context_list_entry;
index d3757c9..c1c128d 100644 (file)
@@ -1239,6 +1239,12 @@ d3d12_init_screen_base(struct d3d12_screen *screen, struct sw_winsys *winsys, LU
    mtx_init(&screen->submit_mutex, mtx_plain);
 
    list_inithead(&screen->context_list);
+   screen->context_id_count = 16;
+
+   // Fill the array backwards, because we'll pop off the back to assign ids
+   for (unsigned i = 0; i < 16; ++i)
+      screen->context_id_list[i] = 15 - i;
+
    slab_create_parent(&screen->transfer_pool, sizeof(struct d3d12_transfer), 16);
 
    screen->base.get_vendor = d3d12_get_vendor;
index e691007..de68040 100644 (file)
@@ -80,6 +80,8 @@ struct d3d12_screen {
    uint64_t residency_fence_value;
 
    struct list_head context_list;
+   unsigned context_id_list[16];
+   unsigned context_id_count;
 
    struct slab_parent_pool transfer_pool;
    struct pb_manager *bufmgr;