1 /*
2 * Copyright © 2021 Raspberry Pi Ltd
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #ifndef V3D_UTIL_H
25 #define V3D_UTIL_H
26
27 #include "util/macros.h"
28 #include "common/v3d_device_info.h"
29 #include "compiler/shader_enums.h"
30 #include "util/format/u_formats.h"
31
32 #if USE_V3D_SIMULATOR
33 # include "simulator/v3d_simulator.h"
34 #else
35 # include "xf86drm.h"
36 #endif
37
38 /* Helper to call hw ver specific functions */
39 #define v3d_X(devinfo, thing) ({ \
40 __typeof(&v3d42_##thing) v3d_X_thing; \
41 switch (devinfo->ver) { \
42 case 42: \
43 v3d_X_thing = &v3d42_##thing; \
44 break; \
45 case 71: \
46 v3d_X_thing = &v3d71_##thing; \
47 break; \
48 default: \
49 unreachable("Unsupported hardware generation"); \
50 } \
51 v3d_X_thing; \
52 })
53
54 uint32_t
55 v3d_csd_choose_workgroups_per_supergroup(struct v3d_device_info *devinfo,
56 bool has_subgroups,
57 bool has_tsy_barrier,
58 uint32_t threads,
59 uint32_t num_wgs,
60 uint32_t wg_size);
61
62 void
63 v3d_choose_tile_size(const struct v3d_device_info *devinfo,
64 uint32_t color_attachment_count,
65 uint32_t max_internal_bpp,
66 uint32_t total_color_bpp,
67 bool msaa,
68 bool double_buffer,
69 uint32_t *width,
70 uint32_t *height);
71
72 uint32_t
73 v3d_translate_pipe_swizzle(enum pipe_swizzle swizzle);
74
75 uint32_t
76 v3d_hw_prim_type(enum mesa_prim prim_type);
77
78 uint32_t
79 v3d_internal_bpp_words(uint32_t internal_bpp);
80
81 /* Some configuration packets want the size on log2, but starting at 0 for
82 * size 8.
83 */
84 static inline uint8_t
log2_tile_size(uint32_t size)85 log2_tile_size(uint32_t size)
86 {
87 switch(size) {
88 case 8:
89 return 0;
90 case 16:
91 return 1;
92 case 32:
93 return 2;
94 case 64:
95 return 3;
96 default:
97 unreachable("Unsupported tile width/height");
98 }
99 }
100
101 uint32_t
102 v3d_compute_rt_row_row_stride_128_bits(uint32_t tile_width,
103 uint32_t bpp);
104
105 static inline int
v3d_ioctl(int fd,unsigned long request,void * arg)106 v3d_ioctl(int fd, unsigned long request, void *arg)
107 {
108 #if USE_V3D_SIMULATOR
109 return v3d_simulator_ioctl(fd, request, arg);
110 #else
111 return drmIoctl(fd, request, arg);
112 #endif
113 }
114 #endif
115