vkd3d: Simplify d3d12_pipeline_state_is_render_pass_compatible().

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2019-04-29 11:38:14 +02:00 committed by Alexandre Julliard
parent 5da59641b0
commit 242e52ac59
2 changed files with 14 additions and 81 deletions

View File

@ -2027,7 +2027,6 @@ bool d3d12_pipeline_state_is_render_pass_compatible(const struct d3d12_pipeline_
{ {
const struct d3d12_graphics_pipeline_state *a = &state_a->u.graphics; const struct d3d12_graphics_pipeline_state *a = &state_a->u.graphics;
const struct d3d12_graphics_pipeline_state *b = &state_b->u.graphics; const struct d3d12_graphics_pipeline_state *b = &state_b->u.graphics;
unsigned int i;
if (!state_a != !state_b) if (!state_a != !state_b)
return false; return false;
@ -2038,18 +2037,7 @@ bool d3d12_pipeline_state_is_render_pass_compatible(const struct d3d12_pipeline_
|| state_b->vk_bind_point != VK_PIPELINE_BIND_POINT_GRAPHICS) || state_b->vk_bind_point != VK_PIPELINE_BIND_POINT_GRAPHICS)
return false; return false;
if (a->rt_idx != b->rt_idx) return a->render_pass == b->render_pass;
return false;
if (a->attachment_count != b->attachment_count)
return false;
for (i = 0; i < a->attachment_count; ++i)
{
if (a->attachments[i].format != b->attachments[i].format)
return false;
}
return true;
} }
STATIC_ASSERT(sizeof(struct vkd3d_shader_transform_feedback_element) == sizeof(D3D12_SO_DECLARATION_ENTRY)); STATIC_ASSERT(sizeof(struct vkd3d_shader_transform_feedback_element) == sizeof(D3D12_SO_DECLARATION_ENTRY));
@ -2140,11 +2128,11 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
WARN("Ignoring sample quality %u.\n", desc->SampleDesc.Quality); WARN("Ignoring sample quality %u.\n", desc->SampleDesc.Quality);
rt_count = desc->NumRenderTargets; rt_count = desc->NumRenderTargets;
if (rt_count > ARRAY_SIZE(graphics->attachments) - 1) if (rt_count > ARRAY_SIZE(graphics->blend_attachments))
{ {
FIXME("NumRenderTargets %zu > %zu, ignoring extra formats.\n", FIXME("NumRenderTargets %zu > %zu, ignoring extra formats.\n",
rt_count, ARRAY_SIZE(graphics->attachments) - 1); rt_count, ARRAY_SIZE(graphics->blend_attachments));
rt_count = ARRAY_SIZE(graphics->attachments) - 1; rt_count = ARRAY_SIZE(graphics->blend_attachments);
} }
if (desc->DSVFormat == DXGI_FORMAT_UNKNOWN if (desc->DSVFormat == DXGI_FORMAT_UNKNOWN
@ -2156,7 +2144,6 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
&& (desc->DepthStencilState.DepthEnable || desc->DepthStencilState.StencilEnable)) && (desc->DepthStencilState.DepthEnable || desc->DepthStencilState.StencilEnable))
{ {
const D3D12_DEPTH_STENCIL_DESC *ds_desc = &desc->DepthStencilState; const D3D12_DEPTH_STENCIL_DESC *ds_desc = &desc->DepthStencilState;
VkImageLayout depth_layout;
if (!(format = vkd3d_get_format(desc->DSVFormat, true))) if (!(format = vkd3d_get_format(desc->DSVFormat, true)))
{ {
@ -2168,51 +2155,12 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
if (!(format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) if (!(format->vk_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)))
FIXME("Format %#x is not depth/stencil format.\n", format->dxgi_format); FIXME("Format %#x is not depth/stencil format.\n", format->dxgi_format);
if ((ds_desc->DepthEnable && ds_desc->DepthWriteMask)
|| (ds_desc->StencilEnable && ds_desc->StencilWriteMask))
{
depth_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
render_pass_key.depth_stencil_write = true;
}
else
{
depth_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
render_pass_key.depth_stencil_write = false;
}
graphics->attachments[0].flags = 0;
graphics->attachments[0].format = format->vk_format;
graphics->attachments[0].samples = sample_count;
render_pass_key.depth_enable = desc->DepthStencilState.DepthEnable; render_pass_key.depth_enable = desc->DepthStencilState.DepthEnable;
if (desc->DepthStencilState.DepthEnable)
{
graphics->attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
graphics->attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
}
else
{
graphics->attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
graphics->attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
}
render_pass_key.stencil_enable = desc->DepthStencilState.StencilEnable; render_pass_key.stencil_enable = desc->DepthStencilState.StencilEnable;
if (desc->DepthStencilState.StencilEnable) render_pass_key.depth_stencil_write = (ds_desc->DepthEnable && ds_desc->DepthWriteMask)
{ || (ds_desc->StencilEnable && ds_desc->StencilWriteMask);
graphics->attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
graphics->attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
}
else
{
graphics->attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
graphics->attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
}
graphics->attachments[0].initialLayout = depth_layout;
graphics->attachments[0].finalLayout = depth_layout;
graphics->attachment_references[0].attachment = 0;
graphics->attachment_references[0].layout = depth_layout;
++graphics->rt_idx;
render_pass_key.vk_formats[0] = format->vk_format; render_pass_key.vk_formats[0] = format->vk_format;
++graphics->rt_idx;
if (!desc->PS.pShaderBytecode) if (!desc->PS.pShaderBytecode)
{ {
@ -2258,31 +2206,12 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
ps_output_swizzle[i] = vkd3d_get_rt_format_swizzle(format); ps_output_swizzle[i] = vkd3d_get_rt_format_swizzle(format);
graphics->attachments[idx].flags = 0;
graphics->attachments[idx].format = format->vk_format;
graphics->attachments[idx].samples = sample_count;
graphics->attachments[idx].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
graphics->attachments[idx].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
graphics->attachments[idx].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
graphics->attachments[idx].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
graphics->attachments[idx].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
graphics->attachments[idx].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
graphics->attachment_references[idx].attachment = idx;
graphics->attachment_references[idx].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
render_pass_key.vk_formats[idx] = format->vk_format; render_pass_key.vk_formats[idx] = format->vk_format;
blend_attachment_from_d3d12(&graphics->blend_attachments[i], rt_desc); blend_attachment_from_d3d12(&graphics->blend_attachments[i], rt_desc);
} }
graphics->attachment_count = graphics->rt_idx + rt_count; graphics->attachment_count = graphics->rt_idx + rt_count;
render_pass_key.attachment_count = graphics->rt_idx + rt_count;
render_pass_key.padding = 0;
render_pass_key.sample_count = sample_count;
for (i = render_pass_key.attachment_count; i < ARRAY_SIZE(render_pass_key.vk_formats); ++i)
render_pass_key.vk_formats[i] = VK_FORMAT_UNDEFINED;
ps_shader_parameters[0].name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT; ps_shader_parameters[0].name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT;
ps_shader_parameters[0].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; ps_shader_parameters[0].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT;
ps_shader_parameters[0].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; ps_shader_parameters[0].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32;
@ -2540,6 +2469,12 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
goto fail; goto fail;
} }
render_pass_key.attachment_count = graphics->attachment_count;
render_pass_key.padding = 0;
render_pass_key.sample_count = sample_count;
for (i = render_pass_key.attachment_count; i < ARRAY_SIZE(render_pass_key.vk_formats); ++i)
render_pass_key.vk_formats[i] = VK_FORMAT_UNDEFINED;
if (FAILED(hr = vkd3d_render_pass_cache_find(&device->render_pass_cache, device, if (FAILED(hr = vkd3d_render_pass_cache_find(&device->render_pass_cache, device,
&render_pass_key, &graphics->render_pass))) &render_pass_key, &graphics->render_pass)))
goto fail; goto fail;

View File

@ -660,10 +660,8 @@ struct d3d12_graphics_pipeline_state
size_t instance_divisor_count; size_t instance_divisor_count;
size_t attribute_count; size_t attribute_count;
VkAttachmentDescription attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
VkAttachmentReference attachment_references[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
VkPipelineColorBlendAttachmentState blend_attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT]; VkPipelineColorBlendAttachmentState blend_attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
size_t attachment_count, rt_idx; unsigned int attachment_count, rt_idx;
VkRenderPass render_pass; VkRenderPass render_pass;
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE index_buffer_strip_cut_value; D3D12_INDEX_BUFFER_STRIP_CUT_VALUE index_buffer_strip_cut_value;