xref: /aosp_15_r20/external/mesa3d/src/imagination/vulkan/pvr_spm.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2023 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
5*61046927SAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to deal
6*61046927SAndroid Build Coastguard Worker  * in the Software without restriction, including without limitation the rights
7*61046927SAndroid Build Coastguard Worker  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*61046927SAndroid Build Coastguard Worker  * copies of the Software, and to permit persons to whom the Software is
9*61046927SAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18*61046927SAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef PVR_SPM_H
25*61046927SAndroid Build Coastguard Worker #define PVR_SPM_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker /**
28*61046927SAndroid Build Coastguard Worker  * \file pvr_spm.h
29*61046927SAndroid Build Coastguard Worker  *
30*61046927SAndroid Build Coastguard Worker  * \brief Smart Parameter Management.
31*61046927SAndroid Build Coastguard Worker  *
32*61046927SAndroid Build Coastguard Worker  * With large amounts of geometry the device can run out of Parameter Buffer
33*61046927SAndroid Build Coastguard Worker  * (PB) as no more free pages are left in the freelist to allow the PB to grow.
34*61046927SAndroid Build Coastguard Worker  * In such cases the render is split into multiple partial renders (PRs) to fit
35*61046927SAndroid Build Coastguard Worker  * within the memory constraints. Each PR produces intermediary results until
36*61046927SAndroid Build Coastguard Worker  * they have all completed, producing the final scene equivalent to what would
37*61046927SAndroid Build Coastguard Worker  * have been produced by the original render.
38*61046927SAndroid Build Coastguard Worker  *
39*61046927SAndroid Build Coastguard Worker  * SPM comprises all the necessary work required of the driver to manage the PB.
40*61046927SAndroid Build Coastguard Worker  */
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #include <stdint.h>
43*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan_core.h>
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker #include "hwdef/rogue_hw_defs.h"
46*61046927SAndroid Build Coastguard Worker #include "pvr_limits.h"
47*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker struct pvr_bo;
50*61046927SAndroid Build Coastguard Worker struct pvr_device;
51*61046927SAndroid Build Coastguard Worker struct pvr_framebuffer;
52*61046927SAndroid Build Coastguard Worker struct pvr_render_pass;
53*61046927SAndroid Build Coastguard Worker struct pvr_renderpass_hwsetup_render;
54*61046927SAndroid Build Coastguard Worker struct pvr_spm_scratch_buffer;
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker struct pvr_spm_scratch_buffer_store {
57*61046927SAndroid Build Coastguard Worker    simple_mtx_t mtx;
58*61046927SAndroid Build Coastguard Worker    struct pvr_spm_scratch_buffer *head_ref;
59*61046927SAndroid Build Coastguard Worker };
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker struct pvr_spm_eot_state {
62*61046927SAndroid Build Coastguard Worker    uint64_t pbe_reg_words[PVR_MAX_COLOR_ATTACHMENTS]
63*61046927SAndroid Build Coastguard Worker                          [ROGUE_NUM_PBESTATE_REG_WORDS];
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *usc_eot_program;
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker    /* TODO: Make this struct pvr_pds_upload? It would pull in pvr_private.h
68*61046927SAndroid Build Coastguard Worker     * though which causes a cycle since that includes pvr_spm.h .
69*61046927SAndroid Build Coastguard Worker     */
70*61046927SAndroid Build Coastguard Worker    /* This is only the data section upload. The code was uploaded at device
71*61046927SAndroid Build Coastguard Worker     * creation.
72*61046927SAndroid Build Coastguard Worker     */
73*61046927SAndroid Build Coastguard Worker    uint64_t pixel_event_program_data_offset;
74*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *pixel_event_program_data_upload;
75*61046927SAndroid Build Coastguard Worker };
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker struct pvr_spm_bgobj_state {
78*61046927SAndroid Build Coastguard Worker    struct pvr_bo *consts_buffer;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    /* TODO: Make this struct pvr_pds_upload? It would pull in pvr_private.h
81*61046927SAndroid Build Coastguard Worker     * though which causes a cycle since that includes pvr_spm.h .
82*61046927SAndroid Build Coastguard Worker     */
83*61046927SAndroid Build Coastguard Worker    struct pvr_suballoc_bo *pds_texture_data_upload;
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    uint64_t pds_reg_values[ROGUE_NUM_CR_PDS_BGRND_WORDS];
86*61046927SAndroid Build Coastguard Worker };
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker void pvr_spm_init_scratch_buffer_store(struct pvr_device *device);
89*61046927SAndroid Build Coastguard Worker void pvr_spm_finish_scratch_buffer_store(struct pvr_device *device);
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker /* A scratch buffer is required in various situations:
92*61046927SAndroid Build Coastguard Worker  *
93*61046927SAndroid Build Coastguard Worker  *  - An MSAA workload which needs saving to a larger buffer than the output for
94*61046927SAndroid Build Coastguard Worker  *    PRs.
95*61046927SAndroid Build Coastguard Worker  *  - To store transient results during a PR with read only attachments (i.e.
96*61046927SAndroid Build Coastguard Worker  *    VK_ATTACHMENT_STORE_OP_NONE, not currently supported) or lazily allocated
97*61046927SAndroid Build Coastguard Worker  *    attachments with no backing.
98*61046927SAndroid Build Coastguard Worker  */
99*61046927SAndroid Build Coastguard Worker uint64_t
100*61046927SAndroid Build Coastguard Worker pvr_spm_scratch_buffer_calc_required_size(const struct pvr_render_pass *pass,
101*61046927SAndroid Build Coastguard Worker                                           uint32_t framebuffer_width,
102*61046927SAndroid Build Coastguard Worker                                           uint32_t framebuffer_height);
103*61046927SAndroid Build Coastguard Worker VkResult pvr_spm_scratch_buffer_get_buffer(
104*61046927SAndroid Build Coastguard Worker    struct pvr_device *device,
105*61046927SAndroid Build Coastguard Worker    uint64_t size,
106*61046927SAndroid Build Coastguard Worker    struct pvr_spm_scratch_buffer **const buffer_out);
107*61046927SAndroid Build Coastguard Worker void pvr_spm_scratch_buffer_release(struct pvr_device *device,
108*61046927SAndroid Build Coastguard Worker                                     struct pvr_spm_scratch_buffer *buffer);
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker /* The SPM load programs are needed for the SPM background object load op. */
111*61046927SAndroid Build Coastguard Worker VkResult pvr_device_init_spm_load_state(struct pvr_device *device);
112*61046927SAndroid Build Coastguard Worker void pvr_device_finish_spm_load_state(struct pvr_device *device);
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker VkResult
115*61046927SAndroid Build Coastguard Worker pvr_spm_init_eot_state(struct pvr_device *device,
116*61046927SAndroid Build Coastguard Worker                        struct pvr_spm_eot_state *spm_eot_state,
117*61046927SAndroid Build Coastguard Worker                        const struct pvr_framebuffer *framebuffer,
118*61046927SAndroid Build Coastguard Worker                        const struct pvr_renderpass_hwsetup_render *hw_render,
119*61046927SAndroid Build Coastguard Worker                        uint32_t *emit_count_out);
120*61046927SAndroid Build Coastguard Worker void pvr_spm_finish_eot_state(struct pvr_device *device,
121*61046927SAndroid Build Coastguard Worker                               struct pvr_spm_eot_state *spm_eot_state);
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker VkResult
124*61046927SAndroid Build Coastguard Worker pvr_spm_init_bgobj_state(struct pvr_device *device,
125*61046927SAndroid Build Coastguard Worker                          struct pvr_spm_bgobj_state *spm_bgobj_state,
126*61046927SAndroid Build Coastguard Worker                          const struct pvr_framebuffer *framebuffer,
127*61046927SAndroid Build Coastguard Worker                          const struct pvr_renderpass_hwsetup_render *hw_render,
128*61046927SAndroid Build Coastguard Worker                          uint32_t emit_count);
129*61046927SAndroid Build Coastguard Worker void pvr_spm_finish_bgobj_state(struct pvr_device *device,
130*61046927SAndroid Build Coastguard Worker                                 struct pvr_spm_bgobj_state *spm_bgobj_state);
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker #endif /* PVR_SPM_H */
133