xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/agx_uvs.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #pragma once
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <stdint.h>
9*61046927SAndroid Build Coastguard Worker #include "agx_pack.h"
10*61046927SAndroid Build Coastguard Worker #include "shader_enums.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker struct nir_shader;
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker /* Matches the hardware order */
15*61046927SAndroid Build Coastguard Worker enum uvs_group {
16*61046927SAndroid Build Coastguard Worker    UVS_POSITION,
17*61046927SAndroid Build Coastguard Worker    UVS_VARYINGS,
18*61046927SAndroid Build Coastguard Worker    UVS_PSIZ,
19*61046927SAndroid Build Coastguard Worker    UVS_LAYER_VIEWPORT,
20*61046927SAndroid Build Coastguard Worker    UVS_CLIP_DIST,
21*61046927SAndroid Build Coastguard Worker    UVS_NUM_GROUP,
22*61046927SAndroid Build Coastguard Worker };
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker /**
25*61046927SAndroid Build Coastguard Worker  * Represents an "unlinked" UVS layout. This is computable from an unlinked
26*61046927SAndroid Build Coastguard Worker  * vertex shader without knowing the associated fragment shader. The various UVS
27*61046927SAndroid Build Coastguard Worker  * groups have fixed offsets, but the varyings within the varying group have
28*61046927SAndroid Build Coastguard Worker  * indeterminate order since we don't yet know the fragment shader interpolation
29*61046927SAndroid Build Coastguard Worker  * qualifiers.
30*61046927SAndroid Build Coastguard Worker  */
31*61046927SAndroid Build Coastguard Worker struct agx_unlinked_uvs_layout {
32*61046927SAndroid Build Coastguard Worker    /* Bit i set <===> components[i] != 0 && i != POS && i != PSIZ. For fast
33*61046927SAndroid Build Coastguard Worker     * iteration of user varyings.
34*61046927SAndroid Build Coastguard Worker     */
35*61046927SAndroid Build Coastguard Worker    uint64_t written;
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker    /* Fully packed data structure */
38*61046927SAndroid Build Coastguard Worker    struct agx_vdm_state_vertex_outputs_packed vdm;
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    /* Partial data structure, must be merged with FS selects */
41*61046927SAndroid Build Coastguard Worker    struct agx_output_select_packed osel;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    /* Offset of each group in the UVS in words. */
44*61046927SAndroid Build Coastguard Worker    uint8_t group_offs[UVS_NUM_GROUP];
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker    /* Size of the UVS allocation in words. >= last group_offs element */
47*61046927SAndroid Build Coastguard Worker    uint8_t size;
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker    /* Size of the UVS_VARYINGS */
50*61046927SAndroid Build Coastguard Worker    uint8_t user_size;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    uint8_t pad;
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    /* Number of 32-bit components written for each slot. TODO: Model 16-bit.
55*61046927SAndroid Build Coastguard Worker     *
56*61046927SAndroid Build Coastguard Worker     * Invariant: sum_{slot} (components[slot]) =
57*61046927SAndroid Build Coastguard Worker     *            group_offs[PSIZ] - group_offs[VARYINGS]
58*61046927SAndroid Build Coastguard Worker     */
59*61046927SAndroid Build Coastguard Worker    uint8_t components[VARYING_SLOT_MAX];
60*61046927SAndroid Build Coastguard Worker };
61*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct agx_unlinked_uvs_layout) == 88, "packed");
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_uvs(struct nir_shader *s,
64*61046927SAndroid Build Coastguard Worker                        struct agx_unlinked_uvs_layout *layout);
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker /**
67*61046927SAndroid Build Coastguard Worker  * Represents a linked UVS layout.
68*61046927SAndroid Build Coastguard Worker  */
69*61046927SAndroid Build Coastguard Worker struct agx_varyings_vs {
70*61046927SAndroid Build Coastguard Worker    /* Associated linked hardware data structures */
71*61046927SAndroid Build Coastguard Worker    struct agx_varying_counts_packed counts_32, counts_16;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    /* If the user varying slot is written, this is the base index that the first
74*61046927SAndroid Build Coastguard Worker     * component of the slot is written to. The next components are found in the
75*61046927SAndroid Build Coastguard Worker     * next indices. Otherwise 0, aliasing position.
76*61046927SAndroid Build Coastguard Worker     */
77*61046927SAndroid Build Coastguard Worker    unsigned slots[VARYING_SLOT_MAX];
78*61046927SAndroid Build Coastguard Worker };
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker void agx_assign_uvs(struct agx_varyings_vs *varyings,
81*61046927SAndroid Build Coastguard Worker                     struct agx_unlinked_uvs_layout *layout, uint64_t flat_mask,
82*61046927SAndroid Build Coastguard Worker                     uint64_t linear_mask);
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker struct agx_varyings_fs;
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker void agx_link_varyings_vs_fs(void *out, struct agx_varyings_vs *vs,
87*61046927SAndroid Build Coastguard Worker                              unsigned nr_user_indices,
88*61046927SAndroid Build Coastguard Worker                              struct agx_varyings_fs *fs,
89*61046927SAndroid Build Coastguard Worker                              unsigned provoking_vertex,
90*61046927SAndroid Build Coastguard Worker                              uint8_t sprite_coord_enable,
91*61046927SAndroid Build Coastguard Worker                              bool *generate_primitive_id);
92