xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/agx_tilebuffer.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Alyssa Rosenzweig
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 <assert.h>
9*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
10*61046927SAndroid Build Coastguard Worker #include <stdint.h>
11*61046927SAndroid Build Coastguard Worker #include "util/format/u_formats.h"
12*61046927SAndroid Build Coastguard Worker #include "agx_pack.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
15*61046927SAndroid Build Coastguard Worker extern "C" {
16*61046927SAndroid Build Coastguard Worker #endif
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker /* Maximum render targets per framebuffer. This is NOT architectural, but it
19*61046927SAndroid Build Coastguard Worker  * is the ~universal API limit so there's no point in allowing more.
20*61046927SAndroid Build Coastguard Worker  */
21*61046927SAndroid Build Coastguard Worker #define AGX_MAX_RENDER_TARGETS (8)
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker /* Forward declarations to keep the header lean */
24*61046927SAndroid Build Coastguard Worker struct nir_shader;
25*61046927SAndroid Build Coastguard Worker struct nir_def;
26*61046927SAndroid Build Coastguard Worker struct nir_builder;
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker struct agx_tile_size {
29*61046927SAndroid Build Coastguard Worker    uint8_t width;
30*61046927SAndroid Build Coastguard Worker    uint8_t height;
31*61046927SAndroid Build Coastguard Worker };
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker struct agx_tilebuffer_layout {
34*61046927SAndroid Build Coastguard Worker    /* Logical format of each render target. Use agx_tilebuffer_physical_format
35*61046927SAndroid Build Coastguard Worker     * to get the physical format.
36*61046927SAndroid Build Coastguard Worker     */
37*61046927SAndroid Build Coastguard Worker    enum pipe_format logical_format[AGX_MAX_RENDER_TARGETS];
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker    /* Which render targets are spilled. */
40*61046927SAndroid Build Coastguard Worker    bool spilled[AGX_MAX_RENDER_TARGETS];
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker    /* Offset into the sample of each render target. If a render target is
43*61046927SAndroid Build Coastguard Worker     * spilled, its offset is UNDEFINED. Use agx_tilebuffer_offset_B to access.
44*61046927SAndroid Build Coastguard Worker     */
45*61046927SAndroid Build Coastguard Worker    uint8_t _offset_B[AGX_MAX_RENDER_TARGETS];
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker    /* Total bytes per sample, rounded up as needed. Spilled render targets do
48*61046927SAndroid Build Coastguard Worker     * not count against this.
49*61046927SAndroid Build Coastguard Worker     */
50*61046927SAndroid Build Coastguard Worker    uint8_t sample_size_B;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    /* Number of samples per pixel */
53*61046927SAndroid Build Coastguard Worker    uint8_t nr_samples;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    /* If layered rendering is used */
56*61046927SAndroid Build Coastguard Worker    bool layered;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    /* Selected tile size */
59*61046927SAndroid Build Coastguard Worker    struct agx_tile_size tile_size;
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    /* USC word corresponding to this configuration of the tilebuffer */
62*61046927SAndroid Build Coastguard Worker    struct agx_usc_shared_packed usc;
63*61046927SAndroid Build Coastguard Worker };
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker /*
66*61046927SAndroid Build Coastguard Worker  * _offset_B is undefined for non-spilled render targets. This safe accessor
67*61046927SAndroid Build Coastguard Worker  * asserts that render targets are not spilled rather than returning garbage.
68*61046927SAndroid Build Coastguard Worker  */
69*61046927SAndroid Build Coastguard Worker static inline uint8_t
agx_tilebuffer_offset_B(struct agx_tilebuffer_layout * layout,unsigned rt)70*61046927SAndroid Build Coastguard Worker agx_tilebuffer_offset_B(struct agx_tilebuffer_layout *layout, unsigned rt)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    assert(rt < AGX_MAX_RENDER_TARGETS);
73*61046927SAndroid Build Coastguard Worker    assert(!layout->spilled[rt] && "precondition");
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker    return layout->_offset_B[rt];
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker static inline bool
agx_tilebuffer_spills(struct agx_tilebuffer_layout * layout)79*61046927SAndroid Build Coastguard Worker agx_tilebuffer_spills(struct agx_tilebuffer_layout *layout)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker    for (unsigned rt = 0; rt < AGX_MAX_RENDER_TARGETS; ++rt) {
82*61046927SAndroid Build Coastguard Worker       if (layout->spilled[rt])
83*61046927SAndroid Build Coastguard Worker          return true;
84*61046927SAndroid Build Coastguard Worker    }
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    return false;
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker struct agx_tilebuffer_layout
90*61046927SAndroid Build Coastguard Worker agx_build_tilebuffer_layout(const enum pipe_format *formats, uint8_t nr_cbufs,
91*61046927SAndroid Build Coastguard Worker                             uint8_t nr_samples, bool layered);
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_tilebuffer(struct nir_shader *shader,
94*61046927SAndroid Build Coastguard Worker                               struct agx_tilebuffer_layout *tib,
95*61046927SAndroid Build Coastguard Worker                               uint8_t *colormasks, unsigned *bindless_base,
96*61046927SAndroid Build Coastguard Worker                               struct nir_def *write_samples, bool *translucent);
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_to_per_sample(struct nir_shader *shader);
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_monolithic_msaa(struct nir_shader *shader,
101*61046927SAndroid Build Coastguard Worker                                    uint8_t nr_samples);
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_sample_intrinsics(struct nir_shader *shader,
104*61046927SAndroid Build Coastguard Worker                                      bool ignore_sample_mask_without_msaa);
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_alpha_to_coverage(struct nir_shader *shader,
107*61046927SAndroid Build Coastguard Worker                                      uint8_t nr_samples);
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_alpha_to_one(struct nir_shader *shader);
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker uint32_t agx_tilebuffer_total_size(struct agx_tilebuffer_layout *tib);
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker enum pipe_format
114*61046927SAndroid Build Coastguard Worker agx_tilebuffer_physical_format(struct agx_tilebuffer_layout *tib, unsigned rt);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker bool agx_tilebuffer_supports_mask(struct agx_tilebuffer_layout *tib,
117*61046927SAndroid Build Coastguard Worker                                   unsigned rt);
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker void agx_tilebuffer_pack_usc(struct agx_tilebuffer_layout *tib);
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
122*61046927SAndroid Build Coastguard Worker } /* extern C */
123*61046927SAndroid Build Coastguard Worker #endif
124