mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 19:40:10 +01:00
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 <billkris@microsoft.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9349>
This commit is contained in:
parent
7c68a2518f
commit
6db28f5201
8 changed files with 167 additions and 167 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue