Path: blob/21.2-virgl/src/gallium/drivers/lima/lima_format.c
4565 views
/*1* Copyright (c) 2011-2013 Luc Verhaegen <[email protected]>2* Copyright (c) 2018-2019 Lima Project3*4* Permission is hereby granted, free of charge, to any person obtaining a5* copy of this software and associated documentation files (the "Software"),6* to deal in the Software without restriction, including without limitation7* the rights to use, copy, modify, merge, publish, distribute, sub license,8* and/or sell copies of the Software, and to permit persons to whom the9* Software is furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice (including the12* next paragraph) shall be included in all copies or substantial portions13* of the Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL18* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER19* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING20* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER21* DEALINGS IN THE SOFTWARE.22*23*/2425#include <stdint.h>26#include <stdlib.h>2728#include "util/format/u_format.h"29#include <util/macros.h>3031#include "lima_format.h"3233#define LIMA_TEXEL_FORMAT_L8 0x0934#define LIMA_TEXEL_FORMAT_A8 0x0a35#define LIMA_TEXEL_FORMAT_I8 0x0b36#define LIMA_TEXEL_FORMAT_BGR_565 0x0e37#define LIMA_TEXEL_FORMAT_BGRA_5551 0x0f38#define LIMA_TEXEL_FORMAT_BGRA_4444 0x1039#define LIMA_TEXEL_FORMAT_L8A8 0x1140#define LIMA_TEXEL_FORMAT_L16 0x1241#define LIMA_TEXEL_FORMAT_A16 0x1342#define LIMA_TEXEL_FORMAT_I16 0x1443#define LIMA_TEXEL_FORMAT_RGB_888 0x1544#define LIMA_TEXEL_FORMAT_RGBA_8888 0x1645#define LIMA_TEXEL_FORMAT_RGBX_8888 0x1746#define LIMA_TEXEL_FORMAT_ETC1_RGB8 0x2047#define LIMA_TEXEL_FORMAT_L16_FLOAT 0x2248#define LIMA_TEXEL_FORMAT_A16_FLOAT 0x2349#define LIMA_TEXEL_FORMAT_I16_FLOAT 0x2450#define LIMA_TEXEL_FORMAT_L16A16_FLOAT 0x2551#define LIMA_TEXEL_FORMAT_R16G16B16A16_FLOAT 0x2652#define LIMA_TEXEL_FORMAT_R16G16B16_FLOAT 0x2f53#define LIMA_TEXEL_FORMAT_Z24X8 0x2c54/* This format is only used for depth/stencil reload */55#define LIMA_TEXEL_FORMAT_Z24S8_RLD 0x325657#define LIMA_PIXEL_FORMAT_B5G6R5 0x0058#define LIMA_PIXEL_FORMAT_B5G5R5A1 0x0159#define LIMA_PIXEL_FORMAT_B4G4R4A4 0x0260#define LIMA_PIXEL_FORMAT_B8G8R8A8 0x0361#define LIMA_PIXEL_FORMAT_B8 0x0462#define LIMA_PIXEL_FORMAT_G8B8 0x0563#define LIMA_PIXEL_FORMAT_B16G16R16A16_FLOAT 0x0664#define LIMA_PIXEL_FORMAT_B16_FLOAT 0x0765#define LIMA_PIXEL_FORMAT_G16B16_FLOAT 0x0866#define LIMA_PIXEL_FORMAT_Z16 0x0e67#define LIMA_PIXEL_FORMAT_Z24S8 0x0f6869struct lima_format {70bool present;71int format;72bool swap_r_b;73union {74uint32_t channel_layout;75uint8_t swizzle[4];76};77};7879#define SWIZ(x,y,z,w) { \80PIPE_SWIZZLE_##x, \81PIPE_SWIZZLE_##y, \82PIPE_SWIZZLE_##z, \83PIPE_SWIZZLE_##w \84}8586#define LIMA_TEXEL_FORMAT(pipe, tex, swap, swiz) \87[PIPE_FORMAT_##pipe] = { \88.present = true, .format = LIMA_TEXEL_FORMAT_##tex, \89.swap_r_b = swap, .swizzle = swiz \90}9192#define LIMA_PIXEL_FORMAT(pipe, pix, swap, ch_layout) \93[PIPE_FORMAT_##pipe] = { \94.present = true, .format = LIMA_PIXEL_FORMAT_##pix, \95.swap_r_b = swap, .channel_layout = ch_layout \96}9798static const struct lima_format lima_texel_formats[] = {99LIMA_TEXEL_FORMAT(R8G8B8A8_UNORM, RGBA_8888, true, SWIZ(X, Y, Z, W)),100LIMA_TEXEL_FORMAT(B8G8R8A8_UNORM, RGBA_8888, false, SWIZ(X, Y, Z, W)),101LIMA_TEXEL_FORMAT(R8G8B8A8_SRGB, RGBA_8888, true, SWIZ(X, Y, Z, W)),102LIMA_TEXEL_FORMAT(B8G8R8A8_SRGB, RGBA_8888, false, SWIZ(X, Y, Z, W)),103LIMA_TEXEL_FORMAT(R8G8B8X8_UNORM, RGBX_8888, true, SWIZ(X, Y, Z, W)),104LIMA_TEXEL_FORMAT(B8G8R8X8_UNORM, RGBX_8888, false, SWIZ(X, Y, Z, W)),105LIMA_TEXEL_FORMAT(B5G6R5_UNORM, BGR_565, false, SWIZ(X, Y, Z, W)),106LIMA_TEXEL_FORMAT(B5G5R5A1_UNORM, BGRA_5551, false, SWIZ(X, Y, Z, W)),107LIMA_TEXEL_FORMAT(B4G4R4A4_UNORM, BGRA_4444, false, SWIZ(X, Y, Z, W)),108LIMA_TEXEL_FORMAT(Z24_UNORM_S8_UINT, Z24X8, false, SWIZ(X, Y, Z, W)),109LIMA_TEXEL_FORMAT(Z24X8_UNORM, Z24X8, false, SWIZ(X, Y, Z, W)),110LIMA_TEXEL_FORMAT(Z16_UNORM, L16, false, SWIZ(X, Y, Z, W)),111LIMA_TEXEL_FORMAT(L16_UNORM, L16, false, SWIZ(X, Y, Z, W)),112LIMA_TEXEL_FORMAT(L8_UNORM, L8, false, SWIZ(X, Y, Z, W)),113LIMA_TEXEL_FORMAT(A16_UNORM, A16, false, SWIZ(X, Y, Z, W)),114LIMA_TEXEL_FORMAT(A8_UNORM, A8, false, SWIZ(X, Y, Z, W)),115LIMA_TEXEL_FORMAT(I16_UNORM, I16, false, SWIZ(X, Y, Z, W)),116LIMA_TEXEL_FORMAT(I8_UNORM, I8, false, SWIZ(X, Y, Z, W)),117LIMA_TEXEL_FORMAT(L8A8_UNORM, L8A8, false, SWIZ(X, Y, Z, W)),118LIMA_TEXEL_FORMAT(ETC1_RGB8, ETC1_RGB8, false, SWIZ(X, Y, Z, W)),119LIMA_TEXEL_FORMAT(R8_UNORM, L8, false, SWIZ(X, 0, 0, 1)),120LIMA_TEXEL_FORMAT(R8G8_UNORM, L8A8, false, SWIZ(X, W, 0, 1)),121LIMA_TEXEL_FORMAT(R16G16B16_FLOAT, R16G16B16_FLOAT, true, SWIZ(X, Y, Z, W)),122LIMA_TEXEL_FORMAT(R16G16B16A16_FLOAT, R16G16B16A16_FLOAT, true, SWIZ(X, Y, Z, W)),123LIMA_TEXEL_FORMAT(L16_FLOAT, L16_FLOAT, false, SWIZ(X, Y, Z, W)),124LIMA_TEXEL_FORMAT(A16_FLOAT, A16_FLOAT, false, SWIZ(X, Y, Z, W)),125LIMA_TEXEL_FORMAT(I16_FLOAT, I16_FLOAT, false, SWIZ(X, Y, Z, W)),126LIMA_TEXEL_FORMAT(L16A16_FLOAT, L16A16_FLOAT, false, SWIZ(X, Y, Z, W)),127};128129static const struct lima_format lima_pixel_formats[] = {130LIMA_PIXEL_FORMAT(R8G8B8A8_UNORM, B8G8R8A8, true, 0x8888),131LIMA_PIXEL_FORMAT(B8G8R8A8_UNORM, B8G8R8A8, false, 0x8888),132LIMA_PIXEL_FORMAT(R8G8B8A8_SRGB, B8G8R8A8, true, 0x8888),133LIMA_PIXEL_FORMAT(B8G8R8A8_SRGB, B8G8R8A8, false, 0x8888),134LIMA_PIXEL_FORMAT(R8G8B8X8_UNORM, B8G8R8A8, true, 0x8888),135LIMA_PIXEL_FORMAT(B8G8R8X8_UNORM, B8G8R8A8, false, 0x8888),136LIMA_PIXEL_FORMAT(B5G6R5_UNORM, B5G6R5, false, 0x8565),137LIMA_PIXEL_FORMAT(B5G5R5A1_UNORM, B5G5R5A1, false, 0x8565),138LIMA_PIXEL_FORMAT(B4G4R4A4_UNORM, B4G4R4A4, false, 0x8444),139LIMA_PIXEL_FORMAT(R8_UNORM, B8, true, 0x8888),140LIMA_PIXEL_FORMAT(R8G8_UNORM, G8B8, true, 0x8888),141LIMA_PIXEL_FORMAT(Z16_UNORM, Z16, false, 0x0000),142LIMA_PIXEL_FORMAT(Z24_UNORM_S8_UINT, Z24S8, false, 0x0000),143LIMA_PIXEL_FORMAT(Z24X8_UNORM, Z24S8, false, 0x0000),144LIMA_PIXEL_FORMAT(R16G16B16A16_FLOAT, B16G16R16A16_FLOAT, true, 0x0000),145LIMA_PIXEL_FORMAT(R16_FLOAT, B16_FLOAT, true, 0x0000),146LIMA_PIXEL_FORMAT(R16G16_FLOAT, G16B16_FLOAT, true, 0x0000),147};148149static const struct lima_format *150get_texel_format(enum pipe_format f)151{152if (f >= ARRAY_SIZE(lima_texel_formats) ||153!lima_texel_formats[f].present)154return NULL;155156return lima_texel_formats + f;157}158159static const struct lima_format *160get_pixel_format(enum pipe_format f)161{162if (f >= ARRAY_SIZE(lima_pixel_formats) ||163!lima_pixel_formats[f].present)164return NULL;165166return lima_pixel_formats + f;167}168169bool170lima_format_texel_supported(enum pipe_format f)171{172const struct lima_format *lf = get_texel_format(f);173174if (!lf)175return false;176177return true;178}179180bool181lima_format_pixel_supported(enum pipe_format f)182{183const struct lima_format *lf = get_pixel_format(f);184185if (!lf)186return false;187188return true;189}190191int192lima_format_get_texel(enum pipe_format f)193{194return lima_texel_formats[f].format;195}196197int198lima_format_get_texel_reload(enum pipe_format f)199{200switch (f) {201case PIPE_FORMAT_Z24_UNORM_S8_UINT:202case PIPE_FORMAT_Z24X8_UNORM:203return LIMA_TEXEL_FORMAT_Z24S8_RLD;204default:205return lima_format_get_texel(f);206}207}208209int210lima_format_get_pixel(enum pipe_format f)211{212return lima_pixel_formats[f].format;213}214215bool216lima_format_get_texel_swap_rb(enum pipe_format f)217{218return lima_texel_formats[f].swap_r_b;219}220221bool222lima_format_get_pixel_swap_rb(enum pipe_format f)223{224return lima_pixel_formats[f].swap_r_b;225}226227const uint8_t *228lima_format_get_texel_swizzle(enum pipe_format f)229{230return lima_texel_formats[f].swizzle;231}232233uint32_t234lima_format_get_channel_layout(enum pipe_format f)235{236return lima_pixel_formats[f].channel_layout;237}238239240