<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 3, 2017 at 10:16 AM, Chad Versace <span dir="ltr"><<a href="mailto:chadversary@chromium.org" target="_blank">chadversary@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue 03 Oct 2017, Lionel Landwerlin wrote:<br>
> Newer format enums start at offset 1000000000, making it impossible to<br>
> have them all in one table. This change splits the formats into sets<br>
> that we then access through indirection.<br>
><br>
> Signed-off-by: Lionel Landwerlin <<a href="mailto:lionel.g.landwerlin@intel.com">lionel.g.landwerlin@intel.com</a><wbr>><br>
> ---<br>
>  src/intel/vulkan/anv_formats.c | 35 ++++++++++++++++++++++++++----<wbr>-----<br>
>  1 file changed, 26 insertions(+), 9 deletions(-)<br>
><br>
> diff --git a/src/intel/vulkan/anv_<wbr>formats.c b/src/intel/vulkan/anv_<wbr>formats.c<br>
> index 049ffe17ac0..71824256b25 100644<br>
> --- a/src/intel/vulkan/anv_<wbr>formats.c<br>
> +++ b/src/intel/vulkan/anv_<wbr>formats.c<br>
> @@ -58,7 +58,7 @@<br>
>   * other.  The reason for this is that, for packed formats, the ISL (and<br>
>   * bspec) names are in LSB -> MSB order while VK formats are MSB -> LSB.<br>
>   */<br>
> -static const struct anv_format anv_formats[] = {<br>
> +static const struct anv_format main_formats[] = {<br>
>     fmt(VK_FORMAT_UNDEFINED,               ISL_FORMAT_UNSUPPORTED),<br>
>     fmt(VK_FORMAT_R4G4_UNORM_<wbr>PACK8,        ISL_FORMAT_UNSUPPORTED),<br>
>     fmt(VK_FORMAT_R4G4B4A4_UNORM_<wbr>PACK16,   ISL_FORMAT_A4B4G4R4_UNORM),<br>
> @@ -251,13 +251,30 @@ static const struct anv_format anv_formats[] = {<br>
><br>
>  #undef fmt<br>
><br>
> +static const struct {<br>
> +   const struct anv_format *formats;<br>
> +   uint32_t n_formats;<br>
> +} anv_formats[] = {<br>
> +   [0] = { .formats = main_formats, .n_formats = ARRAY_SIZE(main_formats), },<br>
> +};<br>
> +<br>
> +static struct anv_format<br>
> +format_extract(VkFormat vk_format)<br>
> +{<br>
> +   uint32_t enum_offset = vk_enum_offset(vk_format);<br>
> +   uint32_t ext_number = vk_enum_extension(vk_format);<br>
> +<br>
> +   if (ext_number >= ARRAY_SIZE(anv_formats) ||<br>
> +       enum_offset >= anv_formats[ext_number].n_<wbr>formats)<br>
> +      return (struct anv_format) { .isl_format = ISL_FORMAT_UNSUPPORTED };<br>
> +<br>
> +   return anv_formats[ext_number].<wbr>formats[enum_offset];<br>
> +}<br>
> +<br>
>  static bool<br>
>  format_supported(VkFormat vk_format)<br>
>  {<br>
> -   if (vk_format >= ARRAY_SIZE(anv_formats))<br>
> -      return false;<br>
> -<br>
> -   return anv_formats[vk_format].isl_<wbr>format != ISL_FORMAT_UNSUPPORTED;<br>
> +   return format_extract(vk_format).isl_<wbr>format != ISL_FORMAT_UNSUPPORTED;<br>
>  }<br>
><br>
>  /**<br>
> @@ -267,10 +284,10 @@ struct anv_format<br>
>  anv_get_format(const struct gen_device_info *devinfo, VkFormat vk_format,<br>
>                 VkImageAspectFlags aspect, VkImageTiling tiling)<br>
>  {<br>
> -   if (!format_supported(vk_format))<br>
> -      return anv_formats[VK_FORMAT_<wbr>UNDEFINED];<br>
> +   struct anv_format format = format_extract(vk_format);<br>
><br>
> -   struct anv_format format = anv_formats[vk_format];<br>
> +   if (format.isl_format == ISL_FORMAT_UNSUPPORTED)<br>
> +      return format;<br>
><br>
>     if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {<br>
>        assert(vk_format_aspects(vk_<wbr>format) & VK_IMAGE_ASPECT_STENCIL_BIT);<br>
> @@ -553,7 +570,7 @@ anv_get_image_format_<wbr>properties(<br>
>      *    * This field cannot be ASTC format if the Surface Type is SURFTYPE_1D.<br>
>      */<br>
>     if (info->type == VK_IMAGE_TYPE_1D &&<br>
> -       isl_format_is_compressed(anv_<wbr>formats[info->format].isl_<wbr>format)) {<br>
> +       isl_format_is_compressed(<wbr>format_extract(info->format).<wbr>isl_format)) {<br>
<br>
</div></div>When I see format_extract(), I have no idea what it does. How about<br>
giving it a name like format_to_anv(), vk_format_to_anv(), or even<br>
something as simple as format_get()? Everyone has a general<br>
understanding of what foobar_get() and foobar_to_stuff() does, but<br>
I don't think foobar_extract() is as well understand. <br></blockquote><div><br></div><div>+1.  I like vk_to_anv_format personally. <br></div></div></div></div>