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
#include "lima_texture.h"
#include "lima_util.h"
#include "lima_fence.h"
+#include "lima_format.h"
#include <drm-uapi/lima_drm.h>
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) { \
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 */
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;
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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
#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"
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) {
}
if (usage & PIPE_BIND_SAMPLER_VIEW)
- return lima_texel_format_supported(format);
+ return lima_format_texel_supported(format);
return true;
}
#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,
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;
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
'lima_texture.h',
'lima_fence.c',
'lima_fence.h',
+ 'lima_format.h',
+ 'lima_format.c',
)
lima_nir_algebraic_c = custom_target(