1 /* 2 * Copyright (C) 2021 Collabora, Ltd. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Alyssa Rosenzweig <alyssa.rosenzweig (at) collabora.com> 25 * Boris Brezillon <boris.brezillon (at) collabora.com> 26 */ 27 28 #ifndef __PAN_CS_H 29 #define __PAN_CS_H 30 31 #include "genxml/gen_macros.h" 32 33 #include "pan_texture.h" 34 35 struct pan_compute_dim { 36 uint32_t x, y, z; 37 }; 38 39 struct pan_fb_color_attachment { 40 const struct pan_image_view *view; 41 bool *crc_valid; 42 bool clear; 43 bool preload; 44 bool discard; 45 uint32_t clear_value[4]; 46 }; 47 48 struct pan_fb_zs_attachment { 49 struct { 50 const struct pan_image_view *zs, *s; 51 } view; 52 53 struct { 54 bool z, s; 55 } clear; 56 57 struct { 58 bool z, s; 59 } discard; 60 61 struct { 62 bool z, s; 63 } preload; 64 65 struct { 66 float depth; 67 uint8_t stencil; 68 } clear_value; 69 }; 70 71 struct pan_tiler_context { 72 union { 73 mali_ptr bifrost; 74 struct { 75 bool disable; 76 struct panfrost_bo *polygon_list; 77 } midgard; 78 }; 79 }; 80 81 struct pan_tls_info { 82 struct { 83 mali_ptr ptr; 84 unsigned size; 85 } tls; 86 87 struct { 88 struct pan_compute_dim dim; 89 mali_ptr ptr; 90 unsigned size; 91 } wls; 92 }; 93 94 struct pan_fb_bifrost_info { 95 struct { 96 struct panfrost_ptr dcds; 97 unsigned modes[3]; 98 } pre_post; 99 }; 100 101 struct pan_fb_info { 102 unsigned width, height; 103 struct { 104 /* Max values are inclusive */ 105 unsigned minx, miny, maxx, maxy; 106 } extent; 107 unsigned nr_samples; 108 unsigned rt_count; 109 struct pan_fb_color_attachment rts[8]; 110 struct pan_fb_zs_attachment zs; 111 112 struct { 113 unsigned stride; 114 mali_ptr base; 115 } tile_map; 116 117 union { 118 struct pan_fb_bifrost_info bifrost; 119 }; 120 }; 121 122 static inline unsigned 123 pan_wls_instances(const struct pan_compute_dim *dim) 124 { 125 return util_next_power_of_two(dim->x) * 126 util_next_power_of_two(dim->y) * 127 util_next_power_of_two(dim->z); 128 } 129 130 static inline unsigned 131 pan_wls_adjust_size(unsigned wls_size) 132 { 133 return util_next_power_of_two(MAX2(wls_size, 128)); 134 } 135 136 static inline unsigned 137 pan_wls_mem_size(const struct panfrost_device *dev, 138 const struct pan_compute_dim *dim, 139 unsigned wls_size) 140 { 141 unsigned instances = pan_wls_instances(dim); 142 143 return pan_wls_adjust_size(wls_size) * instances * dev->core_count; 144 } 145 146 #ifdef PAN_ARCH 147 void 148 GENX(pan_emit_tls)(const struct pan_tls_info *info, 149 void *out); 150 151 int 152 GENX(pan_select_crc_rt)(const struct pan_fb_info *fb); 153 154 static inline bool 155 pan_fbd_has_zs_crc_ext(const struct pan_fb_info *fb) 156 { 157 return PAN_ARCH >= 5 && 158 (fb->zs.view.zs || fb->zs.view.s || 159 GENX(pan_select_crc_rt)(fb) >= 0); 160 } 161 162 unsigned 163 GENX(pan_emit_fbd)(const struct panfrost_device *dev, 164 const struct pan_fb_info *fb, 165 const struct pan_tls_info *tls, 166 const struct pan_tiler_context *tiler_ctx, 167 void *out); 168 169 #if PAN_ARCH >= 6 170 void 171 GENX(pan_emit_tiler_heap)(const struct panfrost_device *dev, 172 void *out); 173 174 void 175 GENX(pan_emit_tiler_ctx)(const struct panfrost_device *dev, 176 unsigned fb_width, unsigned fb_height, 177 unsigned nr_samples, 178 mali_ptr heap, 179 void *out); 180 #endif 181 182 void 183 GENX(pan_emit_fragment_job)(const struct pan_fb_info *fb, 184 mali_ptr fbd, 185 void *out); 186 #endif /* ifdef PAN_ARCH */ 187 188 #endif 189