[Mesa-dev] [PATCH 4/7] i965/fs: Use image_format_info for doing image_load_store workarounds

Jason Ekstrand jason at jlekstrand.net
Mon Nov 9 18:27:44 PST 2015


On Mon, Nov 9, 2015 at 2:24 PM, Chad Versace <chad.versace at intel.com> wrote:
> On Wed 04 Nov 2015, Jason Ekstrand wrote:
>> ---
>>  .../drivers/dri/i965/brw_fs_surface_builder.cpp    | 157 ++++++++++++++-------
>>  1 file changed, 106 insertions(+), 51 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>> index 31ecb5b..d841ffe 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>> @@ -22,6 +22,9 @@
>>   */
>>
>>  #include "brw_fs_surface_builder.h"
>> +#include "intel_mipmap_tree.h"
>> +#include "brw_state.h"
>> +#include "brw_image_load_store.h"
>>  #include "brw_fs.h"
>>
>>  using namespace brw;
>> @@ -192,32 +195,80 @@ namespace {
>>         * Return the per-channel bitfield widths for a given image format.
>>         */
>>        inline color_u
>> -      get_bit_widths(mesa_format format)
>> +      get_bit_widths(uint32_t brw_format)
>>        {
>> -         return color_u(_mesa_get_format_bits(format, GL_RED_BITS),
>> -                        _mesa_get_format_bits(format, GL_GREEN_BITS),
>> -                        _mesa_get_format_bits(format, GL_BLUE_BITS),
>> -                        _mesa_get_format_bits(format, GL_ALPHA_BITS));
>> +         return color_u(brw_image_format_info[brw_format].red_bits,
>> +                        brw_image_format_info[brw_format].green_bits,
>> +                        brw_image_format_info[brw_format].blue_bits,
>> +                        brw_image_format_info[brw_format].alpha_bits);
>>        }
>>
>>        /**
>>         * Return the per-channel bitfield shifts for a given image format.
>>         */
>>        inline color_u
>> -      get_bit_shifts(mesa_format format)
>> +      get_bit_shifts(uint32_t brw_format)
>>        {
>> -         const color_u widths = get_bit_widths(format);
>> +         const color_u widths = get_bit_widths(brw_format);
>>           return color_u(0, widths.r, widths.r + widths.g,
>>                          widths.r + widths.g + widths.b);
>>        }
>>
>> +      inline unsigned
>> +      get_format_bytes(uint32_t brw_format)
>> +      {
>> +         return (brw_image_format_info[brw_format].red_bits +
>> +                 brw_image_format_info[brw_format].green_bits +
>> +                 brw_image_format_info[brw_format].blue_bits +
>> +                 brw_image_format_info[brw_format].alpha_bits) / 8;
>
> For general formats, this calculation is wrong. I assume this function
> is used only for RGBA-formats, though, which makes the function correct.
>
> I have the same comment for other hunks in this patch too.
>
>> +      }
>> +
>> +      inline unsigned
>> +      get_format_num_components(uint32_t brw_format)
>> +      {
>> +         if (brw_image_format_info[brw_format].green_bits == 0) {
>> +            return 1;
>> +         } else if (brw_image_format_info[brw_format].blue_bits == 0) {
>> +            return 2;
>> +         } else {
>> +            return 4;
>> +         }
>
> This function needs a case for alpha. Either

Actually, it doesn't...  All of the brw_fs_surface_builder code
assumes image formats which are all power-of-two so RGB isn't valid.
Maybe I should say something?
--Jason

>         } else if (brw_image_format_info[brw_format].alpha_bits == 0) {
>                 return 3;
>         }
>
> or
>
>         } else {
>                 assert(brw_image_format_info[brw_format].alpha_bits > 0);
>                 return 4;
>         }
>
>
> The rest of the patch looked good to me.


More information about the mesa-dev mailing list