[Mesa-dev] [PATCH] nvc0: add support for BGRA8 images
Samuel Pitoiset
samuel.pitoiset at gmail.com
Mon Jul 18 21:15:52 UTC 2016
Works fine on Fermi, but still need to test on Kepler1.
On 07/16/2016 09:09 PM, Ilia Mirkin wrote:
> This is useful for pbo downloads, which are now accelerated with images.
> BGRA8 is a moderately common format to do that in.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> This needs testing on SM20 and SM30. I've tested it on SM35 and
>
> bin/pbo-readpixels-small -auto
>
> worked fine. (Didn't until I properly fixed the various items.)
>
> src/gallium/drivers/nouveau/codegen/nv50_ir.cpp | 2 ++
> src/gallium/drivers/nouveau/codegen/nv50_ir.h | 3 +++
> src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp | 2 ++
> src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 4 ++++
> src/gallium/drivers/nouveau/nv50/g80_defs.xml.h | 1 +
> src/gallium/drivers/nouveau/nv50/nv50_formats.c | 3 ++-
> src/gallium/drivers/nouveau/nvc0/nvc0_tex.c | 2 ++
> 7 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
> index 2caebe8..179ad0b 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
> @@ -1012,6 +1012,8 @@ const struct TexInstruction::ImgFormatDesc TexInstruction::formatTable[] =
> { "RG8_SNORM", 2, { 8, 8, 0, 0 }, SNORM },
> { "R16_SNORM", 1, { 16, 0, 0, 0 }, SNORM },
> { "R8_SNORM", 1, { 8, 0, 0, 0 }, SNORM },
> +
> + { "BGRA8", 4, { 8, 8, 8, 8 }, UNORM, true },
> };
>
> void
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> index 41804b6..6d2ee8b 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
> @@ -412,6 +412,8 @@ enum ImgFormat
> FMT_R16_SNORM,
> FMT_R8_SNORM,
>
> + FMT_BGRA8,
> +
> IMG_FORMAT_COUNT,
> };
>
> @@ -967,6 +969,7 @@ public:
> uint8_t components;
> uint8_t bits[4];
> ImgType type;
> + bool bgra;
> };
>
> static const struct ImgFormatDesc formatTable[IMG_FORMAT_COUNT];
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> index 61eb7f5..7dff08a 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> @@ -508,6 +508,8 @@ static nv50_ir::ImgFormat translateImgFormat(uint format)
> FMT_CASE(R8G8_SNORM, RG8_SNORM);
> FMT_CASE(R16_SNORM, R16_SNORM);
> FMT_CASE(R8_SNORM, R8_SNORM);
> +
> + FMT_CASE(B8G8R8A8_UNORM, BGRA8);
> }
>
> assert(!"Unexpected format");
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> index 18955eb..92bc0bb 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -1940,6 +1940,10 @@ NVC0LoweringPass::convertSurfaceFormat(TexInstruction *su)
> bld.mkCvt(OP_CVT, TYPE_F32, typedDst[i], TYPE_F16, typedDst[i]);
> }
> }
> +
> + if (format->bgra) {
> + std::swap(typedDst[0], typedDst[2]);
> + }
> }
>
> void
> diff --git a/src/gallium/drivers/nouveau/nv50/g80_defs.xml.h b/src/gallium/drivers/nouveau/nv50/g80_defs.xml.h
> index 5d40624..49bf860 100644
> --- a/src/gallium/drivers/nouveau/nv50/g80_defs.xml.h
> +++ b/src/gallium/drivers/nouveau/nv50/g80_defs.xml.h
> @@ -177,6 +177,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> #define GK104_IMAGE_FORMAT_RG32_FLOAT 0x0000000d
> #define GK104_IMAGE_FORMAT_RG32_SINT 0x0000000e
> #define GK104_IMAGE_FORMAT_RG32_UINT 0x0000000f
> +#define GK104_IMAGE_FORMAT_BGRA8_UNORM 0x00000011
> #define GK104_IMAGE_FORMAT_RGB10_A2_UNORM 0x00000013
> #define GK104_IMAGE_FORMAT_RGB10_A2_UINT 0x00000015
> #define GK104_IMAGE_FORMAT_RGBA8_UNORM 0x00000018
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_formats.c b/src/gallium/drivers/nouveau/nv50/nv50_formats.c
> index 34d32d1..07c4419 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_formats.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_formats.c
> @@ -50,6 +50,7 @@
> #define U_IB PIPE_BIND_BLENDABLE | U_IR
> #define U_TD PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET | U_TB
> #define U_TZ PIPE_BIND_DEPTH_STENCIL | U_T
> +#define U_ID U_TD | U_I
> #if NOUVEAU_DRIVER == 0xc0
> # define U_TC U_TB
> # define U_IC U_IB
> @@ -122,7 +123,7 @@ const struct nvc0_format nvc0_format_table[PIPE_FORMAT_COUNT] =
> const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
> #endif
> {
> - C4(A, B8G8R8A8_UNORM, BGRA8_UNORM, B, G, R, A, UNORM, A8B8G8R8, TD),
> + C4(A, B8G8R8A8_UNORM, BGRA8_UNORM, B, G, R, A, UNORM, A8B8G8R8, ID),
> F3(A, B8G8R8X8_UNORM, BGRX8_UNORM, B, G, R, xx, UNORM, A8B8G8R8, TD),
> C4(A, B8G8R8A8_SRGB, BGRA8_SRGB, B, G, R, A, UNORM, A8B8G8R8, TD),
> F3(A, B8G8R8X8_SRGB, BGRX8_SRGB, B, G, R, xx, UNORM, A8B8G8R8, TD),
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c b/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
> index 6e9e768..439f0f5 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
> @@ -1162,6 +1162,7 @@ static const uint8_t nve4_su_format_map[PIPE_FORMAT_COUNT] =
> [PIPE_FORMAT_R16G16B16A16_SNORM] = GK104_IMAGE_FORMAT_RGBA16_SNORM,
> [PIPE_FORMAT_R16G16B16A16_SINT] = GK104_IMAGE_FORMAT_RGBA16_SINT,
> [PIPE_FORMAT_R16G16B16A16_UINT] = GK104_IMAGE_FORMAT_RGBA16_UINT,
> + [PIPE_FORMAT_B8G8R8A8_UNORM] = GK104_IMAGE_FORMAT_BGRA8_UNORM,
> [PIPE_FORMAT_R8G8B8A8_UNORM] = GK104_IMAGE_FORMAT_RGBA8_UNORM,
> [PIPE_FORMAT_R8G8B8A8_SNORM] = GK104_IMAGE_FORMAT_RGBA8_SNORM,
> [PIPE_FORMAT_R8G8B8A8_SINT] = GK104_IMAGE_FORMAT_RGBA8_SINT,
> @@ -1216,6 +1217,7 @@ static const uint16_t nve4_su_format_aux_map[PIPE_FORMAT_COUNT] =
>
> [PIPE_FORMAT_R10G10B10A2_UNORM] = 0x2a24,
> [PIPE_FORMAT_R10G10B10A2_UINT] = 0x2a24,
> + [PIPE_FORMAT_B8G8R8A8_UNORM] = 0x2a24,
> [PIPE_FORMAT_R8G8B8A8_UNORM] = 0x2a24,
> [PIPE_FORMAT_R8G8B8A8_SNORM] = 0x2a24,
> [PIPE_FORMAT_R8G8B8A8_SINT] = 0x2a24,
>
More information about the mesa-dev
mailing list