Path: blob/21.2-virgl/src/freedreno/vulkan/tu_util.h
4565 views
/*1* Copyright 2020 Valve Corporation2* SPDX-License-Identifier: MIT3*4* Authors:5* Jonathan Marek <[email protected]>6*/78#ifndef TU_UTIL_H9#define TU_UTIL_H1011#include <assert.h>12#include <stdint.h>1314#include "util/macros.h"15#include "util/u_math.h"16#include "util/format/u_format_pack.h"17#include "util/format/u_format_zs.h"18#include "compiler/shader_enums.h"1920#include "adreno_common.xml.h"21#include "adreno_pm4.xml.h"22#include "a6xx.xml.h"2324#include <vulkan/vulkan.h>25#include "vk_util.h"2627#define TU_STAGE_MASK ((1 << MESA_SHADER_STAGES) - 1)2829#define tu_foreach_stage(stage, stage_bits) \30for (gl_shader_stage stage, \31__tmp = (gl_shader_stage)((stage_bits) &TU_STAGE_MASK); \32stage = __builtin_ffs(__tmp) - 1, __tmp; __tmp &= ~(1 << (stage)))3334static inline enum a3xx_msaa_samples35tu_msaa_samples(uint32_t samples)36{37assert(__builtin_popcount(samples) == 1);38return util_logbase2(samples);39}4041static inline uint32_t42tu6_stage2opcode(gl_shader_stage stage)43{44if (stage == MESA_SHADER_FRAGMENT || stage == MESA_SHADER_COMPUTE)45return CP_LOAD_STATE6_FRAG;46return CP_LOAD_STATE6_GEOM;47}4849static inline enum a6xx_state_block50tu6_stage2texsb(gl_shader_stage stage)51{52return SB6_VS_TEX + stage;53}5455static inline enum a6xx_state_block56tu6_stage2shadersb(gl_shader_stage stage)57{58return SB6_VS_SHADER + stage;59}6061static inline enum a3xx_rop_code62tu6_rop(VkLogicOp op)63{64/* note: hw enum matches the VK enum, but with the 4 bits reversed */65static const uint8_t lookup[] = {66[VK_LOGIC_OP_CLEAR] = ROP_CLEAR,67[VK_LOGIC_OP_AND] = ROP_AND,68[VK_LOGIC_OP_AND_REVERSE] = ROP_AND_REVERSE,69[VK_LOGIC_OP_COPY] = ROP_COPY,70[VK_LOGIC_OP_AND_INVERTED] = ROP_AND_INVERTED,71[VK_LOGIC_OP_NO_OP] = ROP_NOOP,72[VK_LOGIC_OP_XOR] = ROP_XOR,73[VK_LOGIC_OP_OR] = ROP_OR,74[VK_LOGIC_OP_NOR] = ROP_NOR,75[VK_LOGIC_OP_EQUIVALENT] = ROP_EQUIV,76[VK_LOGIC_OP_INVERT] = ROP_INVERT,77[VK_LOGIC_OP_OR_REVERSE] = ROP_OR_REVERSE,78[VK_LOGIC_OP_COPY_INVERTED] = ROP_COPY_INVERTED,79[VK_LOGIC_OP_OR_INVERTED] = ROP_OR_INVERTED,80[VK_LOGIC_OP_NAND] = ROP_NAND,81[VK_LOGIC_OP_SET] = ROP_SET,82};83assert(op < ARRAY_SIZE(lookup));84return lookup[op];85}8687static inline enum pc_di_primtype88tu6_primtype(VkPrimitiveTopology topology)89{90static const uint8_t lookup[] = {91[VK_PRIMITIVE_TOPOLOGY_POINT_LIST] = DI_PT_POINTLIST,92[VK_PRIMITIVE_TOPOLOGY_LINE_LIST] = DI_PT_LINELIST,93[VK_PRIMITIVE_TOPOLOGY_LINE_STRIP] = DI_PT_LINESTRIP,94[VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST] = DI_PT_TRILIST,95[VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP] = DI_PT_TRISTRIP,96[VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN] = DI_PT_TRIFAN,97[VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY] = DI_PT_LINE_ADJ,98[VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY] = DI_PT_LINESTRIP_ADJ,99[VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY] = DI_PT_TRI_ADJ,100[VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY] = DI_PT_TRISTRIP_ADJ,101/* Return PATCH0 and update in tu_pipeline_builder_parse_tessellation */102[VK_PRIMITIVE_TOPOLOGY_PATCH_LIST] = DI_PT_PATCHES0,103};104assert(topology < ARRAY_SIZE(lookup));105return lookup[topology];106}107108static inline enum adreno_compare_func109tu6_compare_func(VkCompareOp op)110{111return (enum adreno_compare_func) op;112}113114static inline enum adreno_stencil_op115tu6_stencil_op(VkStencilOp op)116{117return (enum adreno_stencil_op) op;118}119120static inline enum adreno_rb_blend_factor121tu6_blend_factor(VkBlendFactor factor)122{123static const uint8_t lookup[] = {124[VK_BLEND_FACTOR_ZERO] = FACTOR_ZERO,125[VK_BLEND_FACTOR_ONE] = FACTOR_ONE,126[VK_BLEND_FACTOR_SRC_COLOR] = FACTOR_SRC_COLOR,127[VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR] = FACTOR_ONE_MINUS_SRC_COLOR,128[VK_BLEND_FACTOR_DST_COLOR] = FACTOR_DST_COLOR,129[VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR] = FACTOR_ONE_MINUS_DST_COLOR,130[VK_BLEND_FACTOR_SRC_ALPHA] = FACTOR_SRC_ALPHA,131[VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA] = FACTOR_ONE_MINUS_SRC_ALPHA,132[VK_BLEND_FACTOR_DST_ALPHA] = FACTOR_DST_ALPHA,133[VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA] = FACTOR_ONE_MINUS_DST_ALPHA,134[VK_BLEND_FACTOR_CONSTANT_COLOR] = FACTOR_CONSTANT_COLOR,135[VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR]= FACTOR_ONE_MINUS_CONSTANT_COLOR,136[VK_BLEND_FACTOR_CONSTANT_ALPHA] = FACTOR_CONSTANT_ALPHA,137[VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA]= FACTOR_ONE_MINUS_CONSTANT_ALPHA,138[VK_BLEND_FACTOR_SRC_ALPHA_SATURATE] = FACTOR_SRC_ALPHA_SATURATE,139[VK_BLEND_FACTOR_SRC1_COLOR] = FACTOR_SRC1_COLOR,140[VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR] = FACTOR_ONE_MINUS_SRC1_COLOR,141[VK_BLEND_FACTOR_SRC1_ALPHA] = FACTOR_SRC1_ALPHA,142[VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA] = FACTOR_ONE_MINUS_SRC1_ALPHA,143};144assert(factor < ARRAY_SIZE(lookup));145return lookup[factor];146}147148static inline enum a3xx_rb_blend_opcode149tu6_blend_op(VkBlendOp op)150{151return (enum a3xx_rb_blend_opcode) op;152}153154static inline enum a6xx_tex_type155tu6_tex_type(VkImageViewType type, bool storage)156{157switch (type) {158default:159case VK_IMAGE_VIEW_TYPE_1D:160case VK_IMAGE_VIEW_TYPE_1D_ARRAY:161return A6XX_TEX_1D;162case VK_IMAGE_VIEW_TYPE_2D:163case VK_IMAGE_VIEW_TYPE_2D_ARRAY:164return A6XX_TEX_2D;165case VK_IMAGE_VIEW_TYPE_3D:166return A6XX_TEX_3D;167case VK_IMAGE_VIEW_TYPE_CUBE:168case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:169return storage ? A6XX_TEX_2D : A6XX_TEX_CUBE;170}171}172173static inline enum a6xx_tex_clamp174tu6_tex_wrap(VkSamplerAddressMode address_mode)175{176uint8_t lookup[] = {177[VK_SAMPLER_ADDRESS_MODE_REPEAT] = A6XX_TEX_REPEAT,178[VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT] = A6XX_TEX_MIRROR_REPEAT,179[VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE] = A6XX_TEX_CLAMP_TO_EDGE,180[VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER] = A6XX_TEX_CLAMP_TO_BORDER,181[VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE] = A6XX_TEX_MIRROR_CLAMP,182};183assert(address_mode < ARRAY_SIZE(lookup));184return lookup[address_mode];185}186187static inline enum a6xx_tex_filter188tu6_tex_filter(VkFilter filter, unsigned aniso)189{190switch (filter) {191case VK_FILTER_NEAREST:192return A6XX_TEX_NEAREST;193case VK_FILTER_LINEAR:194return aniso ? A6XX_TEX_ANISO : A6XX_TEX_LINEAR;195case VK_FILTER_CUBIC_EXT:196return A6XX_TEX_CUBIC;197default:198unreachable("illegal texture filter");199break;200}201}202203static inline enum a6xx_reduction_mode204tu6_reduction_mode(VkSamplerReductionMode reduction_mode)205{206return (enum a6xx_reduction_mode) reduction_mode;207}208209static inline enum a6xx_depth_format210tu6_pipe2depth(VkFormat format)211{212switch (format) {213case VK_FORMAT_D16_UNORM:214return DEPTH6_16;215case VK_FORMAT_X8_D24_UNORM_PACK32:216case VK_FORMAT_D24_UNORM_S8_UINT:217return DEPTH6_24_8;218case VK_FORMAT_D32_SFLOAT:219case VK_FORMAT_D32_SFLOAT_S8_UINT:220case VK_FORMAT_S8_UINT:221return DEPTH6_32;222default:223return ~0;224}225}226227static inline enum a6xx_polygon_mode228tu6_polygon_mode(VkPolygonMode mode)229{230switch (mode) {231case VK_POLYGON_MODE_POINT:232return POLYMODE6_POINTS;233case VK_POLYGON_MODE_LINE:234return POLYMODE6_LINES;235case VK_POLYGON_MODE_FILL:236return POLYMODE6_TRIANGLES;237default:238unreachable("bad polygon mode");239}240}241242struct bcolor_entry {243uint32_t fp32[4];244uint64_t ui16;245uint64_t si16;246uint64_t fp16;247uint16_t rgb565;248uint16_t rgb5a1;249uint16_t rgba4;250uint8_t __pad0[2];251uint32_t ui8;252uint32_t si8;253uint32_t rgb10a2;254uint32_t z24; /* also s8? */255uint64_t srgb;256uint8_t __pad1[56];257} __attribute__((aligned(128)));258259/* vulkan does not want clamping of integer clear values, differs from u_format260* see spec for VkClearColorValue261*/262static inline void263pack_int8(uint32_t *dst, const uint32_t *val)264{265*dst = (val[0] & 0xff) |266(val[1] & 0xff) << 8 |267(val[2] & 0xff) << 16 |268(val[3] & 0xff) << 24;269}270271static inline void272pack_int10_2(uint32_t *dst, const uint32_t *val)273{274*dst = (val[0] & 0x3ff) |275(val[1] & 0x3ff) << 10 |276(val[2] & 0x3ff) << 20 |277(val[3] & 0x3) << 30;278}279280static inline void281pack_int16(uint32_t *dst, const uint32_t *val)282{283dst[0] = (val[0] & 0xffff) |284(val[1] & 0xffff) << 16;285dst[1] = (val[2] & 0xffff) |286(val[3] & 0xffff) << 16;287}288289static inline void290tu6_pack_border_color(struct bcolor_entry *bcolor, const VkClearColorValue *val, bool is_int)291{292memcpy(bcolor->fp32, val, 4 * sizeof(float));293if (is_int) {294pack_int16((uint32_t*) &bcolor->fp16, val->uint32);295return;296}297#define PACK_F(x, type) util_format_##type##_pack_rgba_float \298( (uint8_t*) (&bcolor->x), 0, val->float32, 0, 1, 1)299PACK_F(ui16, r16g16b16a16_unorm);300PACK_F(si16, r16g16b16a16_snorm);301PACK_F(fp16, r16g16b16a16_float);302PACK_F(rgb565, r5g6b5_unorm);303PACK_F(rgb5a1, r5g5b5a1_unorm);304PACK_F(rgba4, r4g4b4a4_unorm);305PACK_F(ui8, r8g8b8a8_unorm);306PACK_F(si8, r8g8b8a8_snorm);307PACK_F(rgb10a2, r10g10b10a2_unorm);308util_format_x8z24_unorm_pack_z_float((uint8_t*) &bcolor->z24,3090, val->float32, 0, 1, 1);310PACK_F(srgb, r16g16b16a16_float); /* TODO: clamp? */311#undef PACK_F312}313314#endif /* TU_UTIL_H */315316317