Module: Mesa
Branch: master
Commit: 6db28f520121196c7ec19afa2abf91b6fe5fb2da
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6db28f520121196c7ec19afa2abf91b6fe5fb2da

Author: Jesse Natalie <jenat...@microsoft.com>
Date:   Mon Mar  1 13:31:26 2021 -0800

d3d12: Move descriptor pools to screen, and add lock

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 <billk...@microsoft.com>
Reviewed-by: Erik Faye-Lund <erik.faye-l...@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9349>

---

 src/gallium/drivers/d3d12/d3d12_context.cpp        | 140 +--------------------
 src/gallium/drivers/d3d12/d3d12_context.h          |  22 ----
 .../drivers/d3d12/d3d12_descriptor_pool.cpp        |   4 +-
 src/gallium/drivers/d3d12/d3d12_descriptor_pool.h  |   6 +-
 src/gallium/drivers/d3d12/d3d12_draw.cpp           |   6 +-
 src/gallium/drivers/d3d12/d3d12_screen.cpp         | 115 +++++++++++++++++
 src/gallium/drivers/d3d12/d3d12_screen.h           |  25 ++++
 src/gallium/drivers/d3d12/d3d12_surface.cpp        |  16 ++-
 8 files changed, 167 insertions(+), 167 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp 
b/src/gallium/drivers/d3d12/d3d12_context.cpp
index 9c62cf77503..11156bf0abf 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_context.cpp
@@ -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);
 
@@ -1713,107 +1712,6 @@ d3d12_flush_resource(struct pipe_context *pctx,
    d3d12_apply_resource_states(ctx);
 }
 
-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)
 {
@@ -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();
diff --git a/src/gallium/drivers/d3d12/d3d12_context.h 
b/src/gallium/drivers/d3d12/d3d12_context.h
index 5d7cdec3fe2..dc7b1f38d55 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.h
+++ b/src/gallium/drivers/d3d12/d3d12_context.h
@@ -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;
diff --git a/src/gallium/drivers/d3d12/d3d12_descriptor_pool.cpp 
b/src/gallium/drivers/d3d12/d3d12_descriptor_pool.cpp
index 9ba394b994a..1dfbf644dd4 100644
--- a/src/gallium/drivers/d3d12/d3d12_descriptor_pool.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_descriptor_pool.cpp
@@ -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);
diff --git a/src/gallium/drivers/d3d12/d3d12_descriptor_pool.h 
b/src/gallium/drivers/d3d12/d3d12_descriptor_pool.h
index 11108951ab6..9339ced160b 100644
--- a/src/gallium/drivers/d3d12/d3d12_descriptor_pool.h
+++ b/src/gallium/drivers/d3d12/d3d12_descriptor_pool.h
@@ -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);
 
diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp 
b/src/gallium/drivers/d3d12/d3d12_draw.cpp
index 0513dc52bb8..7d05923e0f0 100644
--- a/src/gallium/drivers/d3d12/d3d12_draw.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp
@@ -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);
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp 
b/src/gallium/drivers/d3d12/d3d12_screen.cpp
index 6b14b8ebf82..4f5af7939df 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp
@@ -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;
 
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h 
b/src/gallium/drivers/d3d12/d3d12_screen.h
index 347a6c5ce5d..9aa4ffb27a5 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.h
+++ b/src/gallium/drivers/d3d12/d3d12_screen.h
@@ -27,6 +27,7 @@
 #include "pipe/p_screen.h"
 
 #include "util/slab.h"
+#include "d3d12_descriptor_pool.h"
 
 #ifndef _WIN32
 #include <wsl/winadapter.h>
@@ -37,6 +38,22 @@
 
 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;
diff --git a/src/gallium/drivers/d3d12/d3d12_surface.cpp 
b/src/gallium/drivers/d3d12/d3d12_surface.cpp
index d7f85a20b4b..58516f6a343 100644
--- a/src/gallium/drivers/d3d12/d3d12_surface.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_surface.cpp
@@ -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);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to