1451 lines
57 KiB
Diff
1451 lines
57 KiB
Diff
From de31fe81a869c80b3cc08cb648640cf617e0d09c Mon Sep 17 00:00:00 2001
|
|
From: Eric Anholt <eric@anholt.net>
|
|
Date: Thu, 15 Jun 2017 16:52:22 -0700
|
|
Subject: [PATCH] vc4: Switch back to using a local copy of vc4_drm.h.
|
|
|
|
Needing to get our uapi header from libdrm has only complicated things.
|
|
Follow intel's lead and drop our requirement for it.
|
|
|
|
Generated from 056f4f02abb7e9e4a0cf0cda0211586df5e43842 of drm-misc-next
|
|
|
|
(cherry picked from commit 1facea3486e3dd4e4a6cf561a725b9c4312ca58a)
|
|
---
|
|
configure.ac | 2 -
|
|
src/gallium/drivers/vc4/Makefile.am | 3 +-
|
|
src/gallium/drivers/vc4/Makefile.sources | 1 +
|
|
src/gallium/drivers/vc4/drm_fourcc.h | 379 +++++++++++++++++++++++++++++++
|
|
src/gallium/drivers/vc4/vc4_drm.h | 318 ++++++++++++++++++++++++++
|
|
5 files changed, 699 insertions(+), 4 deletions(-)
|
|
create mode 100644 src/gallium/drivers/vc4/drm_fourcc.h
|
|
create mode 100644 src/gallium/drivers/vc4/vc4_drm.h
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index b069f54155..81258715b5 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -79,7 +79,6 @@ LIBDRM_INTEL_REQUIRED=2.4.75
|
|
LIBDRM_NVVIEUX_REQUIRED=2.4.66
|
|
LIBDRM_NOUVEAU_REQUIRED=2.4.66
|
|
LIBDRM_FREEDRENO_REQUIRED=2.4.74
|
|
-LIBDRM_VC4_REQUIRED=2.4.69
|
|
LIBDRM_ETNAVIV_REQUIRED=2.4.80
|
|
|
|
dnl Versions for external dependencies
|
|
@@ -2495,7 +2494,6 @@ if test -n "$with_gallium_drivers"; then
|
|
;;
|
|
xvc4)
|
|
HAVE_GALLIUM_VC4=yes
|
|
- PKG_CHECK_MODULES([VC4], [libdrm >= $LIBDRM_VC4_REQUIRED libdrm_vc4 >= $LIBDRM_VC4_REQUIRED])
|
|
require_libdrm "vc4"
|
|
|
|
PKG_CHECK_MODULES([SIMPENROSE], [simpenrose],
|
|
diff --git a/src/gallium/drivers/vc4/Makefile.am b/src/gallium/drivers/vc4/Makefile.am
|
|
index b361a0c588..f6b87b2261 100644
|
|
--- a/src/gallium/drivers/vc4/Makefile.am
|
|
+++ b/src/gallium/drivers/vc4/Makefile.am
|
|
@@ -29,7 +29,6 @@ endif
|
|
AM_CFLAGS = \
|
|
-I$(top_builddir)/src/compiler/nir \
|
|
$(LIBDRM_CFLAGS) \
|
|
- $(VC4_CFLAGS) \
|
|
$(GALLIUM_DRIVER_CFLAGS) \
|
|
$(SIM_CFLAGS) \
|
|
$(VALGRIND_CFLAGS) \
|
|
@@ -38,7 +37,7 @@ AM_CFLAGS = \
|
|
noinst_LTLIBRARIES = libvc4.la
|
|
|
|
libvc4_la_SOURCES = $(C_SOURCES)
|
|
-libvc4_la_LIBADD = $(SIM_LIB) $(VC4_LIBS)
|
|
+libvc4_la_LIBADD = $(SIM_LIB)
|
|
libvc4_la_LDFLAGS = $(SIM_LDFLAGS)
|
|
|
|
noinst_LTLIBRARIES += libvc4_neon.la
|
|
diff --git a/src/gallium/drivers/vc4/Makefile.sources b/src/gallium/drivers/vc4/Makefile.sources
|
|
index 10de343612..cb04cc9c0a 100644
|
|
--- a/src/gallium/drivers/vc4/Makefile.sources
|
|
+++ b/src/gallium/drivers/vc4/Makefile.sources
|
|
@@ -14,6 +14,7 @@ C_SOURCES := \
|
|
vc4_context.c \
|
|
vc4_context.h \
|
|
vc4_draw.c \
|
|
+ vc4_drm.h \
|
|
vc4_emit.c \
|
|
vc4_fence.c \
|
|
vc4_formats.c \
|
|
diff --git a/src/gallium/drivers/vc4/drm_fourcc.h b/src/gallium/drivers/vc4/drm_fourcc.h
|
|
new file mode 100644
|
|
index 0000000000..7586c46f68
|
|
--- /dev/null
|
|
+++ b/src/gallium/drivers/vc4/drm_fourcc.h
|
|
@@ -0,0 +1,379 @@
|
|
+/*
|
|
+ * Copyright 2011 Intel Corporation
|
|
+ *
|
|
+ * 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, sublicense,
|
|
+ * 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
|
+ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS 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 DRM_FOURCC_H
|
|
+#define DRM_FOURCC_H
|
|
+
|
|
+#include "drm.h"
|
|
+
|
|
+#if defined(__cplusplus)
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+#define fourcc_code(a, b, c, d) ((__u32)(a) | ((__u32)(b) << 8) | \
|
|
+ ((__u32)(c) << 16) | ((__u32)(d) << 24))
|
|
+
|
|
+#define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
|
|
+
|
|
+/* color index */
|
|
+#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
|
|
+
|
|
+/* 8 bpp Red */
|
|
+#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
|
|
+
|
|
+/* 16 bpp Red */
|
|
+#define DRM_FORMAT_R16 fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
|
|
+
|
|
+/* 16 bpp RG */
|
|
+#define DRM_FORMAT_RG88 fourcc_code('R', 'G', '8', '8') /* [15:0] R:G 8:8 little endian */
|
|
+#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */
|
|
+
|
|
+/* 32 bpp RG */
|
|
+#define DRM_FORMAT_RG1616 fourcc_code('R', 'G', '3', '2') /* [31:0] R:G 16:16 little endian */
|
|
+#define DRM_FORMAT_GR1616 fourcc_code('G', 'R', '3', '2') /* [31:0] G:R 16:16 little endian */
|
|
+
|
|
+/* 8 bpp RGB */
|
|
+#define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
|
|
+#define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
|
|
+
|
|
+/* 16 bpp RGB */
|
|
+#define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
|
|
+#define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
|
|
+#define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
|
|
+#define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
|
|
+
|
|
+#define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
|
|
+#define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
|
|
+#define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
|
|
+#define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
|
|
+
|
|
+#define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
|
|
+#define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
|
|
+#define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
|
|
+#define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
|
|
+
|
|
+#define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
|
|
+#define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
|
|
+#define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
|
|
+#define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
|
|
+
|
|
+#define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
|
|
+#define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
|
|
+
|
|
+/* 24 bpp RGB */
|
|
+#define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
|
|
+#define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
|
|
+
|
|
+/* 32 bpp RGB */
|
|
+#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
|
|
+
|
|
+#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
|
|
+
|
|
+#define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
|
|
+#define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
|
|
+#define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
|
|
+#define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
|
|
+
|
|
+#define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
|
|
+#define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
|
|
+#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
|
|
+#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
|
|
+
|
|
+/* packed YCbCr */
|
|
+#define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
|
|
+#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
|
|
+
|
|
+#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
|
|
+
|
|
+/*
|
|
+ * 2 plane RGB + A
|
|
+ * index 0 = RGB plane, same format as the corresponding non _A8 format has
|
|
+ * index 1 = A plane, [7:0] A
|
|
+ */
|
|
+#define DRM_FORMAT_XRGB8888_A8 fourcc_code('X', 'R', 'A', '8')
|
|
+#define DRM_FORMAT_XBGR8888_A8 fourcc_code('X', 'B', 'A', '8')
|
|
+#define DRM_FORMAT_RGBX8888_A8 fourcc_code('R', 'X', 'A', '8')
|
|
+#define DRM_FORMAT_BGRX8888_A8 fourcc_code('B', 'X', 'A', '8')
|
|
+#define DRM_FORMAT_RGB888_A8 fourcc_code('R', '8', 'A', '8')
|
|
+#define DRM_FORMAT_BGR888_A8 fourcc_code('B', '8', 'A', '8')
|
|
+#define DRM_FORMAT_RGB565_A8 fourcc_code('R', '5', 'A', '8')
|
|
+#define DRM_FORMAT_BGR565_A8 fourcc_code('B', '5', 'A', '8')
|
|
+
|
|
+/*
|
|
+ * 2 plane YCbCr
|
|
+ * index 0 = Y plane, [7:0] Y
|
|
+ * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
|
|
+ * or
|
|
+ * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
|
|
+ */
|
|
+#define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
|
|
+#define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
|
|
+#define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
|
|
+#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
|
|
+#define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */
|
|
+#define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */
|
|
+
|
|
+/*
|
|
+ * 3 plane YCbCr
|
|
+ * index 0: Y plane, [7:0] Y
|
|
+ * index 1: Cb plane, [7:0] Cb
|
|
+ * index 2: Cr plane, [7:0] Cr
|
|
+ * or
|
|
+ * index 1: Cr plane, [7:0] Cr
|
|
+ * index 2: Cb plane, [7:0] Cb
|
|
+ */
|
|
+#define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
|
|
+#define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
|
|
+#define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
|
|
+#define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
|
|
+#define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
|
|
+#define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
|
|
+#define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
|
|
+#define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
|
|
+#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
|
|
+#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
|
|
+
|
|
+
|
|
+/*
|
|
+ * Format Modifiers:
|
|
+ *
|
|
+ * Format modifiers describe, typically, a re-ordering or modification
|
|
+ * of the data in a plane of an FB. This can be used to express tiled/
|
|
+ * swizzled formats, or compression, or a combination of the two.
|
|
+ *
|
|
+ * The upper 8 bits of the format modifier are a vendor-id as assigned
|
|
+ * below. The lower 56 bits are assigned as vendor sees fit.
|
|
+ */
|
|
+
|
|
+/* Vendor Ids: */
|
|
+#define DRM_FORMAT_MOD_NONE 0
|
|
+#define DRM_FORMAT_MOD_VENDOR_NONE 0
|
|
+#define DRM_FORMAT_MOD_VENDOR_INTEL 0x01
|
|
+#define DRM_FORMAT_MOD_VENDOR_AMD 0x02
|
|
+#define DRM_FORMAT_MOD_VENDOR_NV 0x03
|
|
+#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
|
|
+#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05
|
|
+#define DRM_FORMAT_MOD_VENDOR_VIVANTE 0x06
|
|
+#define DRM_FORMAT_MOD_VENDOR_BROADCOM 0x07
|
|
+/* add more to the end as needed */
|
|
+
|
|
+#define fourcc_mod_code(vendor, val) \
|
|
+ ((((__u64)DRM_FORMAT_MOD_VENDOR_## vendor) << 56) | (val & 0x00ffffffffffffffULL))
|
|
+
|
|
+/*
|
|
+ * Format Modifier tokens:
|
|
+ *
|
|
+ * When adding a new token please document the layout with a code comment,
|
|
+ * similar to the fourcc codes above. drm_fourcc.h is considered the
|
|
+ * authoritative source for all of these.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * Linear Layout
|
|
+ *
|
|
+ * Just plain linear layout. Note that this is different from no specifying any
|
|
+ * modifier (e.g. not setting DRM_MODE_FB_MODIFIERS in the DRM_ADDFB2 ioctl),
|
|
+ * which tells the driver to also take driver-internal information into account
|
|
+ * and so might actually result in a tiled framebuffer.
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_LINEAR fourcc_mod_code(NONE, 0)
|
|
+
|
|
+/* Intel framebuffer modifiers */
|
|
+
|
|
+/*
|
|
+ * Intel X-tiling layout
|
|
+ *
|
|
+ * This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
|
|
+ * in row-major layout. Within the tile bytes are laid out row-major, with
|
|
+ * a platform-dependent stride. On top of that the memory can apply
|
|
+ * platform-depending swizzling of some higher address bits into bit6.
|
|
+ *
|
|
+ * This format is highly platforms specific and not useful for cross-driver
|
|
+ * sharing. It exists since on a given platform it does uniquely identify the
|
|
+ * layout in a simple way for i915-specific userspace.
|
|
+ */
|
|
+#define I915_FORMAT_MOD_X_TILED fourcc_mod_code(INTEL, 1)
|
|
+
|
|
+/*
|
|
+ * Intel Y-tiling layout
|
|
+ *
|
|
+ * This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
|
|
+ * in row-major layout. Within the tile bytes are laid out in OWORD (16 bytes)
|
|
+ * chunks column-major, with a platform-dependent height. On top of that the
|
|
+ * memory can apply platform-depending swizzling of some higher address bits
|
|
+ * into bit6.
|
|
+ *
|
|
+ * This format is highly platforms specific and not useful for cross-driver
|
|
+ * sharing. It exists since on a given platform it does uniquely identify the
|
|
+ * layout in a simple way for i915-specific userspace.
|
|
+ */
|
|
+#define I915_FORMAT_MOD_Y_TILED fourcc_mod_code(INTEL, 2)
|
|
+
|
|
+/*
|
|
+ * Intel Yf-tiling layout
|
|
+ *
|
|
+ * This is a tiled layout using 4Kb tiles in row-major layout.
|
|
+ * Within the tile pixels are laid out in 16 256 byte units / sub-tiles which
|
|
+ * are arranged in four groups (two wide, two high) with column-major layout.
|
|
+ * Each group therefore consits out of four 256 byte units, which are also laid
|
|
+ * out as 2x2 column-major.
|
|
+ * 256 byte units are made out of four 64 byte blocks of pixels, producing
|
|
+ * either a square block or a 2:1 unit.
|
|
+ * 64 byte blocks of pixels contain four pixel rows of 16 bytes, where the width
|
|
+ * in pixel depends on the pixel depth.
|
|
+ */
|
|
+#define I915_FORMAT_MOD_Yf_TILED fourcc_mod_code(INTEL, 3)
|
|
+
|
|
+/*
|
|
+ * Tiled, NV12MT, grouped in 64 (pixels) x 32 (lines) -sized macroblocks
|
|
+ *
|
|
+ * Macroblocks are laid in a Z-shape, and each pixel data is following the
|
|
+ * standard NV12 style.
|
|
+ * As for NV12, an image is the result of two frame buffers: one for Y,
|
|
+ * one for the interleaved Cb/Cr components (1/2 the height of the Y buffer).
|
|
+ * Alignment requirements are (for each buffer):
|
|
+ * - multiple of 128 pixels for the width
|
|
+ * - multiple of 32 pixels for the height
|
|
+ *
|
|
+ * For more information: see https://linuxtv.org/downloads/v4l-dvb-apis/re32.html
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE fourcc_mod_code(SAMSUNG, 1)
|
|
+
|
|
+/* Vivante framebuffer modifiers */
|
|
+
|
|
+/*
|
|
+ * Vivante 4x4 tiling layout
|
|
+ *
|
|
+ * This is a simple tiled layout using tiles of 4x4 pixels in a row-major
|
|
+ * layout.
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_VIVANTE_TILED fourcc_mod_code(VIVANTE, 1)
|
|
+
|
|
+/*
|
|
+ * Vivante 64x64 super-tiling layout
|
|
+ *
|
|
+ * This is a tiled layout using 64x64 pixel super-tiles, where each super-tile
|
|
+ * contains 8x4 groups of 2x4 tiles of 4x4 pixels (like above) each, all in row-
|
|
+ * major layout.
|
|
+ *
|
|
+ * For more information: see
|
|
+ * https://github.com/etnaviv/etna_viv/blob/master/doc/hardware.md#texture-tiling
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_VIVANTE_SUPER_TILED fourcc_mod_code(VIVANTE, 2)
|
|
+
|
|
+/*
|
|
+ * Vivante 4x4 tiling layout for dual-pipe
|
|
+ *
|
|
+ * Same as the 4x4 tiling layout, except every second 4x4 pixel tile starts at a
|
|
+ * different base address. Offsets from the base addresses are therefore halved
|
|
+ * compared to the non-split tiled layout.
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED fourcc_mod_code(VIVANTE, 3)
|
|
+
|
|
+/*
|
|
+ * Vivante 64x64 super-tiling layout for dual-pipe
|
|
+ *
|
|
+ * Same as the 64x64 super-tiling layout, except every second 4x4 pixel tile
|
|
+ * starts at a different base address. Offsets from the base addresses are
|
|
+ * therefore halved compared to the non-split super-tiled layout.
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED fourcc_mod_code(VIVANTE, 4)
|
|
+
|
|
+/* NVIDIA Tegra frame buffer modifiers */
|
|
+
|
|
+/*
|
|
+ * Some modifiers take parameters, for example the number of vertical GOBs in
|
|
+ * a block. Reserve the lower 32 bits for parameters
|
|
+ */
|
|
+#define __fourcc_mod_tegra_mode_shift 32
|
|
+#define fourcc_mod_tegra_code(val, params) \
|
|
+ fourcc_mod_code(NV, ((((__u64)val) << __fourcc_mod_tegra_mode_shift) | params))
|
|
+#define fourcc_mod_tegra_mod(m) \
|
|
+ (m & ~((1ULL << __fourcc_mod_tegra_mode_shift) - 1))
|
|
+#define fourcc_mod_tegra_param(m) \
|
|
+ (m & ((1ULL << __fourcc_mod_tegra_mode_shift) - 1))
|
|
+
|
|
+/*
|
|
+ * Tegra Tiled Layout, used by Tegra 2, 3 and 4.
|
|
+ *
|
|
+ * Pixels are arranged in simple tiles of 16 x 16 bytes.
|
|
+ */
|
|
+#define NV_FORMAT_MOD_TEGRA_TILED fourcc_mod_tegra_code(1, 0)
|
|
+
|
|
+/*
|
|
+ * Tegra 16Bx2 Block Linear layout, used by TK1/TX1
|
|
+ *
|
|
+ * Pixels are arranged in 64x8 Groups Of Bytes (GOBs). GOBs are then stacked
|
|
+ * vertically by a power of 2 (1 to 32 GOBs) to form a block.
|
|
+ *
|
|
+ * Within a GOB, data is ordered as 16B x 2 lines sectors laid in Z-shape.
|
|
+ *
|
|
+ * Parameter 'v' is the log2 encoding of the number of GOBs stacked vertically.
|
|
+ * Valid values are:
|
|
+ *
|
|
+ * 0 == ONE_GOB
|
|
+ * 1 == TWO_GOBS
|
|
+ * 2 == FOUR_GOBS
|
|
+ * 3 == EIGHT_GOBS
|
|
+ * 4 == SIXTEEN_GOBS
|
|
+ * 5 == THIRTYTWO_GOBS
|
|
+ *
|
|
+ * Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format
|
|
+ * in full detail.
|
|
+ */
|
|
+#define NV_FORMAT_MOD_TEGRA_16BX2_BLOCK(v) fourcc_mod_tegra_code(2, v)
|
|
+
|
|
+/*
|
|
+ * Broadcom VC4 "T" format
|
|
+ *
|
|
+ * This is the primary layout that the V3D GPU can texture from (it
|
|
+ * can't do linear). The T format has:
|
|
+ *
|
|
+ * - 64b utiles of pixels in a raster-order grid according to cpp. It's 4x4
|
|
+ * pixels at 32 bit depth.
|
|
+ *
|
|
+ * - 1k subtiles made of a 4x4 raster-order grid of 64b utiles (so usually
|
|
+ * 16x16 pixels).
|
|
+ *
|
|
+ * - 4k tiles made of a 2x2 grid of 1k subtiles (so usually 32x32 pixels). On
|
|
+ * even 4k tile rows, they're arranged as (BL, TL, TR, BR), and on odd rows
|
|
+ * they're (TR, BR, BL, TL), where bottom left is start of memory.
|
|
+ *
|
|
+ * - an image made of 4k tiles in rows either left-to-right (even rows of 4k
|
|
+ * tiles) or right-to-left (odd rows of 4k tiles).
|
|
+ */
|
|
+#define DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED fourcc_mod_code(BROADCOM, 1)
|
|
+
|
|
+#if defined(__cplusplus)
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif /* DRM_FOURCC_H */
|
|
diff --git a/src/gallium/drivers/vc4/vc4_drm.h b/src/gallium/drivers/vc4/vc4_drm.h
|
|
new file mode 100644
|
|
index 0000000000..0caeaf3a1f
|
|
--- /dev/null
|
|
+++ b/src/gallium/drivers/vc4/vc4_drm.h
|
|
@@ -0,0 +1,318 @@
|
|
+/*
|
|
+ * Copyright © 2014-2015 Broadcom
|
|
+ *
|
|
+ * 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, sublicense,
|
|
+ * 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 NONINFRINGEMENT. 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 _VC4_DRM_H_
|
|
+#define _VC4_DRM_H_
|
|
+
|
|
+#include "drm.h"
|
|
+
|
|
+#if defined(__cplusplus)
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+#define DRM_VC4_SUBMIT_CL 0x00
|
|
+#define DRM_VC4_WAIT_SEQNO 0x01
|
|
+#define DRM_VC4_WAIT_BO 0x02
|
|
+#define DRM_VC4_CREATE_BO 0x03
|
|
+#define DRM_VC4_MMAP_BO 0x04
|
|
+#define DRM_VC4_CREATE_SHADER_BO 0x05
|
|
+#define DRM_VC4_GET_HANG_STATE 0x06
|
|
+#define DRM_VC4_GET_PARAM 0x07
|
|
+#define DRM_VC4_SET_TILING 0x08
|
|
+#define DRM_VC4_GET_TILING 0x09
|
|
+
|
|
+#define DRM_IOCTL_VC4_SUBMIT_CL DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SUBMIT_CL, struct drm_vc4_submit_cl)
|
|
+#define DRM_IOCTL_VC4_WAIT_SEQNO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_WAIT_SEQNO, struct drm_vc4_wait_seqno)
|
|
+#define DRM_IOCTL_VC4_WAIT_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_WAIT_BO, struct drm_vc4_wait_bo)
|
|
+#define DRM_IOCTL_VC4_CREATE_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_BO, struct drm_vc4_create_bo)
|
|
+#define DRM_IOCTL_VC4_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_MMAP_BO, struct drm_vc4_mmap_bo)
|
|
+#define DRM_IOCTL_VC4_CREATE_SHADER_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_SHADER_BO, struct drm_vc4_create_shader_bo)
|
|
+#define DRM_IOCTL_VC4_GET_HANG_STATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_HANG_STATE, struct drm_vc4_get_hang_state)
|
|
+#define DRM_IOCTL_VC4_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_PARAM, struct drm_vc4_get_param)
|
|
+#define DRM_IOCTL_VC4_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SET_TILING, struct drm_vc4_set_tiling)
|
|
+#define DRM_IOCTL_VC4_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_TILING, struct drm_vc4_get_tiling)
|
|
+
|
|
+struct drm_vc4_submit_rcl_surface {
|
|
+ __u32 hindex; /* Handle index, or ~0 if not present. */
|
|
+ __u32 offset; /* Offset to start of buffer. */
|
|
+ /*
|
|
+ * Bits for either render config (color_write) or load/store packet.
|
|
+ * Bits should all be 0 for MSAA load/stores.
|
|
+ */
|
|
+ __u16 bits;
|
|
+
|
|
+#define VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES (1 << 0)
|
|
+ __u16 flags;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_submit_cl - ioctl argument for submitting commands to the 3D
|
|
+ * engine.
|
|
+ *
|
|
+ * Drivers typically use GPU BOs to store batchbuffers / command lists and
|
|
+ * their associated state. However, because the VC4 lacks an MMU, we have to
|
|
+ * do validation of memory accesses by the GPU commands. If we were to store
|
|
+ * our commands in BOs, we'd need to do uncached readback from them to do the
|
|
+ * validation process, which is too expensive. Instead, userspace accumulates
|
|
+ * commands and associated state in plain memory, then the kernel copies the
|
|
+ * data to its own address space, and then validates and stores it in a GPU
|
|
+ * BO.
|
|
+ */
|
|
+struct drm_vc4_submit_cl {
|
|
+ /* Pointer to the binner command list.
|
|
+ *
|
|
+ * This is the first set of commands executed, which runs the
|
|
+ * coordinate shader to determine where primitives land on the screen,
|
|
+ * then writes out the state updates and draw calls necessary per tile
|
|
+ * to the tile allocation BO.
|
|
+ */
|
|
+ __u64 bin_cl;
|
|
+
|
|
+ /* Pointer to the shader records.
|
|
+ *
|
|
+ * Shader records are the structures read by the hardware that contain
|
|
+ * pointers to uniforms, shaders, and vertex attributes. The
|
|
+ * reference to the shader record has enough information to determine
|
|
+ * how many pointers are necessary (fixed number for shaders/uniforms,
|
|
+ * and an attribute count), so those BO indices into bo_handles are
|
|
+ * just stored as __u32s before each shader record passed in.
|
|
+ */
|
|
+ __u64 shader_rec;
|
|
+
|
|
+ /* Pointer to uniform data and texture handles for the textures
|
|
+ * referenced by the shader.
|
|
+ *
|
|
+ * For each shader state record, there is a set of uniform data in the
|
|
+ * order referenced by the record (FS, VS, then CS). Each set of
|
|
+ * uniform data has a __u32 index into bo_handles per texture
|
|
+ * sample operation, in the order the QPU_W_TMUn_S writes appear in
|
|
+ * the program. Following the texture BO handle indices is the actual
|
|
+ * uniform data.
|
|
+ *
|
|
+ * The individual uniform state blocks don't have sizes passed in,
|
|
+ * because the kernel has to determine the sizes anyway during shader
|
|
+ * code validation.
|
|
+ */
|
|
+ __u64 uniforms;
|
|
+ __u64 bo_handles;
|
|
+
|
|
+ /* Size in bytes of the binner command list. */
|
|
+ __u32 bin_cl_size;
|
|
+ /* Size in bytes of the set of shader records. */
|
|
+ __u32 shader_rec_size;
|
|
+ /* Number of shader records.
|
|
+ *
|
|
+ * This could just be computed from the contents of shader_records and
|
|
+ * the address bits of references to them from the bin CL, but it
|
|
+ * keeps the kernel from having to resize some allocations it makes.
|
|
+ */
|
|
+ __u32 shader_rec_count;
|
|
+ /* Size in bytes of the uniform state. */
|
|
+ __u32 uniforms_size;
|
|
+
|
|
+ /* Number of BO handles passed in (size is that times 4). */
|
|
+ __u32 bo_handle_count;
|
|
+
|
|
+ /* RCL setup: */
|
|
+ __u16 width;
|
|
+ __u16 height;
|
|
+ __u8 min_x_tile;
|
|
+ __u8 min_y_tile;
|
|
+ __u8 max_x_tile;
|
|
+ __u8 max_y_tile;
|
|
+ struct drm_vc4_submit_rcl_surface color_read;
|
|
+ struct drm_vc4_submit_rcl_surface color_write;
|
|
+ struct drm_vc4_submit_rcl_surface zs_read;
|
|
+ struct drm_vc4_submit_rcl_surface zs_write;
|
|
+ struct drm_vc4_submit_rcl_surface msaa_color_write;
|
|
+ struct drm_vc4_submit_rcl_surface msaa_zs_write;
|
|
+ __u32 clear_color[2];
|
|
+ __u32 clear_z;
|
|
+ __u8 clear_s;
|
|
+
|
|
+ __u32 pad:24;
|
|
+
|
|
+#define VC4_SUBMIT_CL_USE_CLEAR_COLOR (1 << 0)
|
|
+ __u32 flags;
|
|
+
|
|
+ /* Returned value of the seqno of this render job (for the
|
|
+ * wait ioctl).
|
|
+ */
|
|
+ __u64 seqno;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_wait_seqno - ioctl argument for waiting for
|
|
+ * DRM_VC4_SUBMIT_CL completion using its returned seqno.
|
|
+ *
|
|
+ * timeout_ns is the timeout in nanoseconds, where "0" means "don't
|
|
+ * block, just return the status."
|
|
+ */
|
|
+struct drm_vc4_wait_seqno {
|
|
+ __u64 seqno;
|
|
+ __u64 timeout_ns;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_wait_bo - ioctl argument for waiting for
|
|
+ * completion of the last DRM_VC4_SUBMIT_CL on a BO.
|
|
+ *
|
|
+ * This is useful for cases where multiple processes might be
|
|
+ * rendering to a BO and you want to wait for all rendering to be
|
|
+ * completed.
|
|
+ */
|
|
+struct drm_vc4_wait_bo {
|
|
+ __u32 handle;
|
|
+ __u32 pad;
|
|
+ __u64 timeout_ns;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_create_bo - ioctl argument for creating VC4 BOs.
|
|
+ *
|
|
+ * There are currently no values for the flags argument, but it may be
|
|
+ * used in a future extension.
|
|
+ */
|
|
+struct drm_vc4_create_bo {
|
|
+ __u32 size;
|
|
+ __u32 flags;
|
|
+ /** Returned GEM handle for the BO. */
|
|
+ __u32 handle;
|
|
+ __u32 pad;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_mmap_bo - ioctl argument for mapping VC4 BOs.
|
|
+ *
|
|
+ * This doesn't actually perform an mmap. Instead, it returns the
|
|
+ * offset you need to use in an mmap on the DRM device node. This
|
|
+ * means that tools like valgrind end up knowing about the mapped
|
|
+ * memory.
|
|
+ *
|
|
+ * There are currently no values for the flags argument, but it may be
|
|
+ * used in a future extension.
|
|
+ */
|
|
+struct drm_vc4_mmap_bo {
|
|
+ /** Handle for the object being mapped. */
|
|
+ __u32 handle;
|
|
+ __u32 flags;
|
|
+ /** offset into the drm node to use for subsequent mmap call. */
|
|
+ __u64 offset;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_create_shader_bo - ioctl argument for creating VC4
|
|
+ * shader BOs.
|
|
+ *
|
|
+ * Since allowing a shader to be overwritten while it's also being
|
|
+ * executed from would allow privlege escalation, shaders must be
|
|
+ * created using this ioctl, and they can't be mmapped later.
|
|
+ */
|
|
+struct drm_vc4_create_shader_bo {
|
|
+ /* Size of the data argument. */
|
|
+ __u32 size;
|
|
+ /* Flags, currently must be 0. */
|
|
+ __u32 flags;
|
|
+
|
|
+ /* Pointer to the data. */
|
|
+ __u64 data;
|
|
+
|
|
+ /** Returned GEM handle for the BO. */
|
|
+ __u32 handle;
|
|
+ /* Pad, must be 0. */
|
|
+ __u32 pad;
|
|
+};
|
|
+
|
|
+struct drm_vc4_get_hang_state_bo {
|
|
+ __u32 handle;
|
|
+ __u32 paddr;
|
|
+ __u32 size;
|
|
+ __u32 pad;
|
|
+};
|
|
+
|
|
+/**
|
|
+ * struct drm_vc4_hang_state - ioctl argument for collecting state
|
|
+ * from a GPU hang for analysis.
|
|
+*/
|
|
+struct drm_vc4_get_hang_state {
|
|
+ /** Pointer to array of struct drm_vc4_get_hang_state_bo. */
|
|
+ __u64 bo;
|
|
+ /**
|
|
+ * On input, the size of the bo array. Output is the number
|
|
+ * of bos to be returned.
|
|
+ */
|
|
+ __u32 bo_count;
|
|
+
|
|
+ __u32 start_bin, start_render;
|
|
+
|
|
+ __u32 ct0ca, ct0ea;
|
|
+ __u32 ct1ca, ct1ea;
|
|
+ __u32 ct0cs, ct1cs;
|
|
+ __u32 ct0ra0, ct1ra0;
|
|
+
|
|
+ __u32 bpca, bpcs;
|
|
+ __u32 bpoa, bpos;
|
|
+
|
|
+ __u32 vpmbase;
|
|
+
|
|
+ __u32 dbge;
|
|
+ __u32 fdbgo;
|
|
+ __u32 fdbgb;
|
|
+ __u32 fdbgr;
|
|
+ __u32 fdbgs;
|
|
+ __u32 errstat;
|
|
+
|
|
+ /* Pad that we may save more registers into in the future. */
|
|
+ __u32 pad[16];
|
|
+};
|
|
+
|
|
+#define DRM_VC4_PARAM_V3D_IDENT0 0
|
|
+#define DRM_VC4_PARAM_V3D_IDENT1 1
|
|
+#define DRM_VC4_PARAM_V3D_IDENT2 2
|
|
+#define DRM_VC4_PARAM_SUPPORTS_BRANCHES 3
|
|
+#define DRM_VC4_PARAM_SUPPORTS_ETC1 4
|
|
+#define DRM_VC4_PARAM_SUPPORTS_THREADED_FS 5
|
|
+
|
|
+struct drm_vc4_get_param {
|
|
+ __u32 param;
|
|
+ __u32 pad;
|
|
+ __u64 value;
|
|
+};
|
|
+
|
|
+struct drm_vc4_get_tiling {
|
|
+ __u32 handle;
|
|
+ __u32 flags;
|
|
+ __u64 modifier;
|
|
+};
|
|
+
|
|
+struct drm_vc4_set_tiling {
|
|
+ __u32 handle;
|
|
+ __u32 flags;
|
|
+ __u64 modifier;
|
|
+};
|
|
+
|
|
+#if defined(__cplusplus)
|
|
+}
|
|
+#endif
|
|
+
|
|
+#endif /* _VC4_DRM_H_ */
|
|
From 0670340bc6730e3de453e064b8a883a829900945 Mon Sep 17 00:00:00 2001
|
|
From: Eric Anholt <eric@anholt.net>
|
|
Date: Mon, 8 May 2017 16:43:06 -0700
|
|
Subject: [PATCH] vc4: Drop the u_resource_vtbl no-op layer.
|
|
|
|
We only ever attached one vtbl, so it was a waste of space and
|
|
indirections.
|
|
|
|
(cherry picked from commit 76e4ab57158de8a568572f1acb1d679ce8abb288)
|
|
---
|
|
src/gallium/drivers/vc4/vc4_resource.c | 50 +++++++++++++++------------------
|
|
src/gallium/drivers/vc4/vc4_resource.h | 2 +-
|
|
src/gallium/drivers/vc4/vc4_simulator.c | 4 +--
|
|
src/gallium/drivers/vc4/vc4_state.c | 4 +--
|
|
4 files changed, 27 insertions(+), 33 deletions(-)
|
|
|
|
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
|
|
index 596f73dfbf..3b326adbdc 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_resource.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_resource.c
|
|
@@ -39,7 +39,7 @@ static bool miptree_debug = false;
|
|
static bool
|
|
vc4_resource_bo_alloc(struct vc4_resource *rsc)
|
|
{
|
|
- struct pipe_resource *prsc = &rsc->base.b;
|
|
+ struct pipe_resource *prsc = &rsc->base;
|
|
struct pipe_screen *pscreen = prsc->screen;
|
|
struct vc4_bo *bo;
|
|
|
|
@@ -379,8 +379,10 @@ vc4_resource_destroy(struct pipe_screen *pscreen,
|
|
|
|
static boolean
|
|
vc4_resource_get_handle(struct pipe_screen *pscreen,
|
|
+ struct pipe_context *pctx,
|
|
struct pipe_resource *prsc,
|
|
- struct winsys_handle *handle)
|
|
+ struct winsys_handle *handle,
|
|
+ unsigned usage)
|
|
{
|
|
struct vc4_resource *rsc = vc4_resource(prsc);
|
|
|
|
@@ -388,18 +390,10 @@ vc4_resource_get_handle(struct pipe_screen *pscreen,
|
|
handle);
|
|
}
|
|
|
|
-static const struct u_resource_vtbl vc4_resource_vtbl = {
|
|
- .resource_get_handle = vc4_resource_get_handle,
|
|
- .resource_destroy = vc4_resource_destroy,
|
|
- .transfer_map = vc4_resource_transfer_map,
|
|
- .transfer_flush_region = u_default_transfer_flush_region,
|
|
- .transfer_unmap = vc4_resource_transfer_unmap,
|
|
-};
|
|
-
|
|
static void
|
|
vc4_setup_slices(struct vc4_resource *rsc)
|
|
{
|
|
- struct pipe_resource *prsc = &rsc->base.b;
|
|
+ struct pipe_resource *prsc = &rsc->base;
|
|
uint32_t width = prsc->width0;
|
|
uint32_t height = prsc->height0;
|
|
if (prsc->format == PIPE_FORMAT_ETC1_RGB8) {
|
|
@@ -502,14 +496,13 @@ vc4_resource_setup(struct pipe_screen *pscreen,
|
|
struct vc4_resource *rsc = CALLOC_STRUCT(vc4_resource);
|
|
if (!rsc)
|
|
return NULL;
|
|
- struct pipe_resource *prsc = &rsc->base.b;
|
|
+ struct pipe_resource *prsc = &rsc->base;
|
|
|
|
*prsc = *tmpl;
|
|
|
|
pipe_reference_init(&prsc->reference, 1);
|
|
prsc->screen = pscreen;
|
|
|
|
- rsc->base.vtbl = &vc4_resource_vtbl;
|
|
if (prsc->nr_samples <= 1)
|
|
rsc->cpp = util_format_get_blocksize(tmpl->format);
|
|
else
|
|
@@ -543,7 +536,7 @@ vc4_resource_create(struct pipe_screen *pscreen,
|
|
const struct pipe_resource *tmpl)
|
|
{
|
|
struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl);
|
|
- struct pipe_resource *prsc = &rsc->base.b;
|
|
+ struct pipe_resource *prsc = &rsc->base;
|
|
|
|
/* We have to make shared be untiled, since we don't have any way to
|
|
* communicate metadata about tiling currently.
|
|
@@ -579,7 +572,7 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
unsigned usage)
|
|
{
|
|
struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl);
|
|
- struct pipe_resource *prsc = &rsc->base.b;
|
|
+ struct pipe_resource *prsc = &rsc->base;
|
|
struct vc4_resource_slice *slice = &rsc->slices[0];
|
|
uint32_t expected_stride =
|
|
align(prsc->width0, vc4_utile_width(rsc->cpp)) * rsc->cpp;
|
|
@@ -925,16 +918,16 @@ vc4_update_shadow_baselevel_texture(struct pipe_context *pctx,
|
|
return;
|
|
|
|
perf_debug("Updating %dx%d@%d shadow texture due to %s\n",
|
|
- orig->base.b.width0, orig->base.b.height0,
|
|
+ orig->base.width0, orig->base.height0,
|
|
view->u.tex.first_level,
|
|
view->u.tex.first_level ? "base level" : "raster layout");
|
|
|
|
- for (int i = 0; i <= shadow->base.b.last_level; i++) {
|
|
- unsigned width = u_minify(shadow->base.b.width0, i);
|
|
- unsigned height = u_minify(shadow->base.b.height0, i);
|
|
+ for (int i = 0; i <= shadow->base.last_level; i++) {
|
|
+ unsigned width = u_minify(shadow->base.width0, i);
|
|
+ unsigned height = u_minify(shadow->base.height0, i);
|
|
struct pipe_blit_info info = {
|
|
.dst = {
|
|
- .resource = &shadow->base.b,
|
|
+ .resource = &shadow->base,
|
|
.level = i,
|
|
.box = {
|
|
.x = 0,
|
|
@@ -944,10 +937,10 @@ vc4_update_shadow_baselevel_texture(struct pipe_context *pctx,
|
|
.height = height,
|
|
.depth = 1,
|
|
},
|
|
- .format = shadow->base.b.format,
|
|
+ .format = shadow->base.format,
|
|
},
|
|
.src = {
|
|
- .resource = &orig->base.b,
|
|
+ .resource = &orig->base,
|
|
.level = view->u.tex.first_level + i,
|
|
.box = {
|
|
.x = 0,
|
|
@@ -957,7 +950,7 @@ vc4_update_shadow_baselevel_texture(struct pipe_context *pctx,
|
|
.height = height,
|
|
.depth = 1,
|
|
},
|
|
- .format = orig->base.b.format,
|
|
+ .format = orig->base.format,
|
|
},
|
|
.mask = ~0,
|
|
};
|
|
@@ -999,7 +992,7 @@ vc4_get_shadow_index_buffer(struct pipe_context *pctx,
|
|
if (ib->user_buffer) {
|
|
src = ib->user_buffer;
|
|
} else {
|
|
- src = pipe_buffer_map_range(pctx, &orig->base.b,
|
|
+ src = pipe_buffer_map_range(pctx, &orig->base,
|
|
ib->offset,
|
|
count * 4,
|
|
PIPE_TRANSFER_READ, &src_transfer);
|
|
@@ -1022,16 +1015,17 @@ vc4_resource_screen_init(struct pipe_screen *pscreen)
|
|
{
|
|
pscreen->resource_create = vc4_resource_create;
|
|
pscreen->resource_from_handle = vc4_resource_from_handle;
|
|
- pscreen->resource_get_handle = u_resource_get_handle_vtbl;
|
|
pscreen->resource_destroy = u_resource_destroy_vtbl;
|
|
+ pscreen->resource_get_handle = vc4_resource_get_handle;
|
|
+ pscreen->resource_destroy = vc4_resource_destroy;
|
|
}
|
|
|
|
void
|
|
vc4_resource_context_init(struct pipe_context *pctx)
|
|
{
|
|
- pctx->transfer_map = u_transfer_map_vtbl;
|
|
- pctx->transfer_flush_region = u_transfer_flush_region_vtbl;
|
|
- pctx->transfer_unmap = u_transfer_unmap_vtbl;
|
|
+ pctx->transfer_map = vc4_resource_transfer_map;
|
|
+ pctx->transfer_flush_region = u_default_transfer_flush_region;
|
|
+ pctx->transfer_unmap = vc4_resource_transfer_unmap;
|
|
pctx->buffer_subdata = u_default_buffer_subdata;
|
|
pctx->texture_subdata = u_default_texture_subdata;
|
|
pctx->create_surface = vc4_create_surface;
|
|
diff --git a/src/gallium/drivers/vc4/vc4_resource.h b/src/gallium/drivers/vc4/vc4_resource.h
|
|
index 27aa4e8728..1a771ff299 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_resource.h
|
|
+++ b/src/gallium/drivers/vc4/vc4_resource.h
|
|
@@ -52,7 +52,7 @@ struct vc4_surface {
|
|
};
|
|
|
|
struct vc4_resource {
|
|
- struct u_resource base;
|
|
+ struct pipe_resource base;
|
|
struct vc4_bo *bo;
|
|
struct vc4_resource_slice slices[VC4_MAX_MIP_LEVELS];
|
|
uint32_t cube_map_stride;
|
|
diff --git a/src/gallium/drivers/vc4/vc4_simulator.c b/src/gallium/drivers/vc4/vc4_simulator.c
|
|
index 9565c49efb..ab701ab560 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_simulator.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_simulator.c
|
|
@@ -387,7 +387,7 @@ vc4_simulator_flush(struct vc4_context *vc4,
|
|
ctex->bo->size);
|
|
#endif
|
|
|
|
- for (int y = 0; y < ctex->base.b.height0; y++) {
|
|
+ for (int y = 0; y < ctex->base.height0; y++) {
|
|
memcpy(ctex->bo->map + y * sim_stride,
|
|
csim_bo->winsys_map + y * winsys_stride,
|
|
row_len);
|
|
@@ -448,7 +448,7 @@ vc4_simulator_flush(struct vc4_context *vc4,
|
|
}
|
|
|
|
if (ctex && csim_bo->winsys_map) {
|
|
- for (int y = 0; y < ctex->base.b.height0; y++) {
|
|
+ for (int y = 0; y < ctex->base.height0; y++) {
|
|
memcpy(csim_bo->winsys_map + y * winsys_stride,
|
|
ctex->bo->map + y * sim_stride,
|
|
row_len);
|
|
diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c
|
|
index 2e00104e45..31ec19bcbe 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_state.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_state.c
|
|
@@ -575,7 +575,7 @@ vc4_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
|
|
(cso->u.tex.first_level != cso->u.tex.last_level)) ||
|
|
rsc->vc4_format == VC4_TEXTURE_TYPE_RGBA32R) {
|
|
struct vc4_resource *shadow_parent = vc4_resource(prsc);
|
|
- struct pipe_resource tmpl = shadow_parent->base.b;
|
|
+ struct pipe_resource tmpl = shadow_parent->base;
|
|
struct vc4_resource *clone;
|
|
|
|
tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
|
|
@@ -590,7 +590,7 @@ vc4_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
|
|
}
|
|
rsc = vc4_resource(prsc);
|
|
clone = vc4_resource(prsc);
|
|
- clone->shadow_parent = &shadow_parent->base.b;
|
|
+ clone->shadow_parent = &shadow_parent->base;
|
|
/* Flag it as needing update of the contents from the parent. */
|
|
clone->writes = shadow_parent->writes - 1;
|
|
|
|
From 64a91342aeb0c4a795f2184e22b15cf3079fc6ca Mon Sep 17 00:00:00 2001
|
|
From: Eric Anholt <eric@anholt.net>
|
|
Date: Mon, 8 May 2017 16:46:59 -0700
|
|
Subject: [PATCH] vc4: Drop pointless indirections around BO import/export.
|
|
|
|
I've since found them to be more confusing by adding indirections than
|
|
clarifying by screening off resources from the handle/fd import/export
|
|
process.
|
|
|
|
(cherry picked from commit 50e78cd04f6b40c4cf02774861380d843b00ebb9)
|
|
---
|
|
src/gallium/drivers/vc4/vc4_resource.c | 57 +++++++++++++++++++++++++++++-----
|
|
src/gallium/drivers/vc4/vc4_screen.c | 54 --------------------------------
|
|
src/gallium/drivers/vc4/vc4_screen.h | 7 -----
|
|
3 files changed, 49 insertions(+), 69 deletions(-)
|
|
|
|
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
|
|
index 3b326adbdc..7c868b39ec 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_resource.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_resource.c
|
|
@@ -381,13 +381,31 @@ static boolean
|
|
vc4_resource_get_handle(struct pipe_screen *pscreen,
|
|
struct pipe_context *pctx,
|
|
struct pipe_resource *prsc,
|
|
- struct winsys_handle *handle,
|
|
+ struct winsys_handle *whandle,
|
|
unsigned usage)
|
|
{
|
|
struct vc4_resource *rsc = vc4_resource(prsc);
|
|
|
|
- return vc4_screen_bo_get_handle(pscreen, rsc->bo, rsc->slices[0].stride,
|
|
- handle);
|
|
+ whandle->stride = rsc->slices[0].stride;
|
|
+
|
|
+ /* If we're passing some reference to our BO out to some other part of
|
|
+ * the system, then we can't do any optimizations about only us being
|
|
+ * the ones seeing it (like BO caching or shadow update avoidance).
|
|
+ */
|
|
+ rsc->bo->private = false;
|
|
+
|
|
+ switch (whandle->type) {
|
|
+ case DRM_API_HANDLE_TYPE_SHARED:
|
|
+ return vc4_bo_flink(rsc->bo, &whandle->handle);
|
|
+ case DRM_API_HANDLE_TYPE_KMS:
|
|
+ whandle->handle = rsc->bo->handle;
|
|
+ return TRUE;
|
|
+ case DRM_API_HANDLE_TYPE_FD:
|
|
+ whandle->handle = vc4_bo_get_dmabuf(rsc->bo);
|
|
+ return whandle->handle != -1;
|
|
+ }
|
|
+
|
|
+ return FALSE;
|
|
}
|
|
|
|
static void
|
|
@@ -568,9 +586,10 @@ vc4_resource_create(struct pipe_screen *pscreen,
|
|
static struct pipe_resource *
|
|
vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
const struct pipe_resource *tmpl,
|
|
- struct winsys_handle *handle,
|
|
+ struct winsys_handle *whandle,
|
|
unsigned usage)
|
|
{
|
|
+ struct vc4_screen *screen = vc4_screen(pscreen);
|
|
struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl);
|
|
struct pipe_resource *prsc = &rsc->base;
|
|
struct vc4_resource_slice *slice = &rsc->slices[0];
|
|
@@ -580,7 +599,7 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
if (!rsc)
|
|
return NULL;
|
|
|
|
- if (handle->stride != expected_stride) {
|
|
+ if (whandle->stride != expected_stride) {
|
|
static bool warned = false;
|
|
if (!warned) {
|
|
warned = true;
|
|
@@ -589,18 +608,40 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
"unsupported stride %d instead of %d\n",
|
|
prsc->width0, prsc->height0,
|
|
util_format_short_name(prsc->format),
|
|
- handle->stride,
|
|
+ whandle->stride,
|
|
expected_stride);
|
|
}
|
|
goto fail;
|
|
}
|
|
|
|
rsc->tiled = false;
|
|
- rsc->bo = vc4_screen_bo_from_handle(pscreen, handle);
|
|
+
|
|
+ if (whandle->offset != 0) {
|
|
+ fprintf(stderr,
|
|
+ "Attempt to import unsupported winsys offset %u\n",
|
|
+ whandle->offset);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ switch (whandle->type) {
|
|
+ case DRM_API_HANDLE_TYPE_SHARED:
|
|
+ rsc->bo = vc4_bo_open_name(screen,
|
|
+ whandle->handle, whandle->stride);
|
|
+ break;
|
|
+ case DRM_API_HANDLE_TYPE_FD:
|
|
+ rsc->bo = vc4_bo_open_dmabuf(screen,
|
|
+ whandle->handle, whandle->stride);
|
|
+ break;
|
|
+ default:
|
|
+ fprintf(stderr,
|
|
+ "Attempt to import unsupported handle type %d\n",
|
|
+ whandle->type);
|
|
+ }
|
|
+
|
|
if (!rsc->bo)
|
|
goto fail;
|
|
|
|
- slice->stride = handle->stride;
|
|
+ slice->stride = whandle->stride;
|
|
slice->tiling = VC4_TILING_FORMAT_LINEAR;
|
|
|
|
rsc->vc4_format = get_resource_texture_format(prsc);
|
|
diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
|
|
index 27d23dc964..405a13f16e 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_screen.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_screen.c
|
|
@@ -654,57 +654,3 @@ vc4_screen_create(int fd)
|
|
ralloc_free(pscreen);
|
|
return NULL;
|
|
}
|
|
-
|
|
-boolean
|
|
-vc4_screen_bo_get_handle(struct pipe_screen *pscreen,
|
|
- struct vc4_bo *bo,
|
|
- unsigned stride,
|
|
- struct winsys_handle *whandle)
|
|
-{
|
|
- whandle->stride = stride;
|
|
-
|
|
- /* If we're passing some reference to our BO out to some other part of
|
|
- * the system, then we can't do any optimizations about only us being
|
|
- * the ones seeing it (like BO caching or shadow update avoidance).
|
|
- */
|
|
- bo->private = false;
|
|
-
|
|
- switch (whandle->type) {
|
|
- case DRM_API_HANDLE_TYPE_SHARED:
|
|
- return vc4_bo_flink(bo, &whandle->handle);
|
|
- case DRM_API_HANDLE_TYPE_KMS:
|
|
- whandle->handle = bo->handle;
|
|
- return TRUE;
|
|
- case DRM_API_HANDLE_TYPE_FD:
|
|
- whandle->handle = vc4_bo_get_dmabuf(bo);
|
|
- return whandle->handle != -1;
|
|
- }
|
|
-
|
|
- return FALSE;
|
|
-}
|
|
-
|
|
-struct vc4_bo *
|
|
-vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
|
|
- struct winsys_handle *whandle)
|
|
-{
|
|
- struct vc4_screen *screen = vc4_screen(pscreen);
|
|
-
|
|
- if (whandle->offset != 0) {
|
|
- fprintf(stderr,
|
|
- "Attempt to import unsupported winsys offset %u\n",
|
|
- whandle->offset);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- switch (whandle->type) {
|
|
- case DRM_API_HANDLE_TYPE_SHARED:
|
|
- return vc4_bo_open_name(screen, whandle->handle, whandle->stride);
|
|
- case DRM_API_HANDLE_TYPE_FD:
|
|
- return vc4_bo_open_dmabuf(screen, whandle->handle, whandle->stride);
|
|
- default:
|
|
- fprintf(stderr,
|
|
- "Attempt to import unsupported handle type %d\n",
|
|
- whandle->type);
|
|
- return NULL;
|
|
- }
|
|
-}
|
|
diff --git a/src/gallium/drivers/vc4/vc4_screen.h b/src/gallium/drivers/vc4/vc4_screen.h
|
|
index 34d15381ae..0f80ffb346 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_screen.h
|
|
+++ b/src/gallium/drivers/vc4/vc4_screen.h
|
|
@@ -102,13 +102,6 @@ vc4_screen(struct pipe_screen *screen)
|
|
}
|
|
|
|
struct pipe_screen *vc4_screen_create(int fd);
|
|
-boolean vc4_screen_bo_get_handle(struct pipe_screen *pscreen,
|
|
- struct vc4_bo *bo,
|
|
- unsigned stride,
|
|
- struct winsys_handle *whandle);
|
|
-struct vc4_bo *
|
|
-vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
|
|
- struct winsys_handle *whandle);
|
|
|
|
const void *
|
|
vc4_screen_get_compiler_options(struct pipe_screen *pscreen,
|
|
From 427bd8275b9d4bb7a52d4e0dd4881a91a96c9c5b Mon Sep 17 00:00:00 2001
|
|
From: Eric Anholt <eric@anholt.net>
|
|
Date: Mon, 5 Jun 2017 14:50:26 -0700
|
|
Subject: [PATCH] vc4: Set shareable BOs as T tiled if possible.
|
|
|
|
X11 and GL compositor performance on VC4 has been terrible because of our
|
|
SHARED-usage buffers all being forced to linear. This swaps SHARED &&
|
|
!LINEAR buffers over to being tiled.
|
|
|
|
This is an expected win for all GL compositors during rendering (a full
|
|
copy of each shared texture per draw call), allows X11 to be used with
|
|
decent performance without a GL compositor, and improves X11 windowed
|
|
swapbuffers performance as well. It also halves the memory usage of
|
|
shared buffers that get textured from. The only cost should be idle
|
|
systems with a scanout-only buffer that isn't flagged as LINEAR, in which
|
|
case the memory bandwidth cost of scanout goes up ~25%.
|
|
|
|
(cherry picked from commit ba654a2fc194f38262a290c378f581fbf280efe2)
|
|
---
|
|
src/gallium/drivers/vc4/vc4_bufmgr.c | 7 +++
|
|
src/gallium/drivers/vc4/vc4_resource.c | 108 ++++++++++++++++++++++----------
|
|
src/gallium/drivers/vc4/vc4_simulator.c | 8 +++
|
|
3 files changed, 90 insertions(+), 33 deletions(-)
|
|
|
|
diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.c b/src/gallium/drivers/vc4/vc4_bufmgr.c
|
|
index 12af7f8a9e..25e95ff3c5 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_bufmgr.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_bufmgr.c
|
|
@@ -27,6 +27,7 @@
|
|
#include <fcntl.h>
|
|
#include <xf86drm.h>
|
|
#include <xf86drmMode.h>
|
|
+#include <drm_fourcc.h>
|
|
|
|
#include "util/u_hash_table.h"
|
|
#include "util/u_memory.h"
|
|
@@ -282,6 +283,12 @@ vc4_bo_last_unreference_locked_timed(struct vc4_bo *bo, time_t time)
|
|
return;
|
|
}
|
|
|
|
+ struct drm_vc4_set_tiling set_tiling = {
|
|
+ .handle = bo->handle,
|
|
+ .modifier = DRM_FORMAT_MOD_NONE,
|
|
+ };
|
|
+ (void)vc4_ioctl(screen->fd, DRM_IOCTL_VC4_SET_TILING, &set_tiling);
|
|
+
|
|
if (cache->size_list_size <= page_index) {
|
|
struct list_head *new_list =
|
|
ralloc_array(screen, struct list_head, page_index + 1);
|
|
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
|
|
index 7c868b39ec..eb462707a7 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_resource.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_resource.c
|
|
@@ -29,10 +29,12 @@
|
|
#include "util/u_surface.h"
|
|
#include "util/u_upload_mgr.h"
|
|
|
|
+#include "vc4_drm.h"
|
|
#include "vc4_screen.h"
|
|
#include "vc4_context.h"
|
|
#include "vc4_resource.h"
|
|
#include "vc4_tiling.h"
|
|
+#include "drm_fourcc.h"
|
|
|
|
static bool miptree_debug = false;
|
|
|
|
@@ -553,30 +555,67 @@ struct pipe_resource *
|
|
vc4_resource_create(struct pipe_screen *pscreen,
|
|
const struct pipe_resource *tmpl)
|
|
{
|
|
+ struct vc4_screen *screen = vc4_screen(pscreen);
|
|
struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl);
|
|
struct pipe_resource *prsc = &rsc->base;
|
|
|
|
- /* We have to make shared be untiled, since we don't have any way to
|
|
- * communicate metadata about tiling currently.
|
|
+ /* Use a tiled layout if we can, for better 3D performance. */
|
|
+ rsc->tiled = true;
|
|
+
|
|
+ /* VBOs/PBOs are untiled (and 1 height). */
|
|
+ if (tmpl->target == PIPE_BUFFER)
|
|
+ rsc->tiled = false;
|
|
+
|
|
+ /* MSAA buffers are linear. */
|
|
+ if (tmpl->nr_samples > 1)
|
|
+ rsc->tiled = false;
|
|
+
|
|
+ /* Cursors are always linear, and the user can request linear as
|
|
+ * well.
|
|
*/
|
|
- if (tmpl->target == PIPE_BUFFER ||
|
|
- tmpl->nr_samples > 1 ||
|
|
- (tmpl->bind & (PIPE_BIND_SCANOUT |
|
|
- PIPE_BIND_LINEAR |
|
|
- PIPE_BIND_SHARED |
|
|
- PIPE_BIND_CURSOR))) {
|
|
+ if (tmpl->bind & (PIPE_BIND_LINEAR |
|
|
+ PIPE_BIND_CURSOR)) {
|
|
rsc->tiled = false;
|
|
- } else {
|
|
- rsc->tiled = true;
|
|
}
|
|
|
|
- if (tmpl->target != PIPE_BUFFER)
|
|
- rsc->vc4_format = get_resource_texture_format(prsc);
|
|
+ /* No shared objects with LT format -- the kernel only has T-format
|
|
+ * metadata. LT objects are small enough it's not worth the trouble
|
|
+ * to give them metadata to tile.
|
|
+ */
|
|
+ if ((tmpl->bind & PIPE_BIND_SHARED) &&
|
|
+ vc4_size_is_lt(prsc->width0, prsc->height0, rsc->cpp)) {
|
|
+ rsc->tiled = false;
|
|
+ }
|
|
|
|
vc4_setup_slices(rsc);
|
|
if (!vc4_resource_bo_alloc(rsc))
|
|
goto fail;
|
|
|
|
+ if (tmpl->bind & PIPE_BIND_SHARED) {
|
|
+ assert(rsc->slices[0].tiling == VC4_TILING_FORMAT_T);
|
|
+
|
|
+ struct drm_vc4_set_tiling set_tiling = {
|
|
+ .handle = rsc->bo->handle,
|
|
+ .modifier = DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
|
|
+ };
|
|
+ int ret = vc4_ioctl(screen->fd,
|
|
+ DRM_IOCTL_VC4_SET_TILING,
|
|
+ &set_tiling);
|
|
+
|
|
+ /* If we hit this, we're probably on an old kernel. Fall back
|
|
+ * to linear.
|
|
+ */
|
|
+ if (ret != 0) {
|
|
+ rsc->tiled = false;
|
|
+ vc4_setup_slices(rsc);
|
|
+ if (!vc4_resource_bo_alloc(rsc))
|
|
+ goto fail;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (tmpl->target != PIPE_BUFFER)
|
|
+ rsc->vc4_format = get_resource_texture_format(prsc);
|
|
+
|
|
return prsc;
|
|
fail:
|
|
vc4_resource_destroy(pscreen, prsc);
|
|
@@ -593,29 +632,10 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl);
|
|
struct pipe_resource *prsc = &rsc->base;
|
|
struct vc4_resource_slice *slice = &rsc->slices[0];
|
|
- uint32_t expected_stride =
|
|
- align(prsc->width0, vc4_utile_width(rsc->cpp)) * rsc->cpp;
|
|
|
|
if (!rsc)
|
|
return NULL;
|
|
|
|
- if (whandle->stride != expected_stride) {
|
|
- static bool warned = false;
|
|
- if (!warned) {
|
|
- warned = true;
|
|
- fprintf(stderr,
|
|
- "Attempting to import %dx%d %s with "
|
|
- "unsupported stride %d instead of %d\n",
|
|
- prsc->width0, prsc->height0,
|
|
- util_format_short_name(prsc->format),
|
|
- whandle->stride,
|
|
- expected_stride);
|
|
- }
|
|
- goto fail;
|
|
- }
|
|
-
|
|
- rsc->tiled = false;
|
|
-
|
|
if (whandle->offset != 0) {
|
|
fprintf(stderr,
|
|
"Attempt to import unsupported winsys offset %u\n",
|
|
@@ -641,10 +661,17 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
if (!rsc->bo)
|
|
goto fail;
|
|
|
|
- slice->stride = whandle->stride;
|
|
- slice->tiling = VC4_TILING_FORMAT_LINEAR;
|
|
+ struct drm_vc4_get_tiling get_tiling = {
|
|
+ .handle = rsc->bo->handle,
|
|
+ };
|
|
+ int ret = vc4_ioctl(screen->fd, DRM_IOCTL_VC4_GET_TILING, &get_tiling);
|
|
+ if (ret == 0 &&
|
|
+ get_tiling.modifier == DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED) {
|
|
+ rsc->tiled = true;
|
|
+ }
|
|
|
|
rsc->vc4_format = get_resource_texture_format(prsc);
|
|
+ vc4_setup_slices(rsc);
|
|
|
|
if (miptree_debug) {
|
|
fprintf(stderr,
|
|
@@ -655,6 +682,21 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
|
|
slice->stride, slice->offset);
|
|
}
|
|
|
|
+ if (whandle->stride != rsc->slices[0].stride) {
|
|
+ static bool warned = false;
|
|
+ if (!warned) {
|
|
+ warned = true;
|
|
+ fprintf(stderr,
|
|
+ "Attempting to import %dx%d %s with "
|
|
+ "unsupported stride %d instead of %d\n",
|
|
+ prsc->width0, prsc->height0,
|
|
+ util_format_short_name(prsc->format),
|
|
+ whandle->stride,
|
|
+ rsc->slices[0].stride);
|
|
+ }
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
return prsc;
|
|
|
|
fail:
|
|
diff --git a/src/gallium/drivers/vc4/vc4_simulator.c b/src/gallium/drivers/vc4/vc4_simulator.c
|
|
index ab701ab560..bd063a8432 100644
|
|
--- a/src/gallium/drivers/vc4/vc4_simulator.c
|
|
+++ b/src/gallium/drivers/vc4/vc4_simulator.c
|
|
@@ -658,9 +658,17 @@ vc4_simulator_ioctl(int fd, unsigned long request, void *args)
|
|
case DRM_IOCTL_GEM_CLOSE:
|
|
return vc4_simulator_gem_close_ioctl(fd, args);
|
|
|
|
+ case DRM_IOCTL_VC4_GET_TILING:
|
|
+ case DRM_IOCTL_VC4_SET_TILING:
|
|
+ /* Disable these for now, since the sharing with i965 requires
|
|
+ * linear buffers.
|
|
+ */
|
|
+ return -1;
|
|
+
|
|
case DRM_IOCTL_GEM_OPEN:
|
|
case DRM_IOCTL_GEM_FLINK:
|
|
return drmIoctl(fd, request, args);
|
|
+
|
|
default:
|
|
fprintf(stderr, "Unknown ioctl 0x%08x\n", (int)request);
|
|
abort();
|