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