Home | History | Annotate | Line # | Download | only in lib
      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