vkd3d: Use dynamic rendering for pipeline creation.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-11-11 18:36:55 +01:00 committed by Hans-Kristian Arntzen
parent 3783eaf4f7
commit 9673ac173d
2 changed files with 35 additions and 5 deletions

View File

@ -4275,11 +4275,13 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
VkPipelineVertexInputDivisorStateCreateInfoEXT input_divisor_info;
VkPipelineCreationFeedbackEXT feedbacks[VKD3D_MAX_SHADER_STAGES];
VkPipelineShaderStageCreateInfo stages[VKD3D_MAX_SHADER_STAGES];
VkFormat rtv_formats[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
VkPipelineTessellationStateCreateInfo tessellation_info;
VkPipelineDepthStencilStateCreateInfo fallback_ds_desc;
VkPipelineCreationFeedbackCreateInfoEXT feedback_info;
VkPipelineDynamicStateCreateInfo dynamic_create_info;
VkPipelineVertexInputStateCreateInfo input_desc;
VkPipelineRenderingCreateInfoKHR rendering_info;
VkPipelineInputAssemblyStateCreateInfo ia_desc;
struct d3d12_device *device = state->device;
VkGraphicsPipelineCreateInfo pipeline_desc;
@ -4345,8 +4347,25 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
vp_desc.scissorCount = key && !key->dynamic_viewport ? max(key->viewport_count, 1) : 0;
vp_desc.pScissors = NULL;
rendering_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR;
rendering_info.pNext = NULL;
rendering_info.viewMask = 0;
rendering_info.colorAttachmentCount = vkd3d_get_color_attachment_count(graphics->rtv_active_mask);
rendering_info.pColorAttachmentFormats = rtv_formats;
rendering_info.depthAttachmentFormat = dsv_format ? dsv_format->vk_format : VK_FORMAT_UNDEFINED;
rendering_info.stencilAttachmentFormat = dsv_format ? dsv_format->vk_format : VK_FORMAT_UNDEFINED;
rtv_active_mask = key ? key->rtv_active_mask : graphics->rtv_active_mask;
for (i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
{
if (rtv_active_mask & (1u << i))
rtv_formats[i] = graphics->rtv_formats[i];
else
rtv_formats[i] = VK_FORMAT_UNDEFINED;
}
pipeline_desc.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipeline_desc.pNext = NULL;
pipeline_desc.pNext = &rendering_info;
pipeline_desc.flags = 0;
pipeline_desc.stageCount = graphics->stage_count;
pipeline_desc.pStages = graphics->stages;
@ -4360,10 +4379,14 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
pipeline_desc.pColorBlendState = &graphics->blend_desc;
pipeline_desc.pDynamicState = &dynamic_create_info;
pipeline_desc.layout = graphics->pipeline_layout;
pipeline_desc.renderPass = VK_NULL_HANDLE;
pipeline_desc.subpass = 0;
pipeline_desc.basePipelineHandle = VK_NULL_HANDLE;
pipeline_desc.basePipelineIndex = -1;
if (d3d12_device_supports_variable_shading_rate_tier_2(device))
pipeline_desc.flags |= VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
/* A workaround for SottR, which creates pipelines with DSV_UNKNOWN, but still insists on using a depth buffer.
* If we notice that the base pipeline's DSV format does not match the dynamic DSV format, we fall-back to create a new render pass. */
if (graphics->dsv_format != dsv_format && (graphics->null_attachment_mask & dsv_attachment_mask(graphics)))
@ -4382,7 +4405,6 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
pipeline_desc.pDepthStencilState = &fallback_ds_desc;
}
rtv_active_mask = key ? key->rtv_active_mask : graphics->rtv_active_mask;
if (graphics->rtv_active_mask != rtv_active_mask)
{
TRACE("Compiling %p with fallback RTV write mask (PSO = 0x%x, RT = 0x%x).\n", state,
@ -4394,9 +4416,6 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
render_pass_compat, &graphics->dsv_plane_optimal_mask, variant_flags)))
return VK_NULL_HANDLE;
/* Any of these is fine from a compatibility PoV. */
pipeline_desc.renderPass = render_pass_compat->dsv_layouts[0];
if (key)
{
/* In a fallback pipeline, we might have to re-create shader modules.

View File

@ -3104,6 +3104,7 @@ static inline bool d3d12_device_use_ssbo_root_descriptors(struct d3d12_device *d
}
bool d3d12_device_supports_variable_shading_rate_tier_1(struct d3d12_device *device);
bool d3d12_device_supports_variable_shading_rate_tier_2(struct d3d12_device *device);
bool d3d12_device_supports_ray_tracing_tier_1_0(const struct d3d12_device *device);
/* ID3DBlob */
@ -3271,6 +3272,16 @@ static inline const struct vkd3d_format *vkd3d_format_from_d3d12_resource_desc(
desc->Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL);
}
static inline unsigned int vkd3d_get_color_attachment_count(unsigned int attachment_mask)
{
unsigned int count = 0;
while (attachment_mask >> count)
count++;
return count;
}
static inline VkImageSubresourceRange vk_subresource_range_from_layers(const VkImageSubresourceLayers *layers)
{
VkImageSubresourceRange range;