mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
libs/vkd3d: Process render target formats before shaders.
We may need to swizzle components in pixel shader based on render target formats because Vulkan doesn't support swizzles for framebuffer attachment image views. 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:
parent
5423de8267
commit
3198cab3ed
@ -1837,6 +1837,93 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
|
|||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rt_count = desc->NumRenderTargets;
|
||||||
|
if (rt_count > ARRAY_SIZE(graphics->attachments) - 1)
|
||||||
|
{
|
||||||
|
FIXME("NumRenderTargets %zu > %zu, ignoring extra formats.\n",
|
||||||
|
rt_count, ARRAY_SIZE(graphics->attachments) - 1);
|
||||||
|
rt_count = ARRAY_SIZE(graphics->attachments) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics->rt_idx = 0;
|
||||||
|
if (desc->DepthStencilState.DepthEnable || desc->DepthStencilState.StencilEnable)
|
||||||
|
{
|
||||||
|
const D3D12_DEPTH_STENCIL_DESC *ds_desc = &desc->DepthStencilState;
|
||||||
|
VkImageLayout depth_layout;
|
||||||
|
|
||||||
|
if (!(format = vkd3d_get_format(desc->DSVFormat, true)))
|
||||||
|
{
|
||||||
|
WARN("Invalid DXGI format %#x.\n", desc->DSVFormat);
|
||||||
|
hr = E_FAIL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ds_desc->DepthEnable && ds_desc->DepthWriteMask)
|
||||||
|
|| (ds_desc->StencilEnable && ds_desc->StencilWriteMask))
|
||||||
|
depth_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
else
|
||||||
|
depth_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
|
||||||
|
|
||||||
|
graphics->attachments[0].flags = 0;
|
||||||
|
graphics->attachments[0].format = format->vk_format;
|
||||||
|
graphics->attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
if (desc->DepthStencilState.StencilEnable)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < rt_count; ++i)
|
||||||
|
{
|
||||||
|
unsigned int blend_idx = desc->BlendState.IndependentBlendEnable ? i : 0;
|
||||||
|
size_t idx = graphics->rt_idx + i;
|
||||||
|
|
||||||
|
if (!(format = vkd3d_get_format(desc->RTVFormats[i], false)))
|
||||||
|
{
|
||||||
|
WARN("Invalid DXGI format %#x.\n", desc->RTVFormats[i]);
|
||||||
|
hr = E_FAIL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics->attachments[idx].flags = 0;
|
||||||
|
graphics->attachments[idx].format = format->vk_format;
|
||||||
|
graphics->attachments[idx].samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
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;
|
||||||
|
|
||||||
|
blend_attachment_from_d3d12(&graphics->blend_attachments[i], &desc->BlendState.RenderTarget[blend_idx]);
|
||||||
|
}
|
||||||
|
graphics->attachment_count = graphics->rt_idx + rt_count;
|
||||||
|
|
||||||
shader_interface.bindings = root_signature->descriptor_mapping;
|
shader_interface.bindings = root_signature->descriptor_mapping;
|
||||||
shader_interface.binding_count = root_signature->descriptor_count;
|
shader_interface.binding_count = root_signature->descriptor_count;
|
||||||
shader_interface.push_constant_buffers = root_signature->root_constants;
|
shader_interface.push_constant_buffers = root_signature->root_constants;
|
||||||
@ -1956,93 +2043,6 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
|
|||||||
graphics->attribute_count = j;
|
graphics->attribute_count = j;
|
||||||
vkd3d_shader_free_shader_signature(&input_signature);
|
vkd3d_shader_free_shader_signature(&input_signature);
|
||||||
|
|
||||||
rt_count = desc->NumRenderTargets;
|
|
||||||
if (rt_count > ARRAY_SIZE(graphics->attachments) - 1)
|
|
||||||
{
|
|
||||||
FIXME("NumRenderTargets %zu > %zu, ignoring extra formats.\n",
|
|
||||||
rt_count, ARRAY_SIZE(graphics->attachments) - 1);
|
|
||||||
rt_count = ARRAY_SIZE(graphics->attachments) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics->rt_idx = 0;
|
|
||||||
if (desc->DepthStencilState.DepthEnable || desc->DepthStencilState.StencilEnable)
|
|
||||||
{
|
|
||||||
const D3D12_DEPTH_STENCIL_DESC *ds_desc = &desc->DepthStencilState;
|
|
||||||
VkImageLayout depth_layout;
|
|
||||||
|
|
||||||
if (!(format = vkd3d_get_format(desc->DSVFormat, true)))
|
|
||||||
{
|
|
||||||
WARN("Invalid DXGI format %#x.\n", desc->DSVFormat);
|
|
||||||
hr = E_FAIL;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ds_desc->DepthEnable && ds_desc->DepthWriteMask)
|
|
||||||
|| (ds_desc->StencilEnable && ds_desc->StencilWriteMask))
|
|
||||||
depth_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
|
||||||
else
|
|
||||||
depth_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
|
|
||||||
|
|
||||||
graphics->attachments[0].flags = 0;
|
|
||||||
graphics->attachments[0].format = format->vk_format;
|
|
||||||
graphics->attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (desc->DepthStencilState.StencilEnable)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < rt_count; ++i)
|
|
||||||
{
|
|
||||||
unsigned int blend_idx = desc->BlendState.IndependentBlendEnable ? i : 0;
|
|
||||||
size_t idx = graphics->rt_idx + i;
|
|
||||||
|
|
||||||
if (!(format = vkd3d_get_format(desc->RTVFormats[i], false)))
|
|
||||||
{
|
|
||||||
WARN("Invalid DXGI format %#x.\n", desc->RTVFormats[i]);
|
|
||||||
hr = E_FAIL;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics->attachments[idx].flags = 0;
|
|
||||||
graphics->attachments[idx].format = format->vk_format;
|
|
||||||
graphics->attachments[idx].samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
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;
|
|
||||||
|
|
||||||
blend_attachment_from_d3d12(&graphics->blend_attachments[i], &desc->BlendState.RenderTarget[blend_idx]);
|
|
||||||
}
|
|
||||||
graphics->attachment_count = graphics->rt_idx + rt_count;
|
|
||||||
|
|
||||||
sub_pass_desc.flags = 0;
|
sub_pass_desc.flags = 0;
|
||||||
sub_pass_desc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
sub_pass_desc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
sub_pass_desc.inputAttachmentCount = 0;
|
sub_pass_desc.inputAttachmentCount = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user