vkd3d: Factor out pipeline state struct conversion.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
d4f4e34656
commit
92b6e71ce4
|
@ -2309,54 +2309,19 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandAllocator(d3d12_devic
|
|||
riid, command_allocator);
|
||||
}
|
||||
|
||||
static void d3d12_promote_depth_stencil_desc(D3D12_DEPTH_STENCIL_DESC1 *out, const D3D12_DEPTH_STENCIL_DESC *in)
|
||||
{
|
||||
out->DepthEnable = in->DepthEnable;
|
||||
out->DepthWriteMask = in->DepthWriteMask;
|
||||
out->DepthFunc = in->DepthFunc;
|
||||
out->StencilEnable = in->StencilEnable;
|
||||
out->StencilReadMask = in->StencilReadMask;
|
||||
out->StencilWriteMask = in->StencilWriteMask;
|
||||
out->FrontFace = in->FrontFace;
|
||||
out->BackFace = in->BackFace;
|
||||
out->DepthBoundsTestEnable = FALSE;
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d3d12_device_CreateGraphicsPipelineState(d3d12_device_iface *iface,
|
||||
const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc, REFIID riid, void **pipeline_state)
|
||||
{
|
||||
struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
||||
struct d3d12_pipeline_state_desc pipeline_desc;
|
||||
struct d3d12_pipeline_state *object;
|
||||
unsigned int i;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, desc %p, riid %s, pipeline_state %p.\n",
|
||||
iface, desc, debugstr_guid(riid), pipeline_state);
|
||||
|
||||
memset(&pipeline_desc, 0, sizeof(pipeline_desc));
|
||||
pipeline_desc.root_signature = desc->pRootSignature;
|
||||
pipeline_desc.vs = desc->VS;
|
||||
pipeline_desc.ps = desc->PS;
|
||||
pipeline_desc.ds = desc->DS;
|
||||
pipeline_desc.hs = desc->HS;
|
||||
pipeline_desc.gs = desc->GS;
|
||||
pipeline_desc.stream_output = desc->StreamOutput;
|
||||
pipeline_desc.blend_state = desc->BlendState;
|
||||
pipeline_desc.sample_mask = desc->SampleMask;
|
||||
pipeline_desc.rasterizer_state = desc->RasterizerState;
|
||||
d3d12_promote_depth_stencil_desc(&pipeline_desc.depth_stencil_state, &desc->DepthStencilState);
|
||||
pipeline_desc.input_layout = desc->InputLayout;
|
||||
pipeline_desc.strip_cut_value = desc->IBStripCutValue;
|
||||
pipeline_desc.primitive_topology_type = desc->PrimitiveTopologyType;
|
||||
pipeline_desc.rtv_formats.NumRenderTargets = desc->NumRenderTargets;
|
||||
for (i = 0; i < ARRAY_SIZE(desc->RTVFormats); i++)
|
||||
pipeline_desc.rtv_formats.RTFormats[i] = desc->RTVFormats[i];
|
||||
pipeline_desc.dsv_format = desc->DSVFormat;
|
||||
pipeline_desc.sample_desc = desc->SampleDesc;
|
||||
pipeline_desc.node_mask = desc->NodeMask;
|
||||
pipeline_desc.cached_pso = desc->CachedPSO;
|
||||
pipeline_desc.flags = desc->Flags;
|
||||
if (FAILED(hr = vkd3d_pipeline_state_desc_from_d3d12_graphics_desc(&pipeline_desc, desc)))
|
||||
return hr;
|
||||
|
||||
if (FAILED(hr = d3d12_pipeline_state_create(device,
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS, &pipeline_desc, &object)))
|
||||
|
@ -2377,12 +2342,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateComputePipelineState(d3d12_d
|
|||
TRACE("iface %p, desc %p, riid %s, pipeline_state %p.\n",
|
||||
iface, desc, debugstr_guid(riid), pipeline_state);
|
||||
|
||||
memset(&pipeline_desc, 0, sizeof(pipeline_desc));
|
||||
pipeline_desc.root_signature = desc->pRootSignature;
|
||||
pipeline_desc.cs = desc->CS;
|
||||
pipeline_desc.node_mask = desc->NodeMask;
|
||||
pipeline_desc.cached_pso = desc->CachedPSO;
|
||||
pipeline_desc.flags = desc->Flags;
|
||||
if (FAILED(hr = vkd3d_pipeline_state_desc_from_d3d12_compute_desc(&pipeline_desc, desc)))
|
||||
return hr;
|
||||
|
||||
if (FAILED(hr = d3d12_pipeline_state_create(device,
|
||||
VK_PIPELINE_BIND_POINT_COMPUTE, &pipeline_desc, &object)))
|
||||
|
@ -3708,147 +3669,20 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_SetResidencyPriority(d3d12_device_
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static void d3d12_init_pipeline_state_desc(struct d3d12_pipeline_state_desc *desc)
|
||||
{
|
||||
D3D12_DEPTH_STENCIL_DESC1 *ds_state = &desc->depth_stencil_state;
|
||||
D3D12_RASTERIZER_DESC *rs_state = &desc->rasterizer_state;
|
||||
D3D12_BLEND_DESC *blend_state = &desc->blend_state;
|
||||
DXGI_SAMPLE_DESC *sample_desc = &desc->sample_desc;
|
||||
|
||||
memset(desc, 0, sizeof(*desc));
|
||||
ds_state->DepthEnable = TRUE;
|
||||
ds_state->DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
|
||||
ds_state->DepthFunc = D3D12_COMPARISON_FUNC_LESS;
|
||||
ds_state->StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
|
||||
ds_state->StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
|
||||
ds_state->FrontFace.StencilFunc = ds_state->BackFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS;
|
||||
ds_state->FrontFace.StencilDepthFailOp = ds_state->BackFace.StencilDepthFailOp = D3D12_STENCIL_OP_KEEP;
|
||||
ds_state->FrontFace.StencilPassOp = ds_state->BackFace.StencilPassOp = D3D12_STENCIL_OP_KEEP;
|
||||
ds_state->FrontFace.StencilFailOp = ds_state->BackFace.StencilFailOp = D3D12_STENCIL_OP_KEEP;
|
||||
|
||||
rs_state->FillMode = D3D12_FILL_MODE_SOLID;
|
||||
rs_state->CullMode = D3D12_CULL_MODE_BACK;
|
||||
rs_state->DepthClipEnable = TRUE;
|
||||
rs_state->ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
|
||||
|
||||
blend_state->RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
|
||||
|
||||
sample_desc->Count = 1;
|
||||
sample_desc->Quality = 0;
|
||||
|
||||
desc->sample_mask = D3D12_DEFAULT_SAMPLE_MASK;
|
||||
}
|
||||
|
||||
#define VKD3D_HANDLE_SUBOBJECT_EXPLICIT(type_enum, type_name, assignment) \
|
||||
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ ## type_enum: \
|
||||
{\
|
||||
const struct {\
|
||||
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE type; \
|
||||
type_name data; \
|
||||
} *subobject = (void *)stream_ptr; \
|
||||
if (stream_ptr + sizeof(*subobject) > stream_end) \
|
||||
{ \
|
||||
ERR("Invalid pipeline state stream.\n"); \
|
||||
return E_INVALIDARG; \
|
||||
} \
|
||||
stream_ptr += align(sizeof(*subobject), sizeof(void*)); \
|
||||
assignment; \
|
||||
break;\
|
||||
}
|
||||
|
||||
#define VKD3D_HANDLE_SUBOBJECT(type_enum, type, left_side) \
|
||||
VKD3D_HANDLE_SUBOBJECT_EXPLICIT(type_enum, type, left_side = subobject->data)
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePipelineState(d3d12_device_iface *iface,
|
||||
const D3D12_PIPELINE_STATE_STREAM_DESC *desc, REFIID riid, void **pipeline_state)
|
||||
{
|
||||
VkPipelineBindPoint pipeline_type = VK_PIPELINE_BIND_POINT_MAX_ENUM;
|
||||
struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
||||
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE subobject_type;
|
||||
struct d3d12_pipeline_state_desc pipeline_desc;
|
||||
const char *stream_ptr, *stream_end;
|
||||
struct d3d12_pipeline_state *object;
|
||||
uint64_t defined_subobjects = 0;
|
||||
bool is_graphics, is_compute;
|
||||
uint64_t subobject_bit;
|
||||
VkPipelineBindPoint pipeline_type;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("iface %p, desc %p, riid %s, pipeline_state %p.\n",
|
||||
iface, desc, debugstr_guid(riid), pipeline_state);
|
||||
|
||||
/* Initialize defaults for undefined subobjects */
|
||||
d3d12_init_pipeline_state_desc(&pipeline_desc);
|
||||
|
||||
/* Structs are packed, but padded so that their size
|
||||
* is always a multiple of the size of a pointer. */
|
||||
stream_ptr = desc->pPipelineStateSubobjectStream;
|
||||
stream_end = stream_ptr + desc->SizeInBytes;
|
||||
|
||||
while (stream_ptr < stream_end)
|
||||
{
|
||||
if (stream_ptr + sizeof(subobject_type) > stream_end)
|
||||
{
|
||||
ERR("Invalid pipeline state stream.\n");
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
subobject_type = *(const D3D12_PIPELINE_STATE_SUBOBJECT_TYPE *)stream_ptr;
|
||||
subobject_bit = 1ull << subobject_type;
|
||||
|
||||
if (defined_subobjects & subobject_bit)
|
||||
{
|
||||
ERR("Duplicate pipeline subobject type %u.\n", subobject_type);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
defined_subobjects |= subobject_bit;
|
||||
|
||||
switch (subobject_type)
|
||||
{
|
||||
VKD3D_HANDLE_SUBOBJECT(ROOT_SIGNATURE, ID3D12RootSignature*, pipeline_desc.root_signature);
|
||||
VKD3D_HANDLE_SUBOBJECT(VS, D3D12_SHADER_BYTECODE, pipeline_desc.vs);
|
||||
VKD3D_HANDLE_SUBOBJECT(PS, D3D12_SHADER_BYTECODE, pipeline_desc.ps);
|
||||
VKD3D_HANDLE_SUBOBJECT(DS, D3D12_SHADER_BYTECODE, pipeline_desc.ds);
|
||||
VKD3D_HANDLE_SUBOBJECT(HS, D3D12_SHADER_BYTECODE, pipeline_desc.hs);
|
||||
VKD3D_HANDLE_SUBOBJECT(GS, D3D12_SHADER_BYTECODE, pipeline_desc.gs);
|
||||
VKD3D_HANDLE_SUBOBJECT(CS, D3D12_SHADER_BYTECODE, pipeline_desc.cs);
|
||||
VKD3D_HANDLE_SUBOBJECT(STREAM_OUTPUT, D3D12_STREAM_OUTPUT_DESC, pipeline_desc.stream_output);
|
||||
VKD3D_HANDLE_SUBOBJECT(BLEND, D3D12_BLEND_DESC, pipeline_desc.blend_state);
|
||||
VKD3D_HANDLE_SUBOBJECT(SAMPLE_MASK, UINT, pipeline_desc.sample_mask);
|
||||
VKD3D_HANDLE_SUBOBJECT(RASTERIZER, D3D12_RASTERIZER_DESC, pipeline_desc.rasterizer_state);
|
||||
VKD3D_HANDLE_SUBOBJECT_EXPLICIT(DEPTH_STENCIL, D3D12_DEPTH_STENCIL_DESC,
|
||||
d3d12_promote_depth_stencil_desc(&pipeline_desc.depth_stencil_state, &subobject->data));
|
||||
VKD3D_HANDLE_SUBOBJECT(INPUT_LAYOUT, D3D12_INPUT_LAYOUT_DESC, pipeline_desc.input_layout);
|
||||
VKD3D_HANDLE_SUBOBJECT(IB_STRIP_CUT_VALUE, D3D12_INDEX_BUFFER_STRIP_CUT_VALUE, pipeline_desc.strip_cut_value);
|
||||
VKD3D_HANDLE_SUBOBJECT(PRIMITIVE_TOPOLOGY, D3D12_PRIMITIVE_TOPOLOGY_TYPE, pipeline_desc.primitive_topology_type);
|
||||
VKD3D_HANDLE_SUBOBJECT(RENDER_TARGET_FORMATS, D3D12_RT_FORMAT_ARRAY, pipeline_desc.rtv_formats);
|
||||
VKD3D_HANDLE_SUBOBJECT(DEPTH_STENCIL_FORMAT, DXGI_FORMAT, pipeline_desc.dsv_format);
|
||||
VKD3D_HANDLE_SUBOBJECT(SAMPLE_DESC, DXGI_SAMPLE_DESC, pipeline_desc.sample_desc);
|
||||
VKD3D_HANDLE_SUBOBJECT(NODE_MASK, UINT, pipeline_desc.node_mask);
|
||||
VKD3D_HANDLE_SUBOBJECT(CACHED_PSO, D3D12_CACHED_PIPELINE_STATE, pipeline_desc.cached_pso);
|
||||
VKD3D_HANDLE_SUBOBJECT(FLAGS, D3D12_PIPELINE_STATE_FLAGS, pipeline_desc.flags);
|
||||
VKD3D_HANDLE_SUBOBJECT(DEPTH_STENCIL1, D3D12_DEPTH_STENCIL_DESC1, pipeline_desc.depth_stencil_state);
|
||||
VKD3D_HANDLE_SUBOBJECT(VIEW_INSTANCING, D3D12_VIEW_INSTANCING_DESC, pipeline_desc.view_instancing_desc);
|
||||
|
||||
default:
|
||||
ERR("Unhandled pipeline subobject type %u.\n", subobject_type);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
}
|
||||
|
||||
/* Deduce pipeline type from specified shaders */
|
||||
is_graphics = pipeline_desc.vs.pShaderBytecode && pipeline_desc.vs.BytecodeLength;
|
||||
is_compute = pipeline_desc.cs.pShaderBytecode && pipeline_desc.cs.BytecodeLength;
|
||||
|
||||
if (is_graphics == is_compute)
|
||||
{
|
||||
ERR("Cannot deduce pipeline type.\n");
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
pipeline_type = is_graphics
|
||||
? VK_PIPELINE_BIND_POINT_GRAPHICS
|
||||
: VK_PIPELINE_BIND_POINT_COMPUTE;
|
||||
if (FAILED(hr = vkd3d_pipeline_state_desc_from_d3d12_stream_desc(&pipeline_desc, desc, &pipeline_type)))
|
||||
return hr;
|
||||
|
||||
if (FAILED(hr = d3d12_pipeline_state_create(device, pipeline_type, &pipeline_desc, &object)))
|
||||
return hr;
|
||||
|
@ -3857,9 +3691,6 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePipelineState(d3d12_device_i
|
|||
&IID_ID3D12PipelineState, riid, pipeline_state);
|
||||
}
|
||||
|
||||
#undef VKD3D_HANDLE_SUBOBJECT
|
||||
#undef VKD3D_HANDLE_SUBOBJECT_EXPLICIT
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE d3d12_device_OpenExistingHeapFromAddress(d3d12_device_iface *iface,
|
||||
void *address, REFIID riid, void **heap)
|
||||
{
|
||||
|
|
|
@ -1139,6 +1139,201 @@ void vkd3d_render_pass_cache_cleanup(struct vkd3d_render_pass_cache *cache,
|
|||
cache->render_passes = NULL;
|
||||
}
|
||||
|
||||
static void d3d12_promote_depth_stencil_desc(D3D12_DEPTH_STENCIL_DESC1 *out, const D3D12_DEPTH_STENCIL_DESC *in)
|
||||
{
|
||||
out->DepthEnable = in->DepthEnable;
|
||||
out->DepthWriteMask = in->DepthWriteMask;
|
||||
out->DepthFunc = in->DepthFunc;
|
||||
out->StencilEnable = in->StencilEnable;
|
||||
out->StencilReadMask = in->StencilReadMask;
|
||||
out->StencilWriteMask = in->StencilWriteMask;
|
||||
out->FrontFace = in->FrontFace;
|
||||
out->BackFace = in->BackFace;
|
||||
out->DepthBoundsTestEnable = FALSE;
|
||||
}
|
||||
|
||||
static void d3d12_init_pipeline_state_desc(struct d3d12_pipeline_state_desc *desc)
|
||||
{
|
||||
D3D12_DEPTH_STENCIL_DESC1 *ds_state = &desc->depth_stencil_state;
|
||||
D3D12_RASTERIZER_DESC *rs_state = &desc->rasterizer_state;
|
||||
D3D12_BLEND_DESC *blend_state = &desc->blend_state;
|
||||
DXGI_SAMPLE_DESC *sample_desc = &desc->sample_desc;
|
||||
|
||||
memset(desc, 0, sizeof(*desc));
|
||||
ds_state->DepthEnable = TRUE;
|
||||
ds_state->DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
|
||||
ds_state->DepthFunc = D3D12_COMPARISON_FUNC_LESS;
|
||||
ds_state->StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
|
||||
ds_state->StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
|
||||
ds_state->FrontFace.StencilFunc = ds_state->BackFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS;
|
||||
ds_state->FrontFace.StencilDepthFailOp = ds_state->BackFace.StencilDepthFailOp = D3D12_STENCIL_OP_KEEP;
|
||||
ds_state->FrontFace.StencilPassOp = ds_state->BackFace.StencilPassOp = D3D12_STENCIL_OP_KEEP;
|
||||
ds_state->FrontFace.StencilFailOp = ds_state->BackFace.StencilFailOp = D3D12_STENCIL_OP_KEEP;
|
||||
|
||||
rs_state->FillMode = D3D12_FILL_MODE_SOLID;
|
||||
rs_state->CullMode = D3D12_CULL_MODE_BACK;
|
||||
rs_state->DepthClipEnable = TRUE;
|
||||
rs_state->ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
|
||||
|
||||
blend_state->RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
|
||||
|
||||
sample_desc->Count = 1;
|
||||
sample_desc->Quality = 0;
|
||||
|
||||
desc->sample_mask = D3D12_DEFAULT_SAMPLE_MASK;
|
||||
}
|
||||
|
||||
HRESULT vkd3d_pipeline_state_desc_from_d3d12_graphics_desc(struct d3d12_pipeline_state_desc *desc,
|
||||
const D3D12_GRAPHICS_PIPELINE_STATE_DESC *d3d12_desc)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
memset(desc, 0, sizeof(*desc));
|
||||
desc->root_signature = d3d12_desc->pRootSignature;
|
||||
desc->vs = d3d12_desc->VS;
|
||||
desc->ps = d3d12_desc->PS;
|
||||
desc->ds = d3d12_desc->DS;
|
||||
desc->hs = d3d12_desc->HS;
|
||||
desc->gs = d3d12_desc->GS;
|
||||
desc->stream_output = d3d12_desc->StreamOutput;
|
||||
desc->blend_state = d3d12_desc->BlendState;
|
||||
desc->sample_mask = d3d12_desc->SampleMask;
|
||||
desc->rasterizer_state = d3d12_desc->RasterizerState;
|
||||
d3d12_promote_depth_stencil_desc(&desc->depth_stencil_state, &d3d12_desc->DepthStencilState);
|
||||
desc->input_layout = d3d12_desc->InputLayout;
|
||||
desc->strip_cut_value = d3d12_desc->IBStripCutValue;
|
||||
desc->primitive_topology_type = d3d12_desc->PrimitiveTopologyType;
|
||||
desc->rtv_formats.NumRenderTargets = d3d12_desc->NumRenderTargets;
|
||||
for (i = 0; i < ARRAY_SIZE(d3d12_desc->RTVFormats); i++)
|
||||
desc->rtv_formats.RTFormats[i] = d3d12_desc->RTVFormats[i];
|
||||
desc->dsv_format = d3d12_desc->DSVFormat;
|
||||
desc->sample_desc = d3d12_desc->SampleDesc;
|
||||
desc->node_mask = d3d12_desc->NodeMask;
|
||||
desc->cached_pso = d3d12_desc->CachedPSO;
|
||||
desc->flags = d3d12_desc->Flags;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT vkd3d_pipeline_state_desc_from_d3d12_compute_desc(struct d3d12_pipeline_state_desc *desc,
|
||||
const D3D12_COMPUTE_PIPELINE_STATE_DESC *d3d12_desc)
|
||||
{
|
||||
memset(desc, 0, sizeof(*desc));
|
||||
desc->root_signature = d3d12_desc->pRootSignature;
|
||||
desc->cs = d3d12_desc->CS;
|
||||
desc->node_mask = d3d12_desc->NodeMask;
|
||||
desc->cached_pso = d3d12_desc->CachedPSO;
|
||||
desc->flags = d3d12_desc->Flags;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
#define VKD3D_HANDLE_SUBOBJECT_EXPLICIT(type_enum, type_name, assignment) \
|
||||
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ ## type_enum: \
|
||||
{\
|
||||
const struct {\
|
||||
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE type; \
|
||||
type_name data; \
|
||||
} *subobject = (void *)stream_ptr; \
|
||||
if (stream_ptr + sizeof(*subobject) > stream_end) \
|
||||
{ \
|
||||
ERR("Invalid pipeline state stream.\n"); \
|
||||
return E_INVALIDARG; \
|
||||
} \
|
||||
stream_ptr += align(sizeof(*subobject), sizeof(void*)); \
|
||||
assignment; \
|
||||
break;\
|
||||
}
|
||||
|
||||
#define VKD3D_HANDLE_SUBOBJECT(type_enum, type, left_side) \
|
||||
VKD3D_HANDLE_SUBOBJECT_EXPLICIT(type_enum, type, left_side = subobject->data)
|
||||
|
||||
HRESULT vkd3d_pipeline_state_desc_from_d3d12_stream_desc(struct d3d12_pipeline_state_desc *desc,
|
||||
const D3D12_PIPELINE_STATE_STREAM_DESC *d3d12_desc, VkPipelineBindPoint *vk_bind_point)
|
||||
{
|
||||
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE subobject_type;
|
||||
const char *stream_ptr, *stream_end;
|
||||
uint64_t defined_subobjects = 0;
|
||||
bool is_graphics, is_compute;
|
||||
uint64_t subobject_bit;
|
||||
|
||||
/* Initialize defaults for undefined subobjects */
|
||||
d3d12_init_pipeline_state_desc(desc);
|
||||
|
||||
/* Structs are packed, but padded so that their size
|
||||
* is always a multiple of the size of a pointer. */
|
||||
stream_ptr = d3d12_desc->pPipelineStateSubobjectStream;
|
||||
stream_end = stream_ptr + d3d12_desc->SizeInBytes;
|
||||
|
||||
while (stream_ptr < stream_end)
|
||||
{
|
||||
if (stream_ptr + sizeof(subobject_type) > stream_end)
|
||||
{
|
||||
ERR("Invalid pipeline state stream.\n");
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
subobject_type = *(const D3D12_PIPELINE_STATE_SUBOBJECT_TYPE *)stream_ptr;
|
||||
subobject_bit = 1ull << subobject_type;
|
||||
|
||||
if (defined_subobjects & subobject_bit)
|
||||
{
|
||||
ERR("Duplicate pipeline subobject type %u.\n", subobject_type);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
defined_subobjects |= subobject_bit;
|
||||
|
||||
switch (subobject_type)
|
||||
{
|
||||
VKD3D_HANDLE_SUBOBJECT(ROOT_SIGNATURE, ID3D12RootSignature*, desc->root_signature);
|
||||
VKD3D_HANDLE_SUBOBJECT(VS, D3D12_SHADER_BYTECODE, desc->vs);
|
||||
VKD3D_HANDLE_SUBOBJECT(PS, D3D12_SHADER_BYTECODE, desc->ps);
|
||||
VKD3D_HANDLE_SUBOBJECT(DS, D3D12_SHADER_BYTECODE, desc->ds);
|
||||
VKD3D_HANDLE_SUBOBJECT(HS, D3D12_SHADER_BYTECODE, desc->hs);
|
||||
VKD3D_HANDLE_SUBOBJECT(GS, D3D12_SHADER_BYTECODE, desc->gs);
|
||||
VKD3D_HANDLE_SUBOBJECT(CS, D3D12_SHADER_BYTECODE, desc->cs);
|
||||
VKD3D_HANDLE_SUBOBJECT(STREAM_OUTPUT, D3D12_STREAM_OUTPUT_DESC, desc->stream_output);
|
||||
VKD3D_HANDLE_SUBOBJECT(BLEND, D3D12_BLEND_DESC, desc->blend_state);
|
||||
VKD3D_HANDLE_SUBOBJECT(SAMPLE_MASK, UINT, desc->sample_mask);
|
||||
VKD3D_HANDLE_SUBOBJECT(RASTERIZER, D3D12_RASTERIZER_DESC, desc->rasterizer_state);
|
||||
VKD3D_HANDLE_SUBOBJECT_EXPLICIT(DEPTH_STENCIL, D3D12_DEPTH_STENCIL_DESC,
|
||||
d3d12_promote_depth_stencil_desc(&desc->depth_stencil_state, &subobject->data));
|
||||
VKD3D_HANDLE_SUBOBJECT(INPUT_LAYOUT, D3D12_INPUT_LAYOUT_DESC, desc->input_layout);
|
||||
VKD3D_HANDLE_SUBOBJECT(IB_STRIP_CUT_VALUE, D3D12_INDEX_BUFFER_STRIP_CUT_VALUE, desc->strip_cut_value);
|
||||
VKD3D_HANDLE_SUBOBJECT(PRIMITIVE_TOPOLOGY, D3D12_PRIMITIVE_TOPOLOGY_TYPE, desc->primitive_topology_type);
|
||||
VKD3D_HANDLE_SUBOBJECT(RENDER_TARGET_FORMATS, D3D12_RT_FORMAT_ARRAY, desc->rtv_formats);
|
||||
VKD3D_HANDLE_SUBOBJECT(DEPTH_STENCIL_FORMAT, DXGI_FORMAT, desc->dsv_format);
|
||||
VKD3D_HANDLE_SUBOBJECT(SAMPLE_DESC, DXGI_SAMPLE_DESC, desc->sample_desc);
|
||||
VKD3D_HANDLE_SUBOBJECT(NODE_MASK, UINT, desc->node_mask);
|
||||
VKD3D_HANDLE_SUBOBJECT(CACHED_PSO, D3D12_CACHED_PIPELINE_STATE, desc->cached_pso);
|
||||
VKD3D_HANDLE_SUBOBJECT(FLAGS, D3D12_PIPELINE_STATE_FLAGS, desc->flags);
|
||||
VKD3D_HANDLE_SUBOBJECT(DEPTH_STENCIL1, D3D12_DEPTH_STENCIL_DESC1, desc->depth_stencil_state);
|
||||
VKD3D_HANDLE_SUBOBJECT(VIEW_INSTANCING, D3D12_VIEW_INSTANCING_DESC, desc->view_instancing_desc);
|
||||
|
||||
default:
|
||||
ERR("Unhandled pipeline subobject type %u.\n", subobject_type);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
}
|
||||
|
||||
/* Deduce pipeline type from specified shaders */
|
||||
is_graphics = desc->vs.pShaderBytecode && desc->vs.BytecodeLength;
|
||||
is_compute = desc->cs.pShaderBytecode && desc->cs.BytecodeLength;
|
||||
|
||||
if (is_graphics == is_compute)
|
||||
{
|
||||
ERR("Cannot deduce pipeline type.\n");
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
*vk_bind_point = is_graphics
|
||||
? VK_PIPELINE_BIND_POINT_GRAPHICS
|
||||
: VK_PIPELINE_BIND_POINT_COMPUTE;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
#undef VKD3D_HANDLE_SUBOBJECT
|
||||
#undef VKD3D_HANDLE_SUBOBJECT_EXPLICIT
|
||||
|
||||
struct vkd3d_compiled_pipeline
|
||||
{
|
||||
struct list entry;
|
||||
|
|
|
@ -1055,6 +1055,13 @@ struct d3d12_pipeline_state_desc
|
|||
D3D12_PIPELINE_STATE_FLAGS flags;
|
||||
};
|
||||
|
||||
HRESULT vkd3d_pipeline_state_desc_from_d3d12_graphics_desc(struct d3d12_pipeline_state_desc *desc,
|
||||
const D3D12_GRAPHICS_PIPELINE_STATE_DESC *d3d12_desc) DECLSPEC_HIDDEN;
|
||||
HRESULT vkd3d_pipeline_state_desc_from_d3d12_compute_desc(struct d3d12_pipeline_state_desc *desc,
|
||||
const D3D12_COMPUTE_PIPELINE_STATE_DESC *d3d12_desc) DECLSPEC_HIDDEN;
|
||||
HRESULT vkd3d_pipeline_state_desc_from_d3d12_stream_desc(struct d3d12_pipeline_state_desc *desc,
|
||||
const D3D12_PIPELINE_STATE_STREAM_DESC *d3d12_desc, VkPipelineBindPoint *vk_bind_point) DECLSPEC_HIDDEN;
|
||||
|
||||
struct vkd3d_pipeline_key
|
||||
{
|
||||
D3D12_PRIMITIVE_TOPOLOGY topology;
|
||||
|
|
Loading…
Reference in New Issue