lima: move format handling to unified place
authorQiang Yu <yuq825@gmail.com>
Sat, 17 Aug 2019 08:40:49 +0000 (16:40 +0800)
committerQiang Yu <yuq825@gmail.com>
Sun, 25 Aug 2019 03:52:29 +0000 (11:52 +0800)
Create a unified table to handle pipe format to texture
and render target format lookup.

Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
src/gallium/drivers/lima/Android.mk
src/gallium/drivers/lima/lima_draw.c
src/gallium/drivers/lima/lima_format.c [new file with mode: 0644]
src/gallium/drivers/lima/lima_format.h [new file with mode: 0644]
src/gallium/drivers/lima/lima_screen.c
src/gallium/drivers/lima/lima_texture.c
src/gallium/drivers/lima/lima_texture.h
src/gallium/drivers/lima/meson.build

index 10aba8dd3e2e0c29d14eabb4b673ae3b6cb6ba6e..c09789ec02219eaaa466cae5b36e8dec98077781 100644 (file)
@@ -68,7 +68,9 @@ LOCAL_SRC_FILES := \
        lima_texture.c \
        lima_texture.h \
        lima_util.c \
-       lima_util.h
+       lima_util.h \
+       lima_format.c \
+       lima_format.h
 
 LOCAL_MODULE := libmesa_pipe_lima
 
index 87eeb0e795ba641171d8ba99d64dca392d524c55..33b01212f4388b1dd5d3b3b79630dd6757bfeae5 100644 (file)
@@ -44,6 +44,7 @@
 #include "lima_texture.h"
 #include "lima_util.h"
 #include "lima_fence.h"
+#include "lima_format.h"
 
 #include <drm-uapi/lima_drm.h>
 
@@ -116,9 +117,6 @@ struct lima_render_state {
    uint32_t varyings_address;
 };
 
-#define LIMA_PIXEL_FORMAT_B8G8R8A8     0x03
-#define LIMA_PIXEL_FORMAT_Z16          0x0e
-#define LIMA_PIXEL_FORMAT_Z24S8        0x0f
 
 /* plbu commands */
 #define PLBU_CMD_BEGIN(max) { \
@@ -1444,20 +1442,7 @@ lima_pack_wb_zsbuf_reg(struct lima_context *ctx, uint32_t *wb_reg, int wb_idx)
    struct lima_context_framebuffer *fb = &ctx->framebuffer;
    struct lima_resource *res = lima_resource(fb->base.zsbuf->texture);
    int level = fb->base.zsbuf->u.tex.level;
-
-   uint32_t format;
-
-   switch (fb->base.zsbuf->format) {
-   case PIPE_FORMAT_Z16_UNORM:
-      format = LIMA_PIXEL_FORMAT_Z16;
-      break;
-   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
-   case PIPE_FORMAT_Z24X8_UNORM:
-   default:
-      /* Assume Z24S8 */
-      format = LIMA_PIXEL_FORMAT_Z24S8;
-      break;
-   }
+   uint32_t format = lima_format_get_pixel(fb->base.zsbuf->format);
 
    struct lima_pp_wb_reg *wb = (void *)wb_reg;
    wb[wb_idx].type = 0x01; /* 1 for depth, stencil */
@@ -1479,21 +1464,13 @@ lima_pack_wb_cbuf_reg(struct lima_context *ctx, uint32_t *wb_reg, int wb_idx)
    struct lima_context_framebuffer *fb = &ctx->framebuffer;
    struct lima_resource *res = lima_resource(fb->base.cbufs[0]->texture);
    int level = fb->base.cbufs[0]->u.tex.level;
-
-   bool swap_channels = false;
-   switch (fb->base.cbufs[0]->format) {
-   case PIPE_FORMAT_R8G8B8A8_UNORM:
-   case PIPE_FORMAT_R8G8B8X8_UNORM:
-      swap_channels = true;
-      break;
-   default:
-      break;
-   }
+   uint32_t format = lima_format_get_pixel(fb->base.cbufs[0]->format);
+   bool swap_channels = lima_format_get_swap_rb(fb->base.cbufs[0]->format);
 
    struct lima_pp_wb_reg *wb = (void *)wb_reg;
    wb[wb_idx].type = 0x02; /* 2 for color buffer */
    wb[wb_idx].address = res->bo->va + res->levels[level].offset;
-   wb[wb_idx].pixel_format = LIMA_PIXEL_FORMAT_B8G8R8A8;
+   wb[wb_idx].pixel_format = format;
    if (res->tiled) {
       wb[wb_idx].pixel_layout = 0x2;
       wb[wb_idx].pitch = fb->tiled_w;
diff --git a/src/gallium/drivers/lima/lima_format.c b/src/gallium/drivers/lima/lima_format.c
new file mode 100644 (file)
index 0000000..a599ee6
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2011-2013 Luc Verhaegen <libv@skynet.be>
+ * Copyright (c) 2018-2019 Lima Project
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <stdlib.h>
+
+#include <util/macros.h>
+
+#include "lima_format.h"
+
+#define LIMA_TEXEL_FORMAT_L8           0x09
+#define LIMA_TEXEL_FORMAT_A8           0x0a
+#define LIMA_TEXEL_FORMAT_I8           0x0b
+#define LIMA_TEXEL_FORMAT_BGR_565      0x0e
+#define LIMA_TEXEL_FORMAT_L8A8         0x11
+#define LIMA_TEXEL_FORMAT_L16          0x12
+#define LIMA_TEXEL_FORMAT_A16          0x13
+#define LIMA_TEXEL_FORMAT_I16          0x14
+#define LIMA_TEXEL_FORMAT_RGB_888      0x15
+#define LIMA_TEXEL_FORMAT_RGBA_8888    0x16
+#define LIMA_TEXEL_FORMAT_RGBX_8888    0x17
+#define LIMA_TEXEL_FORMAT_Z24S8        0x2c
+#define LIMA_TEXEL_FORMAT_NONE         -1
+
+#define LIMA_PIXEL_FORMAT_B5G6R5       0x00
+#define LIMA_PIXEL_FORMAT_B8G8R8A8     0x03
+#define LIMA_PIXEL_FORMAT_Z16          0x0e
+#define LIMA_PIXEL_FORMAT_Z24S8        0x0f
+#define LIMA_PIXEL_FORMAT_NONE         -1
+
+struct lima_format {
+   bool present;
+   int texel;
+   int pixel;
+   bool swap_r_b;
+};
+
+#define LIMA_FORMAT(pipe, tex, pix, swap)                \
+   [PIPE_FORMAT_##pipe] = {                              \
+      .present = true, .texel = LIMA_TEXEL_FORMAT_##tex, \
+      .pixel = LIMA_PIXEL_FORMAT_##pix, .swap_r_b = swap, \
+   }
+
+static const struct lima_format lima_format_table[] = {
+   LIMA_FORMAT(R8G8B8A8_UNORM,     RGBA_8888, B8G8R8A8, true),
+   LIMA_FORMAT(B8G8R8A8_UNORM,     RGBA_8888, B8G8R8A8, false),
+   LIMA_FORMAT(R8G8B8A8_SRGB,      RGBA_8888, B8G8R8A8, true),
+   LIMA_FORMAT(B8G8R8A8_SRGB,      RGBA_8888, B8G8R8A8, false),
+   LIMA_FORMAT(R8G8B8X8_UNORM,     RGBX_8888, B8G8R8A8, true),
+   LIMA_FORMAT(B8G8R8X8_UNORM,     RGBX_8888, B8G8R8A8, false),
+   LIMA_FORMAT(R8G8B8_UNORM,       RGB_888,   NONE,     true),
+   LIMA_FORMAT(B5G6R5_UNORM,       BGR_565,   B5G6R5,   false),
+   LIMA_FORMAT(Z24_UNORM_S8_UINT,  Z24S8,     Z24S8,    false),
+   LIMA_FORMAT(Z24X8_UNORM,        Z24S8,     Z24S8,    false),
+   /* Blob uses L16 for Z16 */
+   LIMA_FORMAT(Z16_UNORM,          L16,       Z16,      false),
+   LIMA_FORMAT(L16_UNORM,          L16,       NONE,     false),
+   LIMA_FORMAT(L8_UNORM,           L8,        NONE,     false),
+   LIMA_FORMAT(A16_UNORM,          A16,       NONE,     false),
+   LIMA_FORMAT(A8_UNORM,           A8,        NONE,     false),
+   LIMA_FORMAT(I16_UNORM,          I16,       NONE,     false),
+   LIMA_FORMAT(I8_UNORM,           I8,        NONE,     false),
+   LIMA_FORMAT(L8A8_UNORM,         L8A8,      NONE,     false),
+};
+
+static const struct lima_format *
+get_format(enum pipe_format f)
+{
+   if (f >= ARRAY_SIZE(lima_format_table) ||
+       !lima_format_table[f].present)
+      return NULL;
+
+   return lima_format_table + f;
+}
+
+bool
+lima_format_texel_supported(enum pipe_format f)
+{
+   const struct lima_format *lf = get_format(f);
+
+   if (!lf)
+      return false;
+
+   return lf->texel != LIMA_TEXEL_FORMAT_NONE;
+}
+
+bool
+lima_format_pixel_supported(enum pipe_format f)
+{
+   const struct lima_format *lf = get_format(f);
+
+   if (!lf)
+      return false;
+
+   return lf->pixel != LIMA_PIXEL_FORMAT_NONE;
+}
+
+int
+lima_format_get_texel(enum pipe_format f)
+{
+   return lima_format_table[f].texel;
+}
+
+int
+lima_format_get_pixel(enum pipe_format f)
+{
+   return lima_format_table[f].pixel;
+}
+
+bool
+lima_format_get_swap_rb(enum pipe_format f)
+{
+   return lima_format_table[f].swap_r_b;
+}
diff --git a/src/gallium/drivers/lima/lima_format.h b/src/gallium/drivers/lima/lima_format.h
new file mode 100644 (file)
index 0000000..3caa099
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2018-2019 Lima Project
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+#ifndef H_LIMA_FORMAT
+#define H_LIMA_FORMAT
+
+#include <stdbool.h>
+
+#include <pipe/p_format.h>
+
+bool lima_format_texel_supported(enum pipe_format f);
+bool lima_format_pixel_supported(enum pipe_format f);
+int lima_format_get_texel(enum pipe_format f);
+int lima_format_get_pixel(enum pipe_format f);
+bool lima_format_get_swap_rb(enum pipe_format f);
+
+#endif
index 13b5599c1a867cfed27878dc78e29046a5e9dbbe..5e6ac1ffb0817c9d225054a16661f166592b8968 100644 (file)
@@ -38,7 +38,7 @@
 #include "lima_program.h"
 #include "lima_bo.h"
 #include "lima_fence.h"
-#include "lima_texture.h"
+#include "lima_format.h"
 #include "ir/lima_ir.h"
 
 #include "xf86drm.h"
@@ -275,20 +275,9 @@ lima_screen_is_format_supported(struct pipe_screen *pscreen,
    if (sample_count > 1 && sample_count != 4)
       return false;
 
-   if (usage & PIPE_BIND_RENDER_TARGET) {
-      switch (format) {
-      case PIPE_FORMAT_B8G8R8A8_UNORM:
-      case PIPE_FORMAT_B8G8R8X8_UNORM:
-      case PIPE_FORMAT_R8G8B8A8_UNORM:
-      case PIPE_FORMAT_R8G8B8X8_UNORM:
-      case PIPE_FORMAT_Z16_UNORM:
-      case PIPE_FORMAT_Z24_UNORM_S8_UINT:
-      case PIPE_FORMAT_Z24X8_UNORM:
-         break;
-      default:
-         return false;
-      }
-   }
+   if (usage & PIPE_BIND_RENDER_TARGET &&
+       !lima_format_pixel_supported(format))
+      return false;
 
    if (usage & PIPE_BIND_DEPTH_STENCIL) {
       switch (format) {
@@ -322,7 +311,7 @@ lima_screen_is_format_supported(struct pipe_screen *pscreen,
    }
 
    if (usage & PIPE_BIND_SAMPLER_VIEW)
-      return lima_texel_format_supported(format);
+      return lima_format_texel_supported(format);
 
    return true;
 }
index 9fb6313cf5361a534e41ba75f844447ae40e9f9d..379bf387330984403bb58bf1f63c893996a089cc 100644 (file)
 #include "lima_resource.h"
 #include "lima_submit.h"
 #include "lima_util.h"
+#include "lima_format.h"
 
 #include <drm-uapi/lima_drm.h>
 
-#define LIMA_TEXEL_FORMAT_L8           0x09
-#define LIMA_TEXEL_FORMAT_A8           0x0a
-#define LIMA_TEXEL_FORMAT_I8           0x0b
-#define LIMA_TEXEL_FORMAT_BGR_565      0x0e
-#define LIMA_TEXEL_FORMAT_L8A8         0x11
-#define LIMA_TEXEL_FORMAT_L16          0x12
-#define LIMA_TEXEL_FORMAT_A16          0x13
-#define LIMA_TEXEL_FORMAT_I16          0x14
-#define LIMA_TEXEL_FORMAT_RGB_888      0x15
-#define LIMA_TEXEL_FORMAT_RGBA_8888    0x16
-#define LIMA_TEXEL_FORMAT_RGBX_8888    0x17
-#define LIMA_TEXEL_FORMAT_Z24S8        0x2c
 
 #define lima_tex_list_size 64
 
-typedef struct {
-   bool present;
-   uint32_t lima_format;
-   bool swap_r_b;
-} lima_format;
-
-#define LIMA_FORMAT(pipe, lima, swap) \
-        [PIPE_FORMAT_##pipe] = { .present = true, .lima_format = lima, \
-                                 .swap_r_b = swap }
-
-static const lima_format lima_format_table[] = {
-   LIMA_FORMAT(R8G8B8A8_UNORM, LIMA_TEXEL_FORMAT_RGBA_8888, true),
-   LIMA_FORMAT(B8G8R8A8_UNORM, LIMA_TEXEL_FORMAT_RGBA_8888, false),
-   LIMA_FORMAT(R8G8B8A8_SRGB, LIMA_TEXEL_FORMAT_RGBA_8888, true),
-   LIMA_FORMAT(B8G8R8A8_SRGB, LIMA_TEXEL_FORMAT_RGBA_8888, false),
-   LIMA_FORMAT(R8G8B8X8_UNORM, LIMA_TEXEL_FORMAT_RGBX_8888, true),
-   LIMA_FORMAT(B8G8R8X8_UNORM, LIMA_TEXEL_FORMAT_RGBX_8888, false),
-   LIMA_FORMAT(R8G8B8_UNORM, LIMA_TEXEL_FORMAT_RGB_888, true),
-   LIMA_FORMAT(B5G6R5_UNORM, LIMA_TEXEL_FORMAT_BGR_565, false),
-   LIMA_FORMAT(Z24_UNORM_S8_UINT, LIMA_TEXEL_FORMAT_Z24S8, false),
-   LIMA_FORMAT(Z24X8_UNORM, LIMA_TEXEL_FORMAT_Z24S8, false),
-   /* Blob uses L16 for Z16 */
-   LIMA_FORMAT(Z16_UNORM, LIMA_TEXEL_FORMAT_L16, false),
-   LIMA_FORMAT(L16_UNORM, LIMA_TEXEL_FORMAT_L16, false),
-   LIMA_FORMAT(L8_UNORM, LIMA_TEXEL_FORMAT_L8, false),
-   LIMA_FORMAT(A16_UNORM, LIMA_TEXEL_FORMAT_A16, false),
-   LIMA_FORMAT(A8_UNORM, LIMA_TEXEL_FORMAT_A8, false),
-   LIMA_FORMAT(I16_UNORM, LIMA_TEXEL_FORMAT_I16, false),
-   LIMA_FORMAT(I8_UNORM, LIMA_TEXEL_FORMAT_I8, false),
-   LIMA_FORMAT(L8A8_UNORM, LIMA_TEXEL_FORMAT_L8A8, false),
-};
-
 static_assert(offsetof(lima_tex_desc, va) == 24, "lima_tex_desc->va offset isn't 24");
 
-bool
-lima_texel_format_supported(enum pipe_format pformat)
-{
-   if (pformat >= ARRAY_SIZE(lima_format_table))
-      return false;
-
-   return lima_format_table[pformat].present;
-}
 
 static void
 lima_texture_desc_set_va(lima_tex_desc *desc,
@@ -129,11 +78,8 @@ lima_texture_desc_set_res(struct lima_context *ctx, lima_tex_desc *desc,
       height = u_minify(height, first_level);
    }
 
-   assert(prsc->format < ARRAY_SIZE(lima_format_table));
-   assert(lima_format_table[prsc->format].present);
-
-   desc->format = lima_format_table[prsc->format].lima_format;
-   desc->swap_r_b = lima_format_table[prsc->format].swap_r_b;
+   desc->format = lima_format_get_texel(prsc->format);
+   desc->swap_r_b = lima_format_get_swap_rb(prsc->format);
    desc->width  = width;
    desc->height = height;
    desc->unknown_3_1 = 1;
index d91c8bb00c8a2f03216c42fa604b7e0b13695592..c1bc34f874087967454802632a2aacb797aa423d 100644 (file)
@@ -92,6 +92,5 @@ void lima_texture_desc_set_res(struct lima_context *ctx, lima_tex_desc *desc,
                                struct pipe_resource *prsc,
                                unsigned first_level, unsigned last_level);
 void lima_update_textures(struct lima_context *ctx);
-bool lima_texel_format_supported(enum pipe_format pformat);
 
 #endif
index 0d8f2f87c29e0234d9de3081b80731c632cb1edf..9f5edb0ebfb543eb747c1246360ff3c5218f3095 100644 (file)
@@ -69,6 +69,8 @@ files_lima = files(
   'lima_texture.h',
   'lima_fence.c',
   'lima_fence.h',
+  'lima_format.h',
+  'lima_format.c',
 )
 
 lima_nir_algebraic_c = custom_target(