On Fri, Nov 20, 2015 at 6:10 AM, Francisco Jerez <curroje...@riseup.net> wrote: > Jason Ekstrand <ja...@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@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev