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);
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);
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);
}
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);
}
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();
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;
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;
}
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)
{
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);
#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>
/* 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);
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;
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;
}
}
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;
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);
{
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);
}
}
}
+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;
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;
#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;
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;
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;
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);
}
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;
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);
}
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);