From 035db6f0118101da395f89a4288380760a11a604 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Sun, 28 Aug 2022 06:40:23 -0700 Subject: [PATCH] d3d12: Use ID3D12DeviceConfiguration for root signature serialization If we were able to create a device factory from a DLL-local D3D12Core, we want to use that one to do root signature serialization, instead of going to the globally-configured D3D12Core. Reviewed-by: Sil Vilerino Part-of: --- src/gallium/drivers/d3d12/d3d12_context.cpp | 4 ++++ src/gallium/drivers/d3d12/d3d12_context.h | 1 + src/gallium/drivers/d3d12/d3d12_root_signature.cpp | 16 ++++++++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index 2f44e93..9538d83 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -79,6 +79,9 @@ d3d12_context_destroy(struct pipe_context *pctx) dxil_destroy_validator(ctx->dxil_validator); #endif + if (ctx->dev_config) + ctx->dev_config->Release(); + if (ctx->timestamp_query) pctx->destroy_query(pctx, ctx->timestamp_query); @@ -2545,6 +2548,7 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->D3D12SerializeVersionedRootSignature = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)util_dl_get_proc_address(screen->d3d12_mod, "D3D12SerializeVersionedRootSignature"); + (void)screen->dev->QueryInterface(&ctx->dev_config); ctx->submit_id = (uint64_t)p_atomic_add_return(&screen->ctx_count, 1) << 32ull; diff --git a/src/gallium/drivers/d3d12/d3d12_context.h b/src/gallium/drivers/d3d12/d3d12_context.h index 2df17a8..3b09c41 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.h +++ b/src/gallium/drivers/d3d12/d3d12_context.h @@ -254,6 +254,7 @@ struct d3d12_context { struct d3d12_descriptor_handle null_sampler; PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE D3D12SerializeVersionedRootSignature; + ID3D12DeviceConfiguration *dev_config; #ifdef _WIN32 struct dxil_validator *dxil_validator; #endif diff --git a/src/gallium/drivers/d3d12/d3d12_root_signature.cpp b/src/gallium/drivers/d3d12/d3d12_root_signature.cpp index 07b35ee..8cdaadd 100644 --- a/src/gallium/drivers/d3d12/d3d12_root_signature.cpp +++ b/src/gallium/drivers/d3d12/d3d12_root_signature.cpp @@ -208,10 +208,18 @@ create_root_signature(struct d3d12_context *ctx, struct d3d12_root_signature_key root_sig_desc.Desc_1_1.Flags |= D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT; ComPtr sig, error; - if (FAILED(ctx->D3D12SerializeVersionedRootSignature(&root_sig_desc, - &sig, &error))) { - debug_printf("D3D12SerializeRootSignature failed\n"); - return NULL; + if (ctx->dev_config) { + if (FAILED(ctx->dev_config->SerializeVersionedRootSignature(&root_sig_desc, + &sig, &error))) { + debug_printf("D3D12SerializeRootSignature failed\n"); + return NULL; + } + } else { + if (FAILED(ctx->D3D12SerializeVersionedRootSignature(&root_sig_desc, + &sig, &error))) { + debug_printf("D3D12SerializeRootSignature failed\n"); + return NULL; + } } ID3D12RootSignature *ret; -- 2.7.4