Home | History | Annotate | Download | only in core
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2015 LunarG, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     22  * DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors:
     25  *    Chia-I Wu <olv (at) lunarg.com>
     26  */
     27 
     28 #ifndef ILO_STATE_SOL_H
     29 #define ILO_STATE_SOL_H
     30 
     31 #include "genhw/genhw.h"
     32 
     33 #include "ilo_core.h"
     34 #include "ilo_dev.h"
     35 
     36 /*
     37  * From the Ivy Bridge PRM, volume 2 part 1, page 193:
     38  *
     39  *     "Incoming topologies are tagged with a 2-bit StreamID."
     40  */
     41 #define ILO_STATE_SOL_MAX_STREAM_COUNT 4
     42 
     43 /*
     44  * From the Ivy Bridge PRM, volume 2 part 1, page 195:
     45  *
     46  *     "Up to four SO buffers are supported."
     47  */
     48 #define ILO_STATE_SOL_MAX_BUFFER_COUNT 4
     49 
     50 /*
     51  * From the Ivy Bridge PRM, volume 2 part 1, page 201:
     52  *
     53  *     "All 128 decls..."
     54  */
     55 #define ILO_STATE_SOL_MAX_DECL_COUNT 128
     56 
     57 /**
     58  * Output a vertex attribute.
     59  */
     60 struct ilo_state_sol_decl_info {
     61    /* select an attribute from read ones */
     62    uint8_t attr;
     63    bool is_hole;
     64 
     65    /* which components to write */
     66    uint8_t component_base;
     67    uint8_t component_count;
     68 
     69    /* destination buffer */
     70    uint8_t buffer;
     71 };
     72 
     73 struct ilo_state_sol_stream_info {
     74    /* which VUE attributes to read */
     75    uint8_t cv_vue_attr_count;
     76    uint8_t vue_read_base;
     77    uint8_t vue_read_count;
     78 
     79    uint8_t decl_count;
     80    const struct ilo_state_sol_decl_info *decls;
     81 };
     82 
     83 struct ilo_state_sol_info {
     84    void *data;
     85    size_t data_size;
     86 
     87    bool sol_enable;
     88    bool stats_enable;
     89    enum gen_reorder_mode tristrip_reorder;
     90 
     91    bool render_disable;
     92    /* ignored when SOL is disabled */
     93    uint8_t render_stream;
     94 
     95    /* a buffer is disabled when its stride is zero */
     96    uint16_t buffer_strides[ILO_STATE_SOL_MAX_BUFFER_COUNT];
     97 
     98    struct ilo_state_sol_stream_info streams[ILO_STATE_SOL_MAX_STREAM_COUNT];
     99 };
    100 
    101 struct ilo_state_sol {
    102    uint32_t streamout[2];
    103    uint16_t strides[4];
    104 
    105    uint32_t so_decl[2];
    106    uint32_t (*decl)[2];
    107    uint8_t decl_count;
    108 };
    109 
    110 struct ilo_vma;
    111 
    112 struct ilo_state_sol_buffer_info {
    113    const struct ilo_vma *vma;
    114    uint32_t offset;
    115    uint32_t size;
    116 
    117    /* Gen8+ only; at least sizeof(uint32_t) bytes */
    118    const struct ilo_vma *write_offset_vma;
    119    uint32_t write_offset_offset;
    120 
    121    bool write_offset_load;
    122    bool write_offset_save;
    123 
    124    bool write_offset_imm_enable;
    125    uint32_t write_offset_imm;
    126 };
    127 
    128 struct ilo_state_sol_buffer {
    129    uint32_t so_buf[5];
    130 
    131    const struct ilo_vma *vma;
    132    const struct ilo_vma *write_offset_vma;
    133 };
    134 
    135 static inline size_t
    136 ilo_state_sol_data_size(const struct ilo_dev *dev, uint8_t max_decl_count)
    137 {
    138    const struct ilo_state_sol *so = NULL;
    139    return (ilo_dev_gen(dev) >= ILO_GEN(7)) ?
    140       sizeof(so->decl[0]) * max_decl_count : 0;
    141 }
    142 
    143 bool
    144 ilo_state_sol_init(struct ilo_state_sol *sol,
    145                    const struct ilo_dev *dev,
    146                    const struct ilo_state_sol_info *info);
    147 
    148 bool
    149 ilo_state_sol_init_disabled(struct ilo_state_sol *sol,
    150                             const struct ilo_dev *dev,
    151                             bool render_disable);
    152 
    153 uint32_t
    154 ilo_state_sol_buffer_size(const struct ilo_dev *dev, uint32_t size,
    155                           uint32_t *alignment);
    156 
    157 bool
    158 ilo_state_sol_buffer_init(struct ilo_state_sol_buffer *sb,
    159                           const struct ilo_dev *dev,
    160                           const struct ilo_state_sol_buffer_info *info);
    161 
    162 bool
    163 ilo_state_sol_buffer_init_disabled(struct ilo_state_sol_buffer *sb,
    164                                    const struct ilo_dev *dev);
    165 
    166 #endif /* ILO_STATE_SOL_H */
    167