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 +#endif #define D3D12_IGNORE_SDK_LAYERS #include @@ -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 @@ -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);