diff options
author | Dave Airlie <[email protected]> | 2017-07-27 21:52:20 +0100 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-08-01 00:10:23 +0100 |
commit | df61a05019d5c7479d4b29d251af4231f125e61c (patch) | |
tree | 80d8e3ccb86c3f5627eef17fe0cb1472368b04ef /src/amd/vulkan/radv_pipeline.c | |
parent | b7dd86a04ec415b7ef4f3bfc9a4708820519137f (diff) |
radv: handle 10-bit format clamping workaround.
This fixes:
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.*
for a2r10g10b10 formats as destination on SI/CIK hardware.
This adds support to the meta program for emitting 10-bit
outputs, and adds 10-bit support to the fragment shader key.
It also only does the int8/10 on SI/CIK.
Fixes: f4e499ec7 (radv: add initial non-conformant radv vulkan driver)
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd/vulkan/radv_pipeline.c')
-rw-r--r-- | src/amd/vulkan/radv_pipeline.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index c4407ec7e23..28389368cec 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1067,20 +1067,37 @@ format_is_int8(VkFormat format) desc->channel[channel].size == 8; } +static bool +format_is_int10(VkFormat format) +{ + const struct vk_format_description *desc = vk_format_description(format); + + if (desc->nr_channels != 4) + return false; + for (unsigned i = 0; i < 4; i++) { + if (desc->channel[i].pure_integer && desc->channel[i].size == 10) + return true; + } + return false; +} + unsigned radv_format_meta_fs_key(VkFormat format) { unsigned col_format = si_choose_spi_color_format(format, false, false) - 1; bool is_int8 = format_is_int8(format); + bool is_int10 = format_is_int10(format); - return col_format + (is_int8 ? 3 : 0); + return col_format + (is_int8 ? 3 : is_int10 ? 5 : 0); } -static unsigned -radv_pipeline_compute_is_int8(const VkGraphicsPipelineCreateInfo *pCreateInfo) +static void +radv_pipeline_compute_get_int_clamp(const VkGraphicsPipelineCreateInfo *pCreateInfo, + unsigned *is_int8, unsigned *is_int10) { RADV_FROM_HANDLE(radv_render_pass, pass, pCreateInfo->renderPass); struct radv_subpass *subpass = pass->subpasses + pCreateInfo->subpass; - unsigned is_int8 = 0; + *is_int8 = 0; + *is_int10 = 0; for (unsigned i = 0; i < subpass->color_count; ++i) { struct radv_render_pass_attachment *attachment; @@ -1091,10 +1108,10 @@ radv_pipeline_compute_is_int8(const VkGraphicsPipelineCreateInfo *pCreateInfo) attachment = pass->attachments + subpass->color_attachments[i].attachment; if (format_is_int8(attachment->format)) - is_int8 |= 1 << i; + *is_int8 |= 1 << i; + if (format_is_int10(attachment->format)) + *is_int10 |= 1 << i; } - - return is_int8; } static void @@ -2053,9 +2070,11 @@ radv_pipeline_init(struct radv_pipeline *pipeline, } if (modules[MESA_SHADER_FRAGMENT]) { - union ac_shader_variant_key key; + union ac_shader_variant_key key = {0}; key.fs.col_format = pipeline->graphics.blend.spi_shader_col_format; - key.fs.is_int8 = radv_pipeline_compute_is_int8(pCreateInfo); + + if (pipeline->device->physical_device->rad_info.chip_class < VI) + radv_pipeline_compute_get_int_clamp(pCreateInfo, &key.fs.is_int8, &key.fs.is_int10); const VkPipelineShaderStageCreateInfo *stage = pStages[MESA_SHADER_FRAGMENT]; |