[Mesa-dev] [PATCH 3/7] i965: Add an image format metadata array

Kristian Høgsberg krh at bitplanet.net
Fri Nov 20 13:54:16 PST 2015


On Fri, Nov 20, 2015 at 6:10 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> Jason Ekstrand <jason at jlekstrand.net> writes:
>
>> This little data structure and associated array contains all of the image
>> format metadata needed for doing image_load_store work-arounds.  This way
>> we can pull metadata from within the i965 driver without having to go out
>> to core mesa for it.  It is a bit of duplication with what we have in core
>> mesa but it's limited enough that it's easily verified and not a big deal.
>> ---
>>  src/mesa/drivers/dri/i965/brw_image_load_store.c | 45 ++++++++++++++++++++++++
>>  src/mesa/drivers/dri/i965/brw_image_load_store.h | 20 +++++++++++
>>  2 files changed, 65 insertions(+)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_image_load_store.c b/src/mesa/drivers/dri/i965/brw_image_load_store.c
>> index 4876041..b78d6b2 100644
>> --- a/src/mesa/drivers/dri/i965/brw_image_load_store.c
>> +++ b/src/mesa/drivers/dri/i965/brw_image_load_store.c
>> @@ -26,6 +26,51 @@
>>  #include "brw_defines.h"
>>  #include "brw_image_load_store.h"
>>
>> +#define IF(r, g, b, a, dt, f) \
>> +   [BRW_SURFACEFORMAT_##f] = { true, r, g, b, a, BRW_IMAGE_FORMAT_##dt },
>> +const struct brw_image_format_info brw_image_format_info[] = {
>> +   IF( 8,  0,  0,  0, UNORM, R8_UNORM)
>> +   IF( 8,  0,  0,  0, SNORM, R8_SNORM)
>> +   IF( 8,  0,  0,  0,  UINT, R8_UINT)
>> +   IF( 8,  0,  0,  0,  SINT, R8_SINT)
>> +   IF( 8,  8,  0,  0, UNORM, R8G8_UNORM)
>> +   IF( 8,  8,  0,  0, SNORM, R8G8_SNORM)
>> +   IF( 8,  8,  0,  0,  UINT, R8G8_UINT)
>> +   IF( 8,  8,  0,  0,  SINT, R8G8_SINT)
>> +   IF( 8,  8,  8,  8, UNORM, R8G8B8A8_UNORM)
>> +   IF( 8,  8,  8,  8, SNORM, R8G8B8A8_SNORM)
>> +   IF( 8,  8,  8,  8,  UINT, R8G8B8A8_UINT)
>> +   IF( 8,  8,  8,  8,  SINT, R8G8B8A8_SINT)
>> +   IF(11, 11, 10,  0, FLOAT, R11G11B10_FLOAT)
>> +   IF(10, 10, 10,  2, UNORM, R10G10B10A2_UNORM)
>> +   IF(10, 10, 10,  2,  UINT, R10G10B10A2_UINT)
>> +   IF(16,  0,  0,  0, UNORM, R16_UNORM)
>> +   IF(16,  0,  0,  0, SNORM, R16_SNORM)
>> +   IF(16,  0,  0,  0, FLOAT, R16_FLOAT)
>> +   IF(16,  0,  0,  0,  UINT, R16_UINT)
>> +   IF(16,  0,  0,  0,  SINT, R16_SINT)
>> +   IF(16, 16,  0,  0, UNORM, R16G16_UNORM)
>> +   IF(16, 16,  0,  0, SNORM, R16G16_SNORM)
>> +   IF(16, 16,  0,  0, FLOAT, R16G16_FLOAT)
>> +   IF(16, 16,  0,  0,  UINT, R16G16_UINT)
>> +   IF(16, 16,  0,  0,  SINT, R16G16_SINT)
>> +   IF(16, 16, 16, 16, UNORM, R16G16B16A16_UNORM)
>> +   IF(16, 16, 16, 16, SNORM, R16G16B16A16_SNORM)
>> +   IF(16, 16, 16, 16, FLOAT, R16G16B16A16_FLOAT)
>> +   IF(16, 16, 16, 16,  UINT, R16G16B16A16_UINT)
>> +   IF(16, 16, 16, 16,  SINT, R16G16B16A16_SINT)
>> +   IF(32,  0,  0,  0, FLOAT, R32_FLOAT)
>> +   IF(32,  0,  0,  0,  UINT, R32_UINT)
>> +   IF(32,  0,  0,  0,  SINT, R32_SINT)
>> +   IF(32, 32,  0,  0, FLOAT, R32G32_FLOAT)
>> +   IF(32, 32,  0,  0,  UINT, R32G32_UINT)
>> +   IF(32, 32,  0,  0,  SINT, R32G32_SINT)
>> +   IF(32, 32, 32, 32, FLOAT, R32G32B32A32_FLOAT)
>> +   IF(32, 32, 32, 32,  UINT, R32G32B32A32_UINT)
>> +   IF(32, 32, 32, 32,  SINT, R32G32B32A32_SINT)
>> +};
>> +#undef IF
>> +
>
> I'm not particularly excited about introducing yet another format
> metadata table, used for image_load_store only, even though there's
> nothing image_load_store-specific about this abstraction other than the
> rather limited set of formats it supports.
>
> What's your long-term plan for this?  Do you have any uses in mind other
> than the surface built-in builder, or is it fully ad-hoc infrastructure?

The goal is to be able to use this in a driver that doesn't link to libmesa.la.

Kristian

>>  uint32_t
>>  brw_lower_image_format(const struct brw_device_info *devinfo,
>>                         uint32_t format)
>> diff --git a/src/mesa/drivers/dri/i965/brw_image_load_store.h b/src/mesa/drivers/dri/i965/brw_image_load_store.h
>> index 883eec4..2ab85cc 100644
>> --- a/src/mesa/drivers/dri/i965/brw_image_load_store.h
>> +++ b/src/mesa/drivers/dri/i965/brw_image_load_store.h
>> @@ -23,6 +23,7 @@
>>
>>  #pragma once
>>
>> +#include <stdbool.h>
>>  #include <stdint.h>
>>
>>  #include "brw_device_info.h"
>> @@ -31,6 +32,25 @@
>>  extern "C" {
>>  #endif
>>
>> +enum brw_image_format_data_type {
>> +   BRW_IMAGE_FORMAT_UNORM,
>> +   BRW_IMAGE_FORMAT_SNORM,
>> +   BRW_IMAGE_FORMAT_UINT,
>> +   BRW_IMAGE_FORMAT_SINT,
>> +   BRW_IMAGE_FORMAT_FLOAT,
>> +};
>> +
>> +struct brw_image_format_info {
>> +   bool is_image_format;
>> +   uint8_t red_bits;
>> +   uint8_t green_bits;
>> +   uint8_t blue_bits;
>> +   uint8_t alpha_bits;
>> +   enum brw_image_format_data_type data_type;
>> +};
>> +
>> +extern const struct brw_image_format_info brw_image_format_info[];
>> +
>>  uint32_t brw_lower_image_format(const struct brw_device_info *devinfo,
>>                                  uint32_t format);
>>  #ifdef __cplusplus
>> --
>> 2.5.0.400.gff86faf
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list