d3d12: Move descriptor pools to screen, and add lock
authorJesse Natalie <jenatali@microsoft.com>
Mon, 1 Mar 2021 21:31:26 +0000 (13:31 -0800)
committerMarge Bot <eric+marge@anholt.net>
Tue, 16 Mar 2021 15:22:35 +0000 (15:22 +0000)
Surfaces can be shared across contexts, and can even outlive the
original context that created them, so move the pools to the screen.
Since they no longer belong to a single context, they need a lock now.

v2: Samplers moved back to the context
v3: Fix Linux build

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3812
Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9349>

src/gallium/drivers/d3d12/d3d12_context.cpp
src/gallium/drivers/d3d12/d3d12_context.h
src/gallium/drivers/d3d12/d3d12_descriptor_pool.cpp
src/gallium/drivers/d3d12/d3d12_descriptor_pool.h
src/gallium/drivers/d3d12/d3d12_draw.cpp
src/gallium/drivers/d3d12/d3d12_screen.cpp
src/gallium/drivers/d3d12/d3d12_screen.h
src/gallium/drivers/d3d12/d3d12_surface.cpp

index 9c62cf7..11156bf 100644 (file)
@@ -70,10 +70,7 @@ d3d12_context_destroy(struct pipe_context *pctx)
       d3d12_destroy_batch(ctx, &ctx->batches[i]);
    ctx->cmdlist->Release();
    ctx->cmdqueue_fence->Release();
-   d3d12_descriptor_pool_free(ctx->rtv_pool);
-   d3d12_descriptor_pool_free(ctx->dsv_pool);
    d3d12_descriptor_pool_free(ctx->sampler_pool);
-   d3d12_descriptor_pool_free(ctx->view_pool);
    util_primconvert_destroy(ctx->primconvert);
    slab_destroy_child(&ctx->transfer_pool);
    d3d12_gs_variant_cache_destroy(ctx);
@@ -795,7 +792,6 @@ d3d12_create_sampler_view(struct pipe_context *pctx,
                           struct pipe_resource *texture,
                           const struct pipe_sampler_view *state)
 {
-   struct d3d12_context *ctx = d3d12_context(pctx);
    struct d3d12_screen *screen = d3d12_screen(pctx->screen);
    struct d3d12_resource *res = d3d12_resource(texture);
    struct d3d12_sampler_view *sampler_view = CALLOC_STRUCT(d3d12_sampler_view);
@@ -913,7 +909,10 @@ d3d12_create_sampler_view(struct pipe_context *pctx,
       unreachable("Invalid SRV dimension");
    }
 
-   d3d12_descriptor_pool_alloc_handle(ctx->view_pool, &sampler_view->handle);
+   mtx_lock(&screen->descriptor_pool_mutex);
+   d3d12_descriptor_pool_alloc_handle(screen->view_pool, &sampler_view->handle);
+   mtx_unlock(&screen->descriptor_pool_mutex);
+
    screen->dev->CreateShaderResourceView(d3d12_resource_resource(res), &desc,
                                          sampler_view->handle.cpu_handle);
 
@@ -1714,107 +1713,6 @@ d3d12_flush_resource(struct pipe_context *pctx,
 }
 
 static void
-d3d12_init_null_srvs(struct d3d12_context *ctx)
-{
-   struct d3d12_screen *screen = d3d12_screen(ctx->base.screen);
-
-   for (unsigned i = 0; i < RESOURCE_DIMENSION_COUNT; ++i) {
-      D3D12_SHADER_RESOURCE_VIEW_DESC srv = {};
-
-      srv.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
-      srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
-      switch (i) {
-      case RESOURCE_DIMENSION_BUFFER:
-      case RESOURCE_DIMENSION_UNKNOWN:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
-         srv.Buffer.FirstElement = 0;
-         srv.Buffer.NumElements = 0;
-         srv.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
-         srv.Buffer.StructureByteStride = 0;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE1D:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D;
-         srv.Texture1D.MipLevels = 1;
-         srv.Texture1D.MostDetailedMip = 0;
-         srv.Texture1D.ResourceMinLODClamp = 0.0f;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE1DARRAY:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY;
-         srv.Texture1DArray.MipLevels = 1;
-         srv.Texture1DArray.ArraySize = 1;
-         srv.Texture1DArray.MostDetailedMip = 0;
-         srv.Texture1DArray.FirstArraySlice = 0;
-         srv.Texture1DArray.ResourceMinLODClamp = 0.0f;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE2D:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
-         srv.Texture2D.MipLevels = 1;
-         srv.Texture2D.MostDetailedMip = 0;
-         srv.Texture2D.PlaneSlice = 0;
-         srv.Texture2D.ResourceMinLODClamp = 0.0f;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE2DARRAY:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
-         srv.Texture2DArray.MipLevels = 1;
-         srv.Texture2DArray.ArraySize = 1;
-         srv.Texture2DArray.MostDetailedMip = 0;
-         srv.Texture2DArray.FirstArraySlice = 0;
-         srv.Texture2DArray.PlaneSlice = 0;
-         srv.Texture2DArray.ResourceMinLODClamp = 0.0f;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE2DMS:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE2DMSARRAY:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY;
-         srv.Texture2DMSArray.ArraySize = 1;
-         srv.Texture2DMSArray.FirstArraySlice = 0;
-         break;
-      case RESOURCE_DIMENSION_TEXTURE3D:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;
-         srv.Texture3D.MipLevels = 1;
-         srv.Texture3D.MostDetailedMip = 0;
-         srv.Texture3D.ResourceMinLODClamp = 0.0f;
-         break;
-      case RESOURCE_DIMENSION_TEXTURECUBE:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
-         srv.TextureCube.MipLevels = 1;
-         srv.TextureCube.MostDetailedMip = 0;
-         srv.TextureCube.ResourceMinLODClamp = 0.0f;
-         break;
-      case RESOURCE_DIMENSION_TEXTURECUBEARRAY:
-         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY;
-         srv.TextureCubeArray.MipLevels = 1;
-         srv.TextureCubeArray.NumCubes = 1;
-         srv.TextureCubeArray.MostDetailedMip = 0;
-         srv.TextureCubeArray.First2DArrayFace = 0;
-         srv.TextureCubeArray.ResourceMinLODClamp = 0.0f;
-         break;
-      }
-
-      if (srv.ViewDimension != D3D12_SRV_DIMENSION_UNKNOWN)
-      {
-         d3d12_descriptor_pool_alloc_handle(ctx->view_pool, &ctx->null_srvs[i]);
-         screen->dev->CreateShaderResourceView(NULL, &srv, ctx->null_srvs[i].cpu_handle);
-      }
-   }
-}
-
-static void
-d3d12_init_null_rtv(struct d3d12_context *ctx)
-{
-   struct d3d12_screen *screen = d3d12_screen(ctx->base.screen);
-
-   D3D12_RENDER_TARGET_VIEW_DESC rtv = {};
-   rtv.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
-   rtv.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
-   rtv.Texture2D.MipSlice = 0;
-   rtv.Texture2D.PlaneSlice = 0;
-   d3d12_descriptor_pool_alloc_handle(ctx->rtv_pool, &ctx->null_rtv);
-   screen->dev->CreateRenderTargetView(NULL, &rtv, ctx->null_rtv.cpu_handle);
-}
-
-static void
 d3d12_init_null_sampler(struct d3d12_context *ctx)
 {
    struct d3d12_screen *screen = d3d12_screen(ctx->base.screen);
@@ -1978,41 +1876,13 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
    }
    d3d12_start_batch(ctx, &ctx->batches[0]);
 
-   ctx->rtv_pool = d3d12_descriptor_pool_new(&ctx->base,
-                                             D3D12_DESCRIPTOR_HEAP_TYPE_RTV,
-                                             64);
-   if (!ctx->rtv_pool) {
-      FREE(ctx);
-      return NULL;
-   }
-
-   ctx->dsv_pool = d3d12_descriptor_pool_new(&ctx->base,
-                                             D3D12_DESCRIPTOR_HEAP_TYPE_DSV,
-                                             64);
-   if (!ctx->dsv_pool) {
-      FREE(ctx);
-      return NULL;
-   }
-
-   ctx->sampler_pool = d3d12_descriptor_pool_new(&ctx->base,
+   ctx->sampler_pool = d3d12_descriptor_pool_new(screen,
                                                  D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER,
                                                  64);
    if (!ctx->sampler_pool) {
       FREE(ctx);
       return NULL;
    }
-
-   ctx->view_pool = d3d12_descriptor_pool_new(&ctx->base,
-                                             D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
-                                             1024);
-   if (!ctx->view_pool) {
-      debug_printf("D3D12: failed to create CBV/SRV descriptor pool\n");
-      FREE(ctx);
-      return NULL;
-   }
-
-   d3d12_init_null_srvs(ctx);
-   d3d12_init_null_rtv(ctx);
    d3d12_init_null_sampler(ctx);
 
    ctx->validation_tools = d3d12_validator_create();
index 5d7cdec..dc7b1f3 100644 (file)
@@ -87,22 +87,6 @@ enum d3d12_binding_type {
    D3D12_NUM_BINDING_TYPES
 };
 
-enum resource_dimension
-{
-   RESOURCE_DIMENSION_UNKNOWN = 0,
-   RESOURCE_DIMENSION_BUFFER = 1,
-   RESOURCE_DIMENSION_TEXTURE1D = 2,
-   RESOURCE_DIMENSION_TEXTURE2D = 3,
-   RESOURCE_DIMENSION_TEXTURE2DMS = 4,
-   RESOURCE_DIMENSION_TEXTURE3D = 5,
-   RESOURCE_DIMENSION_TEXTURECUBE = 6,
-   RESOURCE_DIMENSION_TEXTURE1DARRAY = 7,
-   RESOURCE_DIMENSION_TEXTURE2DARRAY = 8,
-   RESOURCE_DIMENSION_TEXTURE2DMSARRAY = 9,
-   RESOURCE_DIMENSION_TEXTURECUBEARRAY = 10,
-   RESOURCE_DIMENSION_COUNT
-};
-
 struct d3d12_sampler_state {
    struct d3d12_descriptor_handle handle, handle_without_shadow;
    bool is_integer_texture;
@@ -230,13 +214,7 @@ struct d3d12_context {
    struct list_head active_queries;
    bool queries_disabled;
 
-   struct d3d12_descriptor_pool *rtv_pool;
-   struct d3d12_descriptor_pool *dsv_pool;
    struct d3d12_descriptor_pool *sampler_pool;
-   struct d3d12_descriptor_pool *view_pool;
-
-   struct d3d12_descriptor_handle null_srvs[RESOURCE_DIMENSION_COUNT];
-   struct d3d12_descriptor_handle null_rtv;
    struct d3d12_descriptor_handle null_sampler;
 
    PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE D3D12SerializeVersionedRootSignature;
index 9ba394b..1dfbf64 100644 (file)
@@ -193,7 +193,7 @@ d3d12_descriptor_heap_clear(struct d3d12_descriptor_heap *heap)
 }
 
 struct d3d12_descriptor_pool*
-d3d12_descriptor_pool_new(pipe_context *pctx,
+d3d12_descriptor_pool_new(struct d3d12_screen *screen,
                           D3D12_DESCRIPTOR_HEAP_TYPE type,
                           uint32_t num_descriptors)
 {
@@ -201,7 +201,7 @@ d3d12_descriptor_pool_new(pipe_context *pctx,
    if (!pool)
       return NULL;
 
-   pool->dev = d3d12_screen(pctx->screen)->dev;
+   pool->dev = screen->dev;
    pool->type = type;
    pool->num_descriptors = num_descriptors;
    list_inithead(&pool->heaps);
index 1110895..9339ced 100644 (file)
@@ -24,7 +24,9 @@
 #ifndef D3D12_DESCRIPTOR_POOL_H
 #define D3D12_DESCRIPTOR_POOL_H
 
-#include "pipe/p_context.h"
+#ifndef _WIN32
+#include <wsl/winadapter.h>
+#endif
 
 #define D3D12_IGNORE_SDK_LAYERS
 #include <directx/d3d12.h>
@@ -50,7 +52,7 @@ d3d12_descriptor_handle_free(struct d3d12_descriptor_handle *handle);
 /* Offline Descriptor Pool */
 
 struct d3d12_descriptor_pool*
-d3d12_descriptor_pool_new(struct pipe_context *pctx,
+d3d12_descriptor_pool_new(struct d3d12_screen *screen,
                           D3D12_DESCRIPTOR_HEAP_TYPE type,
                           uint32_t num_descriptors);
 
index 0513dc5..7d05923 100644 (file)
@@ -86,6 +86,7 @@ fill_srv_descriptors(struct d3d12_context *ctx,
                      unsigned stage)
 {
    struct d3d12_batch *batch = d3d12_current_batch(ctx);
+   struct d3d12_screen *screen = d3d12_screen(ctx->base.screen);
    D3D12_CPU_DESCRIPTOR_HANDLE descs[PIPE_MAX_SHADER_SAMPLER_VIEWS];
    struct d3d12_descriptor_handle table_start;
 
@@ -121,7 +122,7 @@ fill_srv_descriptors(struct d3d12_context *ctx,
                                                 state);
          }
       } else {
-         descs[i] = ctx->null_srvs[shader->srv_bindings[i].dimension].cpu_handle;
+         descs[i] = screen->null_srvs[shader->srv_bindings[i].dimension].cpu_handle;
       }
    }
 
@@ -443,6 +444,7 @@ d3d12_draw_vbo(struct pipe_context *pctx,
       return;
 
    struct d3d12_context *ctx = d3d12_context(pctx);
+   struct d3d12_screen *screen = d3d12_screen(pctx->screen);
    struct d3d12_batch *batch;
    struct pipe_resource *index_buffer = NULL;
    unsigned index_offset = 0;
@@ -665,7 +667,7 @@ d3d12_draw_vbo(struct pipe_context *pctx,
             render_targets[i] = d3d12_surface_get_handle(surface, conversion_modes[i]);
             d3d12_batch_reference_surface_texture(batch, surface);
          } else
-            render_targets[i] = ctx->null_rtv.cpu_handle;
+            render_targets[i] = screen->null_rtv.cpu_handle;
       }
       if (ctx->fb.zsbuf) {
          struct d3d12_surface *surface = d3d12_surface(ctx->fb.zsbuf);
index 6b14b8e..4f5af79 100644 (file)
@@ -600,10 +600,14 @@ d3d12_destroy_screen(struct pipe_screen *pscreen)
 {
    struct d3d12_screen *screen = d3d12_screen(pscreen);
    slab_destroy_parent(&screen->transfer_pool);
+   d3d12_descriptor_pool_free(screen->rtv_pool);
+   d3d12_descriptor_pool_free(screen->dsv_pool);
+   d3d12_descriptor_pool_free(screen->view_pool);
    screen->readback_slab_bufmgr->destroy(screen->readback_slab_bufmgr);
    screen->slab_bufmgr->destroy(screen->slab_bufmgr);
    screen->cache_bufmgr->destroy(screen->cache_bufmgr);
    screen->bufmgr->destroy(screen->bufmgr);
+   mtx_destroy(&screen->descriptor_pool_mutex);
    FREE(screen);
 }
 
@@ -755,12 +759,110 @@ can_attribute_at_vertex(struct d3d12_screen *screen)
    }
 }
 
+static void
+d3d12_init_null_srvs(struct d3d12_screen *screen)
+{
+   for (unsigned i = 0; i < RESOURCE_DIMENSION_COUNT; ++i) {
+      D3D12_SHADER_RESOURCE_VIEW_DESC srv = {};
+
+      srv.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
+      srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+      switch (i) {
+      case RESOURCE_DIMENSION_BUFFER:
+      case RESOURCE_DIMENSION_UNKNOWN:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
+         srv.Buffer.FirstElement = 0;
+         srv.Buffer.NumElements = 0;
+         srv.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
+         srv.Buffer.StructureByteStride = 0;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE1D:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D;
+         srv.Texture1D.MipLevels = 1;
+         srv.Texture1D.MostDetailedMip = 0;
+         srv.Texture1D.ResourceMinLODClamp = 0.0f;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE1DARRAY:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY;
+         srv.Texture1DArray.MipLevels = 1;
+         srv.Texture1DArray.ArraySize = 1;
+         srv.Texture1DArray.MostDetailedMip = 0;
+         srv.Texture1DArray.FirstArraySlice = 0;
+         srv.Texture1DArray.ResourceMinLODClamp = 0.0f;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE2D:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+         srv.Texture2D.MipLevels = 1;
+         srv.Texture2D.MostDetailedMip = 0;
+         srv.Texture2D.PlaneSlice = 0;
+         srv.Texture2D.ResourceMinLODClamp = 0.0f;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE2DARRAY:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
+         srv.Texture2DArray.MipLevels = 1;
+         srv.Texture2DArray.ArraySize = 1;
+         srv.Texture2DArray.MostDetailedMip = 0;
+         srv.Texture2DArray.FirstArraySlice = 0;
+         srv.Texture2DArray.PlaneSlice = 0;
+         srv.Texture2DArray.ResourceMinLODClamp = 0.0f;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE2DMS:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE2DMSARRAY:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY;
+         srv.Texture2DMSArray.ArraySize = 1;
+         srv.Texture2DMSArray.FirstArraySlice = 0;
+         break;
+      case RESOURCE_DIMENSION_TEXTURE3D:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;
+         srv.Texture3D.MipLevels = 1;
+         srv.Texture3D.MostDetailedMip = 0;
+         srv.Texture3D.ResourceMinLODClamp = 0.0f;
+         break;
+      case RESOURCE_DIMENSION_TEXTURECUBE:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
+         srv.TextureCube.MipLevels = 1;
+         srv.TextureCube.MostDetailedMip = 0;
+         srv.TextureCube.ResourceMinLODClamp = 0.0f;
+         break;
+      case RESOURCE_DIMENSION_TEXTURECUBEARRAY:
+         srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY;
+         srv.TextureCubeArray.MipLevels = 1;
+         srv.TextureCubeArray.NumCubes = 1;
+         srv.TextureCubeArray.MostDetailedMip = 0;
+         srv.TextureCubeArray.First2DArrayFace = 0;
+         srv.TextureCubeArray.ResourceMinLODClamp = 0.0f;
+         break;
+      }
+
+      if (srv.ViewDimension != D3D12_SRV_DIMENSION_UNKNOWN)
+      {
+         d3d12_descriptor_pool_alloc_handle(screen->view_pool, &screen->null_srvs[i]);
+         screen->dev->CreateShaderResourceView(NULL, &srv, screen->null_srvs[i].cpu_handle);
+      }
+   }
+}
+
+static void
+d3d12_init_null_rtv(struct d3d12_screen *screen)
+{
+   D3D12_RENDER_TARGET_VIEW_DESC rtv = {};
+   rtv.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+   rtv.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
+   rtv.Texture2D.MipSlice = 0;
+   rtv.Texture2D.PlaneSlice = 0;
+   d3d12_descriptor_pool_alloc_handle(screen->rtv_pool, &screen->null_rtv);
+   screen->dev->CreateRenderTargetView(NULL, &rtv, screen->null_rtv.cpu_handle);
+}
+
 bool
 d3d12_init_screen(struct d3d12_screen *screen, struct sw_winsys *winsys, IUnknown *adapter)
 {
    d3d12_debug = debug_get_option_d3d12_debug();
 
    screen->winsys = winsys;
+   mtx_init(&screen->descriptor_pool_mutex, mtx_plain);
 
    screen->base.get_vendor = d3d12_get_vendor;
    screen->base.get_device_vendor = d3d12_get_device_vendor;
@@ -890,6 +992,19 @@ d3d12_init_screen(struct d3d12_screen *screen, struct sw_winsys *winsys, IUnknow
                                                                D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
                                                                &desc);
 
+   screen->rtv_pool = d3d12_descriptor_pool_new(screen,
+                                                D3D12_DESCRIPTOR_HEAP_TYPE_RTV,
+                                                64);
+   screen->dsv_pool = d3d12_descriptor_pool_new(screen,
+                                                D3D12_DESCRIPTOR_HEAP_TYPE_DSV,
+                                                64);
+   screen->view_pool = d3d12_descriptor_pool_new(screen,
+                                                 D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
+                                                 1024);
+
+   d3d12_init_null_srvs(screen);
+   d3d12_init_null_rtv(screen);
+
    screen->have_load_at_vertex = can_attribute_at_vertex(screen);
    return true;
 
index 347a6c5..9aa4ffb 100644 (file)
@@ -27,6 +27,7 @@
 #include "pipe/p_screen.h"
 
 #include "util/slab.h"
+#include "d3d12_descriptor_pool.h"
 
 #ifndef _WIN32
 #include <wsl/winadapter.h>
 
 struct pb_manager;
 
+enum resource_dimension
+{
+   RESOURCE_DIMENSION_UNKNOWN = 0,
+   RESOURCE_DIMENSION_BUFFER = 1,
+   RESOURCE_DIMENSION_TEXTURE1D = 2,
+   RESOURCE_DIMENSION_TEXTURE2D = 3,
+   RESOURCE_DIMENSION_TEXTURE2DMS = 4,
+   RESOURCE_DIMENSION_TEXTURE3D = 5,
+   RESOURCE_DIMENSION_TEXTURECUBE = 6,
+   RESOURCE_DIMENSION_TEXTURE1DARRAY = 7,
+   RESOURCE_DIMENSION_TEXTURE2DARRAY = 8,
+   RESOURCE_DIMENSION_TEXTURE2DMSARRAY = 9,
+   RESOURCE_DIMENSION_TEXTURECUBEARRAY = 10,
+   RESOURCE_DIMENSION_COUNT
+};
+
 struct d3d12_screen {
    struct pipe_screen base;
    struct sw_winsys *winsys;
@@ -50,6 +67,14 @@ struct d3d12_screen {
    struct pb_manager *slab_bufmgr;
    struct pb_manager *readback_slab_bufmgr;
 
+   mtx_t descriptor_pool_mutex;
+   struct d3d12_descriptor_pool *rtv_pool;
+   struct d3d12_descriptor_pool *dsv_pool;
+   struct d3d12_descriptor_pool *view_pool;
+
+   struct d3d12_descriptor_handle null_srvs[RESOURCE_DIMENSION_COUNT];
+   struct d3d12_descriptor_handle null_rtv;
+
    /* capabilities */
    D3D_FEATURE_LEVEL max_feature_level;
    D3D12_FEATURE_DATA_ARCHITECTURE architecture;
index d7f85a2..58516f6 100644 (file)
@@ -86,7 +86,6 @@ initialize_dsv(struct pipe_context *pctx,
                DXGI_FORMAT dxgi_format)
 {
    struct d3d12_resource *res = d3d12_resource(pres);
-   struct d3d12_context *ctx = d3d12_context(pctx);
    struct d3d12_screen *screen = d3d12_screen(pctx->screen);
 
    D3D12_DEPTH_STENCIL_VIEW_DESC desc;
@@ -139,7 +138,10 @@ initialize_dsv(struct pipe_context *pctx,
       unreachable("Unhandled DSV dimension");
    }
 
-   d3d12_descriptor_pool_alloc_handle(ctx->dsv_pool, handle);
+   mtx_lock(&screen->descriptor_pool_mutex);
+   d3d12_descriptor_pool_alloc_handle(screen->dsv_pool, handle);
+   mtx_unlock(&screen->descriptor_pool_mutex);
+
    screen->dev->CreateDepthStencilView(d3d12_resource_resource(res), &desc,
                                        handle->cpu_handle);
 }
@@ -152,7 +154,6 @@ initialize_rtv(struct pipe_context *pctx,
                DXGI_FORMAT dxgi_format)
 {
    struct d3d12_resource *res = d3d12_resource(pres);
-   struct d3d12_context *ctx = d3d12_context(pctx);
    struct d3d12_screen *screen = d3d12_screen(pctx->screen);
 
    D3D12_RENDER_TARGET_VIEW_DESC desc;
@@ -216,7 +217,10 @@ initialize_rtv(struct pipe_context *pctx,
       unreachable("Unhandled RTV dimension");
    }
 
-   d3d12_descriptor_pool_alloc_handle(ctx->rtv_pool, handle);
+   mtx_lock(&screen->descriptor_pool_mutex);
+   d3d12_descriptor_pool_alloc_handle(screen->rtv_pool, handle);
+   mtx_unlock(&screen->descriptor_pool_mutex);
+
    screen->dev->CreateRenderTargetView(d3d12_resource_resource(res), &desc,
                                        handle->cpu_handle);
 }
@@ -262,10 +266,14 @@ d3d12_surface_destroy(struct pipe_context *pctx,
                       struct pipe_surface *psurf)
 {
    struct d3d12_surface *surface = (struct d3d12_surface*) psurf;
+   struct d3d12_screen *screen = d3d12_screen(pctx->screen);
 
+   mtx_lock(&screen->descriptor_pool_mutex);
    d3d12_descriptor_handle_free(&surface->desc_handle);
    if (d3d12_descriptor_handle_is_allocated(&surface->uint_rtv_handle))
       d3d12_descriptor_handle_free(&surface->uint_rtv_handle);
+   mtx_unlock(&screen->descriptor_pool_mutex);
+
    pipe_resource_reference(&psurf->texture, NULL);
    pipe_resource_reference(&surface->rgba_texture, NULL);
    FREE(surface);