xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_util.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2020 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Authors:
6*61046927SAndroid Build Coastguard Worker  *    Jonathan Marek <[email protected]>
7*61046927SAndroid Build Coastguard Worker  */
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #ifndef TU_UTIL_H
10*61046927SAndroid Build Coastguard Worker #define TU_UTIL_H
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "tu_common.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
15*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
16*61046927SAndroid Build Coastguard Worker #include "util/format/u_format_pack.h"
17*61046927SAndroid Build Coastguard Worker #include "util/format/u_format_zs.h"
18*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker #define TU_DEBUG(name) unlikely(tu_env.debug & TU_DEBUG_##name)
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker enum tu_debug_flags
25*61046927SAndroid Build Coastguard Worker {
26*61046927SAndroid Build Coastguard Worker    TU_DEBUG_STARTUP = 1 << 0,
27*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NIR = 1 << 1,
28*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NOBIN = 1 << 3,
29*61046927SAndroid Build Coastguard Worker    TU_DEBUG_SYSMEM = 1 << 4,
30*61046927SAndroid Build Coastguard Worker    TU_DEBUG_FORCEBIN = 1 << 5,
31*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NOUBWC = 1 << 6,
32*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NOMULTIPOS = 1 << 7,
33*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NOLRZ = 1 << 8,
34*61046927SAndroid Build Coastguard Worker    TU_DEBUG_PERFC = 1 << 9,
35*61046927SAndroid Build Coastguard Worker    TU_DEBUG_FLUSHALL = 1 << 10,
36*61046927SAndroid Build Coastguard Worker    TU_DEBUG_SYNCDRAW = 1 << 11,
37*61046927SAndroid Build Coastguard Worker    TU_DEBUG_PUSH_CONSTS_PER_STAGE = 1 << 12,
38*61046927SAndroid Build Coastguard Worker    TU_DEBUG_GMEM = 1 << 13,
39*61046927SAndroid Build Coastguard Worker    TU_DEBUG_RAST_ORDER = 1 << 14,
40*61046927SAndroid Build Coastguard Worker    TU_DEBUG_UNALIGNED_STORE = 1 << 15,
41*61046927SAndroid Build Coastguard Worker    TU_DEBUG_LAYOUT = 1 << 16,
42*61046927SAndroid Build Coastguard Worker    TU_DEBUG_LOG_SKIP_GMEM_OPS = 1 << 17,
43*61046927SAndroid Build Coastguard Worker    TU_DEBUG_PERF = 1 << 18,
44*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NOLRZFC = 1 << 19,
45*61046927SAndroid Build Coastguard Worker    TU_DEBUG_DYNAMIC = 1 << 20,
46*61046927SAndroid Build Coastguard Worker    TU_DEBUG_BOS = 1 << 21,
47*61046927SAndroid Build Coastguard Worker    TU_DEBUG_3D_LOAD = 1 << 22,
48*61046927SAndroid Build Coastguard Worker    TU_DEBUG_FDM = 1 << 23,
49*61046927SAndroid Build Coastguard Worker    TU_DEBUG_NOCONFORM = 1 << 24,
50*61046927SAndroid Build Coastguard Worker    TU_DEBUG_RD = 1 << 25,
51*61046927SAndroid Build Coastguard Worker };
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker struct tu_env {
54*61046927SAndroid Build Coastguard Worker     uint32_t debug;
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker extern struct tu_env tu_env;
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker void
60*61046927SAndroid Build Coastguard Worker tu_env_init(void);
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker /* Whenever we generate an error, pass it through this function. Useful for
63*61046927SAndroid Build Coastguard Worker  * debugging, where we can break on it. Only call at error site, not when
64*61046927SAndroid Build Coastguard Worker  * propagating errors. Might be useful to plug in a stack trace here.
65*61046927SAndroid Build Coastguard Worker  */
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker VkResult
68*61046927SAndroid Build Coastguard Worker __vk_startup_errorf(struct tu_instance *instance,
69*61046927SAndroid Build Coastguard Worker                     VkResult error,
70*61046927SAndroid Build Coastguard Worker                     const char *file,
71*61046927SAndroid Build Coastguard Worker                     int line,
72*61046927SAndroid Build Coastguard Worker                     const char *format,
73*61046927SAndroid Build Coastguard Worker                     ...) PRINTFLIKE(5, 6);
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker /* Prints startup errors if TU_DEBUG=startup is set or on a debug driver
76*61046927SAndroid Build Coastguard Worker  * build.
77*61046927SAndroid Build Coastguard Worker  */
78*61046927SAndroid Build Coastguard Worker #define vk_startup_errorf(instance, error, format, ...) \
79*61046927SAndroid Build Coastguard Worker    __vk_startup_errorf(instance, error, \
80*61046927SAndroid Build Coastguard Worker                        __FILE__, __LINE__, format, ##__VA_ARGS__)
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker void
83*61046927SAndroid Build Coastguard Worker __tu_finishme(const char *file, int line, const char *format, ...)
84*61046927SAndroid Build Coastguard Worker    PRINTFLIKE(3, 4);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker /**
87*61046927SAndroid Build Coastguard Worker  * Print a FINISHME message, including its source location.
88*61046927SAndroid Build Coastguard Worker  */
89*61046927SAndroid Build Coastguard Worker #define tu_finishme(format, ...)                                             \
90*61046927SAndroid Build Coastguard Worker    do {                                                                      \
91*61046927SAndroid Build Coastguard Worker       static bool reported = false;                                          \
92*61046927SAndroid Build Coastguard Worker       if (!reported) {                                                       \
93*61046927SAndroid Build Coastguard Worker          __tu_finishme(__FILE__, __LINE__, format, ##__VA_ARGS__);           \
94*61046927SAndroid Build Coastguard Worker          reported = true;                                                    \
95*61046927SAndroid Build Coastguard Worker       }                                                                      \
96*61046927SAndroid Build Coastguard Worker    } while (0)
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker #define tu_stub()                                                            \
99*61046927SAndroid Build Coastguard Worker    do {                                                                      \
100*61046927SAndroid Build Coastguard Worker       tu_finishme("stub %s", __func__);                                      \
101*61046927SAndroid Build Coastguard Worker    } while (0)
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker void
104*61046927SAndroid Build Coastguard Worker tu_framebuffer_tiling_config(struct tu_framebuffer *fb,
105*61046927SAndroid Build Coastguard Worker                              const struct tu_device *device,
106*61046927SAndroid Build Coastguard Worker                              const struct tu_render_pass *pass);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker #define TU_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker #define tu_foreach_stage(stage, stage_bits)                                  \
111*61046927SAndroid Build Coastguard Worker    for (gl_shader_stage stage,                                               \
112*61046927SAndroid Build Coastguard Worker         __tmp = (gl_shader_stage) ((stage_bits) &TU_STAGE_MASK);             \
113*61046927SAndroid Build Coastguard Worker         stage = (gl_shader_stage) (__builtin_ffs(__tmp) - 1), __tmp;         \
114*61046927SAndroid Build Coastguard Worker         __tmp = (gl_shader_stage) (__tmp & ~(1 << (stage))))
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker static inline enum a3xx_msaa_samples
tu_msaa_samples(uint32_t samples)117*61046927SAndroid Build Coastguard Worker tu_msaa_samples(uint32_t samples)
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker    assert(__builtin_popcount(samples) == 1);
120*61046927SAndroid Build Coastguard Worker    return (enum a3xx_msaa_samples) util_logbase2(samples);
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker static inline uint32_t
tu6_stage2opcode(gl_shader_stage stage)124*61046927SAndroid Build Coastguard Worker tu6_stage2opcode(gl_shader_stage stage)
125*61046927SAndroid Build Coastguard Worker {
126*61046927SAndroid Build Coastguard Worker    if (stage == MESA_SHADER_FRAGMENT || stage == MESA_SHADER_COMPUTE)
127*61046927SAndroid Build Coastguard Worker       return CP_LOAD_STATE6_FRAG;
128*61046927SAndroid Build Coastguard Worker    return CP_LOAD_STATE6_GEOM;
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker static inline enum a6xx_state_block
tu6_stage2texsb(gl_shader_stage stage)132*61046927SAndroid Build Coastguard Worker tu6_stage2texsb(gl_shader_stage stage)
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker    return (enum a6xx_state_block) (SB6_VS_TEX + stage);
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker static inline enum a6xx_state_block
tu6_stage2shadersb(gl_shader_stage stage)138*61046927SAndroid Build Coastguard Worker tu6_stage2shadersb(gl_shader_stage stage)
139*61046927SAndroid Build Coastguard Worker {
140*61046927SAndroid Build Coastguard Worker    return (enum a6xx_state_block) (SB6_VS_SHADER + stage);
141*61046927SAndroid Build Coastguard Worker }
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker static inline enum a3xx_rop_code
tu6_rop(VkLogicOp op)144*61046927SAndroid Build Coastguard Worker tu6_rop(VkLogicOp op)
145*61046927SAndroid Build Coastguard Worker {
146*61046927SAndroid Build Coastguard Worker    /* note: hw enum matches the VK enum, but with the 4 bits reversed */
147*61046927SAndroid Build Coastguard Worker    static const enum a3xx_rop_code lookup[] = {
148*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_CLEAR]           = ROP_CLEAR,
149*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_AND]             = ROP_AND,
150*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_AND_REVERSE]     = ROP_AND_REVERSE,
151*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_COPY]            = ROP_COPY,
152*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_AND_INVERTED]    = ROP_AND_INVERTED,
153*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_NO_OP]           = ROP_NOOP,
154*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_XOR]             = ROP_XOR,
155*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_OR]              = ROP_OR,
156*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_NOR]             = ROP_NOR,
157*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_EQUIVALENT]      = ROP_EQUIV,
158*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_INVERT]          = ROP_INVERT,
159*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_OR_REVERSE]      = ROP_OR_REVERSE,
160*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_COPY_INVERTED]   = ROP_COPY_INVERTED,
161*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_OR_INVERTED]     = ROP_OR_INVERTED,
162*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_NAND]            = ROP_NAND,
163*61046927SAndroid Build Coastguard Worker       [VK_LOGIC_OP_SET]             = ROP_SET,
164*61046927SAndroid Build Coastguard Worker    };
165*61046927SAndroid Build Coastguard Worker    assert(op < ARRAY_SIZE(lookup));
166*61046927SAndroid Build Coastguard Worker    return lookup[op];
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker static inline bool
tu6_primtype_line(enum pc_di_primtype type)170*61046927SAndroid Build Coastguard Worker tu6_primtype_line(enum pc_di_primtype type)
171*61046927SAndroid Build Coastguard Worker {
172*61046927SAndroid Build Coastguard Worker     switch(type) {
173*61046927SAndroid Build Coastguard Worker     case DI_PT_LINELIST:
174*61046927SAndroid Build Coastguard Worker     case DI_PT_LINESTRIP:
175*61046927SAndroid Build Coastguard Worker     case DI_PT_LINE_ADJ:
176*61046927SAndroid Build Coastguard Worker     case DI_PT_LINESTRIP_ADJ:
177*61046927SAndroid Build Coastguard Worker        return true;
178*61046927SAndroid Build Coastguard Worker     default:
179*61046927SAndroid Build Coastguard Worker        return false;
180*61046927SAndroid Build Coastguard Worker     }
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker static inline bool
tu6_primtype_patches(enum pc_di_primtype type)184*61046927SAndroid Build Coastguard Worker tu6_primtype_patches(enum pc_di_primtype type)
185*61046927SAndroid Build Coastguard Worker {
186*61046927SAndroid Build Coastguard Worker    return type >= DI_PT_PATCHES0 && type <= DI_PT_PATCHES31;
187*61046927SAndroid Build Coastguard Worker }
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker static inline enum pc_di_primtype
tu6_primtype(VkPrimitiveTopology topology)190*61046927SAndroid Build Coastguard Worker tu6_primtype(VkPrimitiveTopology topology)
191*61046927SAndroid Build Coastguard Worker {
192*61046927SAndroid Build Coastguard Worker    static const enum pc_di_primtype lookup[] = {
193*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_POINT_LIST]                    = DI_PT_POINTLIST,
194*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_LINE_LIST]                     = DI_PT_LINELIST,
195*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_LINE_STRIP]                    = DI_PT_LINESTRIP,
196*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST]                 = DI_PT_TRILIST,
197*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP]                = DI_PT_TRISTRIP,
198*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN]                  = DI_PT_TRIFAN,
199*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY]      = DI_PT_LINE_ADJ,
200*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY]     = DI_PT_LINESTRIP_ADJ,
201*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY]  = DI_PT_TRI_ADJ,
202*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY] = DI_PT_TRISTRIP_ADJ,
203*61046927SAndroid Build Coastguard Worker       /* Return PATCH0 and update in tu_pipeline_builder_parse_tessellation */
204*61046927SAndroid Build Coastguard Worker       [VK_PRIMITIVE_TOPOLOGY_PATCH_LIST]                    = DI_PT_PATCHES0,
205*61046927SAndroid Build Coastguard Worker    };
206*61046927SAndroid Build Coastguard Worker    assert(topology < ARRAY_SIZE(lookup));
207*61046927SAndroid Build Coastguard Worker    return lookup[topology];
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker static inline enum adreno_compare_func
tu6_compare_func(VkCompareOp op)211*61046927SAndroid Build Coastguard Worker tu6_compare_func(VkCompareOp op)
212*61046927SAndroid Build Coastguard Worker {
213*61046927SAndroid Build Coastguard Worker    return (enum adreno_compare_func) op;
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker static inline enum adreno_stencil_op
tu6_stencil_op(VkStencilOp op)217*61046927SAndroid Build Coastguard Worker tu6_stencil_op(VkStencilOp op)
218*61046927SAndroid Build Coastguard Worker {
219*61046927SAndroid Build Coastguard Worker    return (enum adreno_stencil_op) op;
220*61046927SAndroid Build Coastguard Worker }
221*61046927SAndroid Build Coastguard Worker 
222*61046927SAndroid Build Coastguard Worker static inline enum adreno_rb_blend_factor
tu6_blend_factor(VkBlendFactor factor)223*61046927SAndroid Build Coastguard Worker tu6_blend_factor(VkBlendFactor factor)
224*61046927SAndroid Build Coastguard Worker {
225*61046927SAndroid Build Coastguard Worker    static const enum adreno_rb_blend_factor lookup[] = {
226*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ZERO]                    = FACTOR_ZERO,
227*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE]                     = FACTOR_ONE,
228*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_SRC_COLOR]               = FACTOR_SRC_COLOR,
229*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR]     = FACTOR_ONE_MINUS_SRC_COLOR,
230*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_DST_COLOR]               = FACTOR_DST_COLOR,
231*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR]     = FACTOR_ONE_MINUS_DST_COLOR,
232*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_SRC_ALPHA]               = FACTOR_SRC_ALPHA,
233*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA]     = FACTOR_ONE_MINUS_SRC_ALPHA,
234*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_DST_ALPHA]               = FACTOR_DST_ALPHA,
235*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA]     = FACTOR_ONE_MINUS_DST_ALPHA,
236*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_CONSTANT_COLOR]          = FACTOR_CONSTANT_COLOR,
237*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR]= FACTOR_ONE_MINUS_CONSTANT_COLOR,
238*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_CONSTANT_ALPHA]          = FACTOR_CONSTANT_ALPHA,
239*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA]= FACTOR_ONE_MINUS_CONSTANT_ALPHA,
240*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_SRC_ALPHA_SATURATE]      = FACTOR_SRC_ALPHA_SATURATE,
241*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_SRC1_COLOR]              = FACTOR_SRC1_COLOR,
242*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR]    = FACTOR_ONE_MINUS_SRC1_COLOR,
243*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_SRC1_ALPHA]              = FACTOR_SRC1_ALPHA,
244*61046927SAndroid Build Coastguard Worker       [VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA]    = FACTOR_ONE_MINUS_SRC1_ALPHA,
245*61046927SAndroid Build Coastguard Worker    };
246*61046927SAndroid Build Coastguard Worker    assert(factor < ARRAY_SIZE(lookup));
247*61046927SAndroid Build Coastguard Worker    return lookup[factor];
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker static inline bool
tu_blend_factor_is_dual_src(VkBlendFactor factor)251*61046927SAndroid Build Coastguard Worker tu_blend_factor_is_dual_src(VkBlendFactor factor)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker    switch (factor) {
254*61046927SAndroid Build Coastguard Worker    case VK_BLEND_FACTOR_SRC1_COLOR:
255*61046927SAndroid Build Coastguard Worker    case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR:
256*61046927SAndroid Build Coastguard Worker    case VK_BLEND_FACTOR_SRC1_ALPHA:
257*61046927SAndroid Build Coastguard Worker    case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA:
258*61046927SAndroid Build Coastguard Worker       return true;
259*61046927SAndroid Build Coastguard Worker    default:
260*61046927SAndroid Build Coastguard Worker       return false;
261*61046927SAndroid Build Coastguard Worker    }
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker static inline enum a3xx_rb_blend_opcode
tu6_blend_op(VkBlendOp op)265*61046927SAndroid Build Coastguard Worker tu6_blend_op(VkBlendOp op)
266*61046927SAndroid Build Coastguard Worker {
267*61046927SAndroid Build Coastguard Worker    return (enum a3xx_rb_blend_opcode) op;
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker static inline enum a6xx_tex_type
tu6_tex_type(VkImageViewType type,bool storage)271*61046927SAndroid Build Coastguard Worker tu6_tex_type(VkImageViewType type, bool storage)
272*61046927SAndroid Build Coastguard Worker {
273*61046927SAndroid Build Coastguard Worker    switch (type) {
274*61046927SAndroid Build Coastguard Worker    default:
275*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_1D:
276*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
277*61046927SAndroid Build Coastguard Worker       return A6XX_TEX_1D;
278*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_2D:
279*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
280*61046927SAndroid Build Coastguard Worker       return A6XX_TEX_2D;
281*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_3D:
282*61046927SAndroid Build Coastguard Worker       return A6XX_TEX_3D;
283*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_CUBE:
284*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
285*61046927SAndroid Build Coastguard Worker       return storage ? A6XX_TEX_2D : A6XX_TEX_CUBE;
286*61046927SAndroid Build Coastguard Worker    }
287*61046927SAndroid Build Coastguard Worker }
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker static inline enum a6xx_tex_clamp
tu6_tex_wrap(VkSamplerAddressMode address_mode)290*61046927SAndroid Build Coastguard Worker tu6_tex_wrap(VkSamplerAddressMode address_mode)
291*61046927SAndroid Build Coastguard Worker {
292*61046927SAndroid Build Coastguard Worker    static const enum a6xx_tex_clamp lookup[] = {
293*61046927SAndroid Build Coastguard Worker       [VK_SAMPLER_ADDRESS_MODE_REPEAT]                = A6XX_TEX_REPEAT,
294*61046927SAndroid Build Coastguard Worker       [VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT]       = A6XX_TEX_MIRROR_REPEAT,
295*61046927SAndroid Build Coastguard Worker       [VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE]         = A6XX_TEX_CLAMP_TO_EDGE,
296*61046927SAndroid Build Coastguard Worker       [VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER]       = A6XX_TEX_CLAMP_TO_BORDER,
297*61046927SAndroid Build Coastguard Worker       [VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE]  = A6XX_TEX_MIRROR_CLAMP,
298*61046927SAndroid Build Coastguard Worker    };
299*61046927SAndroid Build Coastguard Worker    assert(address_mode < ARRAY_SIZE(lookup));
300*61046927SAndroid Build Coastguard Worker    return lookup[address_mode];
301*61046927SAndroid Build Coastguard Worker }
302*61046927SAndroid Build Coastguard Worker 
303*61046927SAndroid Build Coastguard Worker static inline enum a6xx_tex_filter
tu6_tex_filter(VkFilter filter,unsigned aniso)304*61046927SAndroid Build Coastguard Worker tu6_tex_filter(VkFilter filter, unsigned aniso)
305*61046927SAndroid Build Coastguard Worker {
306*61046927SAndroid Build Coastguard Worker    switch (filter) {
307*61046927SAndroid Build Coastguard Worker    case VK_FILTER_NEAREST:
308*61046927SAndroid Build Coastguard Worker       return A6XX_TEX_NEAREST;
309*61046927SAndroid Build Coastguard Worker    case VK_FILTER_LINEAR:
310*61046927SAndroid Build Coastguard Worker       return aniso ? A6XX_TEX_ANISO : A6XX_TEX_LINEAR;
311*61046927SAndroid Build Coastguard Worker    case VK_FILTER_CUBIC_EXT:
312*61046927SAndroid Build Coastguard Worker       return A6XX_TEX_CUBIC;
313*61046927SAndroid Build Coastguard Worker    default:
314*61046927SAndroid Build Coastguard Worker       unreachable("illegal texture filter");
315*61046927SAndroid Build Coastguard Worker       break;
316*61046927SAndroid Build Coastguard Worker    }
317*61046927SAndroid Build Coastguard Worker }
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker static inline enum a6xx_reduction_mode
tu6_reduction_mode(VkSamplerReductionMode reduction_mode)320*61046927SAndroid Build Coastguard Worker tu6_reduction_mode(VkSamplerReductionMode reduction_mode)
321*61046927SAndroid Build Coastguard Worker {
322*61046927SAndroid Build Coastguard Worker    return (enum a6xx_reduction_mode) reduction_mode;
323*61046927SAndroid Build Coastguard Worker }
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker static inline enum a6xx_depth_format
tu6_pipe2depth(VkFormat format)326*61046927SAndroid Build Coastguard Worker tu6_pipe2depth(VkFormat format)
327*61046927SAndroid Build Coastguard Worker {
328*61046927SAndroid Build Coastguard Worker    switch (format) {
329*61046927SAndroid Build Coastguard Worker    case VK_FORMAT_D16_UNORM:
330*61046927SAndroid Build Coastguard Worker       return DEPTH6_16;
331*61046927SAndroid Build Coastguard Worker    case VK_FORMAT_X8_D24_UNORM_PACK32:
332*61046927SAndroid Build Coastguard Worker    case VK_FORMAT_D24_UNORM_S8_UINT:
333*61046927SAndroid Build Coastguard Worker       return DEPTH6_24_8;
334*61046927SAndroid Build Coastguard Worker    case VK_FORMAT_D32_SFLOAT:
335*61046927SAndroid Build Coastguard Worker    case VK_FORMAT_D32_SFLOAT_S8_UINT:
336*61046927SAndroid Build Coastguard Worker    case VK_FORMAT_S8_UINT:
337*61046927SAndroid Build Coastguard Worker       return DEPTH6_32;
338*61046927SAndroid Build Coastguard Worker    default:
339*61046927SAndroid Build Coastguard Worker       return DEPTH6_NONE;
340*61046927SAndroid Build Coastguard Worker    }
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker static inline enum a6xx_polygon_mode
tu6_polygon_mode(VkPolygonMode mode)344*61046927SAndroid Build Coastguard Worker tu6_polygon_mode(VkPolygonMode mode)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker    switch (mode) {
347*61046927SAndroid Build Coastguard Worker    case VK_POLYGON_MODE_POINT:
348*61046927SAndroid Build Coastguard Worker       return POLYMODE6_POINTS;
349*61046927SAndroid Build Coastguard Worker    case VK_POLYGON_MODE_LINE:
350*61046927SAndroid Build Coastguard Worker       return POLYMODE6_LINES;
351*61046927SAndroid Build Coastguard Worker    case VK_POLYGON_MODE_FILL:
352*61046927SAndroid Build Coastguard Worker       return POLYMODE6_TRIANGLES;
353*61046927SAndroid Build Coastguard Worker    default:
354*61046927SAndroid Build Coastguard Worker       unreachable("bad polygon mode");
355*61046927SAndroid Build Coastguard Worker    }
356*61046927SAndroid Build Coastguard Worker }
357*61046927SAndroid Build Coastguard Worker 
358*61046927SAndroid Build Coastguard Worker struct bcolor_entry {
359*61046927SAndroid Build Coastguard Worker    alignas(128) uint32_t fp32[4];
360*61046927SAndroid Build Coastguard Worker    uint64_t ui16;
361*61046927SAndroid Build Coastguard Worker    uint64_t si16;
362*61046927SAndroid Build Coastguard Worker    uint64_t fp16;
363*61046927SAndroid Build Coastguard Worker    uint16_t rgb565;
364*61046927SAndroid Build Coastguard Worker    uint16_t rgb5a1;
365*61046927SAndroid Build Coastguard Worker    uint16_t rgba4;
366*61046927SAndroid Build Coastguard Worker    uint8_t __pad0[2];
367*61046927SAndroid Build Coastguard Worker    uint32_t ui8;
368*61046927SAndroid Build Coastguard Worker    uint32_t si8;
369*61046927SAndroid Build Coastguard Worker    uint32_t rgb10a2;
370*61046927SAndroid Build Coastguard Worker    uint32_t z24; /* also s8? */
371*61046927SAndroid Build Coastguard Worker    uint64_t srgb;
372*61046927SAndroid Build Coastguard Worker    uint8_t  __pad1[56];
373*61046927SAndroid Build Coastguard Worker };
374*61046927SAndroid Build Coastguard Worker static_assert(alignof(struct bcolor_entry) == 128, "");
375*61046927SAndroid Build Coastguard Worker 
376*61046927SAndroid Build Coastguard Worker /* vulkan does not want clamping of integer clear values, differs from u_format
377*61046927SAndroid Build Coastguard Worker  * see spec for VkClearColorValue
378*61046927SAndroid Build Coastguard Worker  */
379*61046927SAndroid Build Coastguard Worker static inline void
pack_int8(uint32_t * dst,const uint32_t * val)380*61046927SAndroid Build Coastguard Worker pack_int8(uint32_t *dst, const uint32_t *val)
381*61046927SAndroid Build Coastguard Worker {
382*61046927SAndroid Build Coastguard Worker    *dst = (val[0] & 0xff) |
383*61046927SAndroid Build Coastguard Worker           (val[1] & 0xff) << 8 |
384*61046927SAndroid Build Coastguard Worker           (val[2] & 0xff) << 16 |
385*61046927SAndroid Build Coastguard Worker           (val[3] & 0xff) << 24;
386*61046927SAndroid Build Coastguard Worker }
387*61046927SAndroid Build Coastguard Worker 
388*61046927SAndroid Build Coastguard Worker static inline void
pack_int10_2(uint32_t * dst,const uint32_t * val)389*61046927SAndroid Build Coastguard Worker pack_int10_2(uint32_t *dst, const uint32_t *val)
390*61046927SAndroid Build Coastguard Worker {
391*61046927SAndroid Build Coastguard Worker    *dst = (val[0] & 0x3ff) |
392*61046927SAndroid Build Coastguard Worker           (val[1] & 0x3ff) << 10 |
393*61046927SAndroid Build Coastguard Worker           (val[2] & 0x3ff) << 20 |
394*61046927SAndroid Build Coastguard Worker           (val[3] & 0x3)   << 30;
395*61046927SAndroid Build Coastguard Worker }
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker static inline void
pack_int16(uint32_t * dst,const uint32_t * val)398*61046927SAndroid Build Coastguard Worker pack_int16(uint32_t *dst, const uint32_t *val)
399*61046927SAndroid Build Coastguard Worker {
400*61046927SAndroid Build Coastguard Worker    dst[0] = (val[0] & 0xffff) |
401*61046927SAndroid Build Coastguard Worker             (val[1] & 0xffff) << 16;
402*61046927SAndroid Build Coastguard Worker    dst[1] = (val[2] & 0xffff) |
403*61046927SAndroid Build Coastguard Worker             (val[3] & 0xffff) << 16;
404*61046927SAndroid Build Coastguard Worker }
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker static inline void
tu6_pack_border_color(struct bcolor_entry * bcolor,const VkClearColorValue * val,bool is_int)407*61046927SAndroid Build Coastguard Worker tu6_pack_border_color(struct bcolor_entry *bcolor, const VkClearColorValue *val, bool is_int)
408*61046927SAndroid Build Coastguard Worker {
409*61046927SAndroid Build Coastguard Worker    memcpy(bcolor->fp32, val, 4 * sizeof(float));
410*61046927SAndroid Build Coastguard Worker    if (is_int) {
411*61046927SAndroid Build Coastguard Worker       pack_int16((uint32_t*) &bcolor->fp16, val->uint32);
412*61046927SAndroid Build Coastguard Worker       return;
413*61046927SAndroid Build Coastguard Worker    }
414*61046927SAndroid Build Coastguard Worker #define PACK_F(x, type) util_format_##type##_pack_rgba_float \
415*61046927SAndroid Build Coastguard Worker    ( (uint8_t*) (&bcolor->x), 0, val->float32, 0, 1, 1)
416*61046927SAndroid Build Coastguard Worker    PACK_F(ui16, r16g16b16a16_unorm);
417*61046927SAndroid Build Coastguard Worker    PACK_F(si16, r16g16b16a16_snorm);
418*61046927SAndroid Build Coastguard Worker    PACK_F(fp16, r16g16b16a16_float);
419*61046927SAndroid Build Coastguard Worker    PACK_F(rgb565, r5g6b5_unorm);
420*61046927SAndroid Build Coastguard Worker    PACK_F(rgb5a1, r5g5b5a1_unorm);
421*61046927SAndroid Build Coastguard Worker    PACK_F(rgba4, r4g4b4a4_unorm);
422*61046927SAndroid Build Coastguard Worker    PACK_F(ui8, r8g8b8a8_unorm);
423*61046927SAndroid Build Coastguard Worker    PACK_F(si8, r8g8b8a8_snorm);
424*61046927SAndroid Build Coastguard Worker    PACK_F(rgb10a2, r10g10b10a2_unorm);
425*61046927SAndroid Build Coastguard Worker    util_format_z24x8_unorm_pack_z_float((uint8_t*) &bcolor->z24,
426*61046927SAndroid Build Coastguard Worker                                         0, val->float32, 0, 1, 1);
427*61046927SAndroid Build Coastguard Worker    PACK_F(srgb, r16g16b16a16_float); /* TODO: clamp? */
428*61046927SAndroid Build Coastguard Worker #undef PACK_F
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker void
432*61046927SAndroid Build Coastguard Worker tu_dbg_log_gmem_load_store_skips(struct tu_device *device);
433*61046927SAndroid Build Coastguard Worker 
434*61046927SAndroid Build Coastguard Worker #define perf_debug(device, fmt, ...) do {                               \
435*61046927SAndroid Build Coastguard Worker    if (TU_DEBUG(PERF))                                                  \
436*61046927SAndroid Build Coastguard Worker       mesa_log(MESA_LOG_WARN, (MESA_LOG_TAG), (fmt), ##__VA_ARGS__);    \
437*61046927SAndroid Build Coastguard Worker } while(0)
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker #define sizeof_field(s, field) sizeof(((s *) NULL)->field)
440*61046927SAndroid Build Coastguard Worker 
441*61046927SAndroid Build Coastguard Worker #define offsetof_arr(s, field, idx)                                          \
442*61046927SAndroid Build Coastguard Worker    (offsetof(s, field) + sizeof_field(s, field[0]) * (idx))
443*61046927SAndroid Build Coastguard Worker 
444*61046927SAndroid Build Coastguard Worker #endif /* TU_UTIL_H */
445