2 * Copyright 2020 Valve Corporation
3 * SPDX-License-Identifier: MIT
6 * Jonathan Marek <jonathan@marek.ca>
15 #include "util/macros.h"
16 #include "util/u_math.h"
17 #include "util/format/u_format_pack.h"
18 #include "util/format/u_format_zs.h"
19 #include "compiler/shader_enums.h"
21 #include "adreno_common.xml.h"
22 #include "adreno_pm4.xml.h"
25 #include <vulkan/vulkan.h>
27 static inline gl_shader_stage
28 vk_to_mesa_shader_stage(VkShaderStageFlagBits vk_stage
)
30 assert(__builtin_popcount(vk_stage
) == 1);
31 return util_logbase2(vk_stage
);
34 static inline VkShaderStageFlagBits
35 mesa_to_vk_shader_stage(gl_shader_stage mesa_stage
)
37 return 1 << mesa_stage
;
40 #define TU_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)
42 #define tu_foreach_stage(stage, stage_bits) \
43 for (gl_shader_stage stage, \
44 __tmp = (gl_shader_stage)((stage_bits) &TU_STAGE_MASK); \
45 stage = __builtin_ffs(__tmp) - 1, __tmp; __tmp &= ~(1 << (stage)))
47 static inline enum a3xx_msaa_samples
48 tu_msaa_samples(VkSampleCountFlagBits samples
)
50 assert(__builtin_popcount(samples
) == 1);
51 return util_logbase2(samples
);
54 static inline uint32_t
55 tu6_stage2opcode(gl_shader_stage stage
)
57 if (stage
== MESA_SHADER_FRAGMENT
|| stage
== MESA_SHADER_COMPUTE
)
58 return CP_LOAD_STATE6_FRAG
;
59 return CP_LOAD_STATE6_GEOM
;
62 static inline enum a6xx_state_block
63 tu6_stage2texsb(gl_shader_stage stage
)
65 return SB6_VS_TEX
+ stage
;
68 static inline enum a6xx_state_block
69 tu6_stage2shadersb(gl_shader_stage stage
)
71 return SB6_VS_SHADER
+ stage
;
74 static inline enum a3xx_rop_code
77 /* note: hw enum matches the VK enum, but with the 4 bits reversed */
78 static const uint8_t lookup
[] = {
79 [VK_LOGIC_OP_CLEAR
] = ROP_CLEAR
,
80 [VK_LOGIC_OP_AND
] = ROP_AND
,
81 [VK_LOGIC_OP_AND_REVERSE
] = ROP_AND_REVERSE
,
82 [VK_LOGIC_OP_COPY
] = ROP_COPY
,
83 [VK_LOGIC_OP_AND_INVERTED
] = ROP_AND_INVERTED
,
84 [VK_LOGIC_OP_NO_OP
] = ROP_NOOP
,
85 [VK_LOGIC_OP_XOR
] = ROP_XOR
,
86 [VK_LOGIC_OP_OR
] = ROP_OR
,
87 [VK_LOGIC_OP_NOR
] = ROP_NOR
,
88 [VK_LOGIC_OP_EQUIVALENT
] = ROP_EQUIV
,
89 [VK_LOGIC_OP_INVERT
] = ROP_INVERT
,
90 [VK_LOGIC_OP_OR_REVERSE
] = ROP_OR_REVERSE
,
91 [VK_LOGIC_OP_COPY_INVERTED
] = ROP_COPY_INVERTED
,
92 [VK_LOGIC_OP_OR_INVERTED
] = ROP_OR_INVERTED
,
93 [VK_LOGIC_OP_NAND
] = ROP_NAND
,
94 [VK_LOGIC_OP_SET
] = ROP_SET
,
96 assert(op
< ARRAY_SIZE(lookup
));
100 static inline enum pc_di_primtype
101 tu6_primtype(VkPrimitiveTopology topology
)
103 static const uint8_t lookup
[] = {
104 [VK_PRIMITIVE_TOPOLOGY_POINT_LIST
] = DI_PT_POINTLIST
,
105 [VK_PRIMITIVE_TOPOLOGY_LINE_LIST
] = DI_PT_LINELIST
,
106 [VK_PRIMITIVE_TOPOLOGY_LINE_STRIP
] = DI_PT_LINESTRIP
,
107 [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
] = DI_PT_TRILIST
,
108 [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
] = DI_PT_TRISTRIP
,
109 [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN
] = DI_PT_TRIFAN
,
110 [VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY
] = DI_PT_LINE_ADJ
,
111 [VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY
] = DI_PT_LINESTRIP_ADJ
,
112 [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY
] = DI_PT_TRI_ADJ
,
113 [VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY
] = DI_PT_TRISTRIP_ADJ
,
114 /* Return PATCH0 and update in tu_pipeline_builder_parse_tessellation */
115 [VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
] = DI_PT_PATCHES0
,
117 assert(topology
< ARRAY_SIZE(lookup
));
118 return lookup
[topology
];
121 static inline enum adreno_compare_func
122 tu6_compare_func(VkCompareOp op
)
124 return (enum adreno_compare_func
) op
;
127 static inline enum adreno_stencil_op
128 tu6_stencil_op(VkStencilOp op
)
130 return (enum adreno_stencil_op
) op
;
133 static inline enum adreno_rb_blend_factor
134 tu6_blend_factor(VkBlendFactor factor
)
136 static const uint8_t lookup
[] = {
137 [VK_BLEND_FACTOR_ZERO
] = FACTOR_ZERO
,
138 [VK_BLEND_FACTOR_ONE
] = FACTOR_ONE
,
139 [VK_BLEND_FACTOR_SRC_COLOR
] = FACTOR_SRC_COLOR
,
140 [VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR
] = FACTOR_ONE_MINUS_SRC_COLOR
,
141 [VK_BLEND_FACTOR_DST_COLOR
] = FACTOR_DST_COLOR
,
142 [VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR
] = FACTOR_ONE_MINUS_DST_COLOR
,
143 [VK_BLEND_FACTOR_SRC_ALPHA
] = FACTOR_SRC_ALPHA
,
144 [VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA
] = FACTOR_ONE_MINUS_SRC_ALPHA
,
145 [VK_BLEND_FACTOR_DST_ALPHA
] = FACTOR_DST_ALPHA
,
146 [VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA
] = FACTOR_ONE_MINUS_DST_ALPHA
,
147 [VK_BLEND_FACTOR_CONSTANT_COLOR
] = FACTOR_CONSTANT_COLOR
,
148 [VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR
]= FACTOR_ONE_MINUS_CONSTANT_COLOR
,
149 [VK_BLEND_FACTOR_CONSTANT_ALPHA
] = FACTOR_CONSTANT_ALPHA
,
150 [VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA
]= FACTOR_ONE_MINUS_CONSTANT_ALPHA
,
151 [VK_BLEND_FACTOR_SRC_ALPHA_SATURATE
] = FACTOR_SRC_ALPHA_SATURATE
,
152 [VK_BLEND_FACTOR_SRC1_COLOR
] = FACTOR_SRC1_COLOR
,
153 [VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR
] = FACTOR_ONE_MINUS_SRC1_COLOR
,
154 [VK_BLEND_FACTOR_SRC1_ALPHA
] = FACTOR_SRC1_ALPHA
,
155 [VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA
] = FACTOR_ONE_MINUS_SRC1_ALPHA
,
157 assert(factor
< ARRAY_SIZE(lookup
));
158 return lookup
[factor
];
161 static inline enum a3xx_rb_blend_opcode
162 tu6_blend_op(VkBlendOp op
)
164 return (enum a3xx_rb_blend_opcode
) op
;
167 static inline enum a6xx_tex_type
168 tu6_tex_type(VkImageViewType type
, bool storage
)
172 case VK_IMAGE_VIEW_TYPE_1D
:
173 case VK_IMAGE_VIEW_TYPE_1D_ARRAY
:
175 case VK_IMAGE_VIEW_TYPE_2D
:
176 case VK_IMAGE_VIEW_TYPE_2D_ARRAY
:
178 case VK_IMAGE_VIEW_TYPE_3D
:
180 case VK_IMAGE_VIEW_TYPE_CUBE
:
181 case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
:
182 return storage
? A6XX_TEX_2D
: A6XX_TEX_CUBE
;
186 static inline enum a6xx_tex_clamp
187 tu6_tex_wrap(VkSamplerAddressMode address_mode
)
190 [VK_SAMPLER_ADDRESS_MODE_REPEAT
] = A6XX_TEX_REPEAT
,
191 [VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT
] = A6XX_TEX_MIRROR_REPEAT
,
192 [VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
] = A6XX_TEX_CLAMP_TO_EDGE
,
193 [VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
] = A6XX_TEX_CLAMP_TO_BORDER
,
194 [VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
] = A6XX_TEX_MIRROR_CLAMP
,
196 assert(address_mode
< ARRAY_SIZE(lookup
));
197 return lookup
[address_mode
];
200 static inline enum a6xx_tex_filter
201 tu6_tex_filter(VkFilter filter
, unsigned aniso
)
204 case VK_FILTER_NEAREST
:
205 return A6XX_TEX_NEAREST
;
206 case VK_FILTER_LINEAR
:
207 return aniso
? A6XX_TEX_ANISO
: A6XX_TEX_LINEAR
;
208 case VK_FILTER_CUBIC_EXT
:
209 return A6XX_TEX_CUBIC
;
211 unreachable("illegal texture filter");
216 static inline enum a6xx_reduction_mode
217 tu6_reduction_mode(VkSamplerReductionMode reduction_mode
)
219 return (enum a6xx_reduction_mode
) reduction_mode
;
222 static inline enum a6xx_depth_format
223 tu6_pipe2depth(VkFormat format
)
226 case VK_FORMAT_D16_UNORM
:
228 case VK_FORMAT_X8_D24_UNORM_PACK32
:
229 case VK_FORMAT_D24_UNORM_S8_UINT
:
231 case VK_FORMAT_D32_SFLOAT
:
232 case VK_FORMAT_D32_SFLOAT_S8_UINT
:
233 case VK_FORMAT_S8_UINT
:
240 static inline enum a6xx_polygon_mode
241 tu6_polygon_mode(VkPolygonMode mode
)
244 case VK_POLYGON_MODE_POINT
:
245 return POLYMODE6_POINTS
;
246 case VK_POLYGON_MODE_LINE
:
247 return POLYMODE6_LINES
;
248 case VK_POLYGON_MODE_FILL
:
249 return POLYMODE6_TRIANGLES
;
251 unreachable("bad polygon mode");
255 struct bcolor_entry
{
267 uint32_t z24
; /* also s8? */
270 } __attribute__((aligned(128)));
272 /* vulkan does not want clamping of integer clear values, differs from u_format
273 * see spec for VkClearColorValue
276 pack_int8(uint32_t *dst
, const uint32_t *val
)
278 *dst
= (val
[0] & 0xff) |
279 (val
[1] & 0xff) << 8 |
280 (val
[2] & 0xff) << 16 |
281 (val
[3] & 0xff) << 24;
285 pack_int10_2(uint32_t *dst
, const uint32_t *val
)
287 *dst
= (val
[0] & 0x3ff) |
288 (val
[1] & 0x3ff) << 10 |
289 (val
[2] & 0x3ff) << 20 |
290 (val
[3] & 0x3) << 30;
294 pack_int16(uint32_t *dst
, const uint32_t *val
)
296 dst
[0] = (val
[0] & 0xffff) |
297 (val
[1] & 0xffff) << 16;
298 dst
[1] = (val
[2] & 0xffff) |
299 (val
[3] & 0xffff) << 16;
303 tu6_pack_border_color(struct bcolor_entry
*bcolor
, const VkClearColorValue
*val
, bool is_int
)
305 memcpy(bcolor
->fp32
, val
, 4 * sizeof(float));
307 pack_int16((uint32_t*) &bcolor
->fp16
, val
->uint32
);
310 #define PACK_F(x, type) util_format_##type##_pack_rgba_float \
311 ( (uint8_t*) (&bcolor->x), 0, val->float32, 0, 1, 1)
312 PACK_F(ui16
, r16g16b16a16_unorm
);
313 PACK_F(si16
, r16g16b16a16_snorm
);
314 PACK_F(fp16
, r16g16b16a16_float
);
315 PACK_F(rgb565
, r5g6b5_unorm
);
316 PACK_F(rgb5a1
, r5g5b5a1_unorm
);
317 PACK_F(rgba4
, r4g4b4a4_unorm
);
318 PACK_F(ui8
, r8g8b8a8_unorm
);
319 PACK_F(si8
, r8g8b8a8_snorm
);
320 PACK_F(rgb10a2
, r10g10b10a2_unorm
);
321 util_format_x8z24_unorm_pack_z_float((uint8_t*) &bcolor
->z24
,
322 0, val
->float32
, 0, 1, 1);
323 PACK_F(srgb
, r16g16b16a16_float
); /* TODO: clamp? */
327 #endif /* TU_UTIL_H */