[Mesa-dev] [PATCH 3/7] i965: Add an image format metadata array
Francisco Jerez
currojerez at riseup.net
Fri Nov 20 06:10:59 PST 2015
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?
> 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151120/56509768/attachment-0001.sig>
More information about the mesa-dev
mailing list