diff --git a/src/asahi/compiler/agx_internal_formats.h b/src/asahi/compiler/agx_internal_formats.h new file mode 100644 index 00000000000..03240f057c9 --- /dev/null +++ b/src/asahi/compiler/agx_internal_formats.h @@ -0,0 +1,30 @@ +/* + * Copyright 2022 Alyssa Rosenzweig + * SPDX-License-Identifier: MIT + */ + +#ifndef AGX_INTERNAL_FORMATS_H +#define AGX_INTERNAL_FORMATS_H + +#include "util/format/u_formats.h" + +/* Define aliases for the subset formats that are accessible in the ISA. These + * subsets disregard component mapping and number of components. This + * constitutes ABI with the compiler. + */ +enum agx_internal_formats { + AGX_INTERNAL_FORMAT_I8 = PIPE_FORMAT_R8_UINT, + AGX_INTERNAL_FORMAT_I16 = PIPE_FORMAT_R16_UINT, + AGX_INTERNAL_FORMAT_I32 = PIPE_FORMAT_R32_UINT, + AGX_INTERNAL_FORMAT_F16 = PIPE_FORMAT_R16_FLOAT, + AGX_INTERNAL_FORMAT_U8NORM = PIPE_FORMAT_R8_UNORM, + AGX_INTERNAL_FORMAT_S8NORM = PIPE_FORMAT_R8_SNORM, + AGX_INTERNAL_FORMAT_U16NORM = PIPE_FORMAT_R16_UNORM, + AGX_INTERNAL_FORMAT_S16NORM = PIPE_FORMAT_R16_SNORM, + AGX_INTERNAL_FORMAT_RGB10A2 = PIPE_FORMAT_R10G10B10A2_UNORM, + AGX_INTERNAL_FORMAT_SRGBA8 = PIPE_FORMAT_R8G8B8A8_SRGB, + AGX_INTERNAL_FORMAT_RG11B10F = PIPE_FORMAT_R11G11B10_FLOAT, + AGX_INTERNAL_FORMAT_RGB9E5 = PIPE_FORMAT_R9G9B9E5_FLOAT +}; + +#endif diff --git a/src/asahi/lib/agx_formats.c b/src/asahi/lib/agx_formats.c index a6297efae7f..e5cdf82affc 100644 --- a/src/asahi/lib/agx_formats.c +++ b/src/asahi/lib/agx_formats.c @@ -23,17 +23,18 @@ #include "agx_pack.h" #include "agx_formats.h" +#include "agx_internal_formats.h" #define T true #define F false -#define AGX_FORMAT__ 0 +#define AGX_INTERNAL_FORMAT__ PIPE_FORMAT_NONE #define AGX_FMT(pipe, channels_, type_, is_renderable, internal_fmt) \ [PIPE_FORMAT_ ## pipe] = { \ .channels = AGX_CHANNELS_ ## channels_, \ .type = AGX_TEXTURE_TYPE_ ## type_, \ .renderable = is_renderable, \ - .internal = AGX_FORMAT_ ## internal_fmt,\ + .internal = (enum pipe_format) AGX_INTERNAL_FORMAT_ ## internal_fmt,\ } const struct agx_pixel_format_entry agx_pixel_format[PIPE_FORMAT_COUNT] = { diff --git a/src/asahi/lib/agx_formats.h b/src/asahi/lib/agx_formats.h index 15c9d4b6778..c1e33fbc1d8 100644 --- a/src/asahi/lib/agx_formats.h +++ b/src/asahi/lib/agx_formats.h @@ -32,7 +32,7 @@ struct agx_pixel_format_entry { uint8_t channels; uint8_t type; bool renderable : 1; - enum agx_format internal : 4; + enum pipe_format internal; }; extern const struct agx_pixel_format_entry agx_pixel_format[PIPE_FORMAT_COUNT]; diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index cacc5bdba4c..ddbd0ffd23f 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -746,8 +746,7 @@ agx_flush_batch(struct agx_context *ctx, struct agx_batch *batch) agx_pool_upload(&batch->pool, clear_colour, sizeof(clear_colour))); if (batch->key.cbufs[0]) { - enum pipe_format fmt = batch->key.cbufs[0]->format; - enum agx_format internal = agx_pixel_format[fmt].internal; + enum agx_format internal = AGX_FORMAT_U8NORM /* other formats broken */; uint32_t shader = dev->reload.format[internal]; pipeline_reload = agx_build_reload_pipeline(batch, shader, diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index f5c0cdbb559..5f4dc5b6ac7 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -1240,7 +1240,7 @@ agx_update_fs(struct agx_batch *batch) if (surf) { enum pipe_format fmt = surf->format; key.rt_formats[i] = fmt; - key.base.fs.tib_formats[i] = agx_pixel_format[fmt].internal; + key.base.fs.tib_formats[i] = AGX_FORMAT_U8NORM /* other formats broken */; } else { key.rt_formats[i] = PIPE_FORMAT_NONE; }