1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright (c) 2011-2013 Luc Verhaegen <libv@skynet.be> 3bf215546Sopenharmony_ci * Copyright (c) 2018-2019 Lima Project 4bf215546Sopenharmony_ci * 5bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 6bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 7bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 8bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sub license, 9bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 10bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 11bf215546Sopenharmony_ci * 12bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the 13bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions 14bf215546Sopenharmony_ci * of the Software. 15bf215546Sopenharmony_ci * 16bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21bf215546Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22bf215546Sopenharmony_ci * DEALINGS IN THE SOFTWARE. 23bf215546Sopenharmony_ci * 24bf215546Sopenharmony_ci */ 25bf215546Sopenharmony_ci 26bf215546Sopenharmony_ci#include <stdint.h> 27bf215546Sopenharmony_ci#include <stdlib.h> 28bf215546Sopenharmony_ci 29bf215546Sopenharmony_ci#include "util/format/u_format.h" 30bf215546Sopenharmony_ci#include <util/macros.h> 31bf215546Sopenharmony_ci 32bf215546Sopenharmony_ci#include "lima_format.h" 33bf215546Sopenharmony_ci 34bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_L8 0x09 35bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_A8 0x0a 36bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_I8 0x0b 37bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_BGR_565 0x0e 38bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_BGRA_5551 0x0f 39bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_BGRA_4444 0x10 40bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_L8A8 0x11 41bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_L16 0x12 42bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_A16 0x13 43bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_I16 0x14 44bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_RGB_888 0x15 45bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_RGBA_8888 0x16 46bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_RGBX_8888 0x17 47bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_ETC1_RGB8 0x20 48bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_L16_FLOAT 0x22 49bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_A16_FLOAT 0x23 50bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_I16_FLOAT 0x24 51bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_L16A16_FLOAT 0x25 52bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_R16G16B16A16_FLOAT 0x26 53bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_R16G16B16_FLOAT 0x2f 54bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_Z24X8 0x2c 55bf215546Sopenharmony_ci/* This format is only used for depth/stencil reload */ 56bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT_Z24S8_RLD 0x32 57bf215546Sopenharmony_ci 58bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B5G6R5 0x00 59bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B5G5R5A1 0x01 60bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B4G4R4A4 0x02 61bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B8G8R8A8 0x03 62bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B8 0x04 63bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_G8B8 0x05 64bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B16G16R16A16_FLOAT 0x06 65bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_B16_FLOAT 0x07 66bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_G16B16_FLOAT 0x08 67bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_Z16 0x0e 68bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT_Z24S8 0x0f 69bf215546Sopenharmony_ci 70bf215546Sopenharmony_cistruct lima_format { 71bf215546Sopenharmony_ci bool present; 72bf215546Sopenharmony_ci int format; 73bf215546Sopenharmony_ci bool swap_r_b; 74bf215546Sopenharmony_ci union { 75bf215546Sopenharmony_ci uint32_t channel_layout; 76bf215546Sopenharmony_ci uint8_t swizzle[4]; 77bf215546Sopenharmony_ci }; 78bf215546Sopenharmony_ci}; 79bf215546Sopenharmony_ci 80bf215546Sopenharmony_ci#define SWIZ(x,y,z,w) { \ 81bf215546Sopenharmony_ci PIPE_SWIZZLE_##x, \ 82bf215546Sopenharmony_ci PIPE_SWIZZLE_##y, \ 83bf215546Sopenharmony_ci PIPE_SWIZZLE_##z, \ 84bf215546Sopenharmony_ci PIPE_SWIZZLE_##w \ 85bf215546Sopenharmony_ci} 86bf215546Sopenharmony_ci 87bf215546Sopenharmony_ci#define LIMA_TEXEL_FORMAT(pipe, tex, swap, swiz) \ 88bf215546Sopenharmony_ci [PIPE_FORMAT_##pipe] = { \ 89bf215546Sopenharmony_ci .present = true, .format = LIMA_TEXEL_FORMAT_##tex, \ 90bf215546Sopenharmony_ci .swap_r_b = swap, .swizzle = swiz \ 91bf215546Sopenharmony_ci } 92bf215546Sopenharmony_ci 93bf215546Sopenharmony_ci#define LIMA_PIXEL_FORMAT(pipe, pix, swap, ch_layout) \ 94bf215546Sopenharmony_ci [PIPE_FORMAT_##pipe] = { \ 95bf215546Sopenharmony_ci .present = true, .format = LIMA_PIXEL_FORMAT_##pix, \ 96bf215546Sopenharmony_ci .swap_r_b = swap, .channel_layout = ch_layout \ 97bf215546Sopenharmony_ci } 98bf215546Sopenharmony_ci 99bf215546Sopenharmony_cistatic const struct lima_format lima_texel_formats[] = { 100bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R8G8B8A8_UNORM, RGBA_8888, true, SWIZ(X, Y, Z, W)), 101bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(B8G8R8A8_UNORM, RGBA_8888, false, SWIZ(X, Y, Z, W)), 102bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R8G8B8A8_SRGB, RGBA_8888, true, SWIZ(X, Y, Z, W)), 103bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(B8G8R8A8_SRGB, RGBA_8888, false, SWIZ(X, Y, Z, W)), 104bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R8G8B8X8_UNORM, RGBX_8888, true, SWIZ(X, Y, Z, W)), 105bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(B8G8R8X8_UNORM, RGBX_8888, false, SWIZ(X, Y, Z, W)), 106bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(B5G6R5_UNORM, BGR_565, false, SWIZ(X, Y, Z, W)), 107bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(B5G5R5A1_UNORM, BGRA_5551, false, SWIZ(X, Y, Z, W)), 108bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(B4G4R4A4_UNORM, BGRA_4444, false, SWIZ(X, Y, Z, W)), 109bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(Z24_UNORM_S8_UINT, Z24X8, false, SWIZ(X, Y, Z, W)), 110bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(Z24X8_UNORM, Z24X8, false, SWIZ(X, Y, Z, W)), 111bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(Z16_UNORM, L16, false, SWIZ(X, Y, Z, W)), 112bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(L16_UNORM, L16, false, SWIZ(X, Y, Z, W)), 113bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(L8_UNORM, L8, false, SWIZ(X, Y, Z, W)), 114bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(A16_UNORM, A16, false, SWIZ(X, Y, Z, W)), 115bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(A8_UNORM, A8, false, SWIZ(X, Y, Z, W)), 116bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(I16_UNORM, I16, false, SWIZ(X, Y, Z, W)), 117bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(I8_UNORM, I8, false, SWIZ(X, Y, Z, W)), 118bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(L8A8_UNORM, L8A8, false, SWIZ(X, Y, Z, W)), 119bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(ETC1_RGB8, ETC1_RGB8, false, SWIZ(X, Y, Z, W)), 120bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R8_UNORM, L8, false, SWIZ(X, 0, 0, 1)), 121bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R8G8_UNORM, L8A8, false, SWIZ(X, W, 0, 1)), 122bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R16G16B16_FLOAT, R16G16B16_FLOAT, true, SWIZ(X, Y, Z, W)), 123bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(R16G16B16A16_FLOAT, R16G16B16A16_FLOAT, true, SWIZ(X, Y, Z, W)), 124bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(L16_FLOAT, L16_FLOAT, false, SWIZ(X, Y, Z, W)), 125bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(A16_FLOAT, A16_FLOAT, false, SWIZ(X, Y, Z, W)), 126bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(I16_FLOAT, I16_FLOAT, false, SWIZ(X, Y, Z, W)), 127bf215546Sopenharmony_ci LIMA_TEXEL_FORMAT(L16A16_FLOAT, L16A16_FLOAT, false, SWIZ(X, Y, Z, W)), 128bf215546Sopenharmony_ci}; 129bf215546Sopenharmony_ci 130bf215546Sopenharmony_cistatic const struct lima_format lima_pixel_formats[] = { 131bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R8G8B8A8_UNORM, B8G8R8A8, true, 0x8888), 132bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(B8G8R8A8_UNORM, B8G8R8A8, false, 0x8888), 133bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R8G8B8A8_SRGB, B8G8R8A8, true, 0x8888), 134bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(B8G8R8A8_SRGB, B8G8R8A8, false, 0x8888), 135bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R8G8B8X8_UNORM, B8G8R8A8, true, 0x8888), 136bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(B8G8R8X8_UNORM, B8G8R8A8, false, 0x8888), 137bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(B5G6R5_UNORM, B5G6R5, false, 0x8565), 138bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(B5G5R5A1_UNORM, B5G5R5A1, false, 0x8565), 139bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(B4G4R4A4_UNORM, B4G4R4A4, false, 0x8444), 140bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R8_UNORM, B8, true, 0x8888), 141bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R8G8_UNORM, G8B8, true, 0x8888), 142bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(Z16_UNORM, Z16, false, 0x0000), 143bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(Z24_UNORM_S8_UINT, Z24S8, false, 0x0000), 144bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(Z24X8_UNORM, Z24S8, false, 0x0000), 145bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R16G16B16A16_FLOAT, B16G16R16A16_FLOAT, true, 0x0000), 146bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R16_FLOAT, B16_FLOAT, true, 0x0000), 147bf215546Sopenharmony_ci LIMA_PIXEL_FORMAT(R16G16_FLOAT, G16B16_FLOAT, true, 0x0000), 148bf215546Sopenharmony_ci}; 149bf215546Sopenharmony_ci 150bf215546Sopenharmony_cistatic const struct lima_format * 151bf215546Sopenharmony_ciget_texel_format(enum pipe_format f) 152bf215546Sopenharmony_ci{ 153bf215546Sopenharmony_ci if (f >= ARRAY_SIZE(lima_texel_formats) || 154bf215546Sopenharmony_ci !lima_texel_formats[f].present) 155bf215546Sopenharmony_ci return NULL; 156bf215546Sopenharmony_ci 157bf215546Sopenharmony_ci return lima_texel_formats + f; 158bf215546Sopenharmony_ci} 159bf215546Sopenharmony_ci 160bf215546Sopenharmony_cistatic const struct lima_format * 161bf215546Sopenharmony_ciget_pixel_format(enum pipe_format f) 162bf215546Sopenharmony_ci{ 163bf215546Sopenharmony_ci if (f >= ARRAY_SIZE(lima_pixel_formats) || 164bf215546Sopenharmony_ci !lima_pixel_formats[f].present) 165bf215546Sopenharmony_ci return NULL; 166bf215546Sopenharmony_ci 167bf215546Sopenharmony_ci return lima_pixel_formats + f; 168bf215546Sopenharmony_ci} 169bf215546Sopenharmony_ci 170bf215546Sopenharmony_cibool 171bf215546Sopenharmony_cilima_format_texel_supported(enum pipe_format f) 172bf215546Sopenharmony_ci{ 173bf215546Sopenharmony_ci const struct lima_format *lf = get_texel_format(f); 174bf215546Sopenharmony_ci 175bf215546Sopenharmony_ci if (!lf) 176bf215546Sopenharmony_ci return false; 177bf215546Sopenharmony_ci 178bf215546Sopenharmony_ci return true; 179bf215546Sopenharmony_ci} 180bf215546Sopenharmony_ci 181bf215546Sopenharmony_cibool 182bf215546Sopenharmony_cilima_format_pixel_supported(enum pipe_format f) 183bf215546Sopenharmony_ci{ 184bf215546Sopenharmony_ci const struct lima_format *lf = get_pixel_format(f); 185bf215546Sopenharmony_ci 186bf215546Sopenharmony_ci if (!lf) 187bf215546Sopenharmony_ci return false; 188bf215546Sopenharmony_ci 189bf215546Sopenharmony_ci return true; 190bf215546Sopenharmony_ci} 191bf215546Sopenharmony_ci 192bf215546Sopenharmony_ciint 193bf215546Sopenharmony_cilima_format_get_texel(enum pipe_format f) 194bf215546Sopenharmony_ci{ 195bf215546Sopenharmony_ci return lima_texel_formats[f].format; 196bf215546Sopenharmony_ci} 197bf215546Sopenharmony_ci 198bf215546Sopenharmony_ciint 199bf215546Sopenharmony_cilima_format_get_texel_reload(enum pipe_format f) 200bf215546Sopenharmony_ci{ 201bf215546Sopenharmony_ci switch (f) { 202bf215546Sopenharmony_ci case PIPE_FORMAT_Z24_UNORM_S8_UINT: 203bf215546Sopenharmony_ci case PIPE_FORMAT_Z24X8_UNORM: 204bf215546Sopenharmony_ci return LIMA_TEXEL_FORMAT_Z24S8_RLD; 205bf215546Sopenharmony_ci default: 206bf215546Sopenharmony_ci return lima_format_get_texel(f); 207bf215546Sopenharmony_ci } 208bf215546Sopenharmony_ci} 209bf215546Sopenharmony_ci 210bf215546Sopenharmony_ciint 211bf215546Sopenharmony_cilima_format_get_pixel(enum pipe_format f) 212bf215546Sopenharmony_ci{ 213bf215546Sopenharmony_ci return lima_pixel_formats[f].format; 214bf215546Sopenharmony_ci} 215bf215546Sopenharmony_ci 216bf215546Sopenharmony_cibool 217bf215546Sopenharmony_cilima_format_get_texel_swap_rb(enum pipe_format f) 218bf215546Sopenharmony_ci{ 219bf215546Sopenharmony_ci return lima_texel_formats[f].swap_r_b; 220bf215546Sopenharmony_ci} 221bf215546Sopenharmony_ci 222bf215546Sopenharmony_cibool 223bf215546Sopenharmony_cilima_format_get_pixel_swap_rb(enum pipe_format f) 224bf215546Sopenharmony_ci{ 225bf215546Sopenharmony_ci return lima_pixel_formats[f].swap_r_b; 226bf215546Sopenharmony_ci} 227bf215546Sopenharmony_ci 228bf215546Sopenharmony_ciconst uint8_t * 229bf215546Sopenharmony_cilima_format_get_texel_swizzle(enum pipe_format f) 230bf215546Sopenharmony_ci{ 231bf215546Sopenharmony_ci return lima_texel_formats[f].swizzle; 232bf215546Sopenharmony_ci} 233bf215546Sopenharmony_ci 234bf215546Sopenharmony_ciuint32_t 235bf215546Sopenharmony_cilima_format_get_channel_layout(enum pipe_format f) 236bf215546Sopenharmony_ci{ 237bf215546Sopenharmony_ci return lima_pixel_formats[f].channel_layout; 238bf215546Sopenharmony_ci} 239