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_VF_H
     29 #define ILO_STATE_VF_H
     30 
     31 #include "genhw/genhw.h"
     32 
     33 #include "ilo_core.h"
     34 #include "ilo_dev.h"
     35 
     36 /*
     37  * From the Sandy Bridge PRM, volume 2 part 1, page 93:
     38  *
     39  *     "Up to 34 (DevSNB+) vertex elements are supported."
     40  *
     41  *     "Up to 33 VBs are supported"
     42  *
     43  * Reserve two VEs and one VB for internal use.
     44  */
     45 #define ILO_STATE_VF_MAX_ELEMENT_COUNT (34 - 2)
     46 #define ILO_STATE_VF_MAX_BUFFER_COUNT (33 - 1)
     47 
     48 enum ilo_state_vf_dirty_bits {
     49    ILO_STATE_VF_3DSTATE_VERTEX_ELEMENTS            = (1 << 0),
     50    ILO_STATE_VF_3DSTATE_VF_SGVS                    = (1 << 1),
     51    ILO_STATE_VF_3DSTATE_VF_INSTANCING              = (1 << 2),
     52    ILO_STATE_VF_3DSTATE_VERTEX_BUFFERS             = (1 << 3),
     53    ILO_STATE_VF_3DSTATE_VF                         = (1 << 4),
     54    ILO_STATE_VF_3DSTATE_INDEX_BUFFER               = (1 << 5),
     55 };
     56 
     57 /**
     58  * Fetch a 128-bit vertex attribute.
     59  */
     60 struct ilo_state_vf_element_info {
     61    uint8_t buffer;
     62    uint16_t vertex_offset;
     63    enum gen_surface_format format;
     64 
     65    uint8_t format_size;
     66    uint8_t component_count;
     67    bool is_integer;
     68 
     69    /* must be the same for those share the same buffer before Gen8 */
     70    bool instancing_enable;
     71    uint32_t instancing_step_rate;
     72 };
     73 
     74 /**
     75  * VF parameters.
     76  */
     77 struct ilo_state_vf_params_info {
     78    enum gen_3dprim_type cv_topology;
     79 
     80    /* prepend an attribute of zeros */
     81    bool prepend_zeros;
     82 
     83    /* prepend an attribute of VertexID and/or InstanceID */
     84    bool prepend_vertexid;
     85    bool prepend_instanceid;
     86 
     87    bool last_element_edge_flag;
     88 
     89    enum gen_index_format cv_index_format;
     90    bool cut_index_enable;
     91    uint32_t cut_index;
     92 };
     93 
     94 /**
     95  * Vertex fetch.
     96  */
     97 struct ilo_state_vf_info {
     98    void *data;
     99    size_t data_size;
    100 
    101    const struct ilo_state_vf_element_info *elements;
    102    uint8_t element_count;
    103 
    104    struct ilo_state_vf_params_info params;
    105 };
    106 
    107 struct ilo_state_vf {
    108    uint32_t (*user_ve)[2];
    109    uint32_t (*user_instancing)[2];
    110    int8_t vb_to_first_elem[ILO_STATE_VF_MAX_BUFFER_COUNT];
    111    uint8_t user_ve_count;
    112 
    113    bool edge_flag_supported;
    114    uint32_t last_user_ve[2][2];
    115 
    116    /* two VEs are reserved for internal use */
    117    uint32_t internal_ve[2][2];
    118    uint8_t internal_ve_count;
    119 
    120    uint32_t sgvs[1];
    121 
    122    uint32_t cut[2];
    123 };
    124 
    125 struct ilo_state_vf_delta {
    126    uint32_t dirty;
    127 };
    128 
    129 struct ilo_vma;
    130 
    131 struct ilo_state_vertex_buffer_info {
    132    const struct ilo_vma *vma;
    133    uint32_t offset;
    134    uint32_t size;
    135 
    136    uint16_t stride;
    137 
    138    /* doubles must be at 64-bit aligned addresses */
    139    bool cv_has_double;
    140    uint8_t cv_double_vertex_offset_mod_8;
    141 };
    142 
    143 struct ilo_state_vertex_buffer {
    144    uint32_t vb[3];
    145 
    146    const struct ilo_vma *vma;
    147 };
    148 
    149 struct ilo_state_index_buffer_info {
    150    const struct ilo_vma *vma;
    151    uint32_t offset;
    152    uint32_t size;
    153 
    154    enum gen_index_format format;
    155 };
    156 
    157 struct ilo_state_index_buffer {
    158    uint32_t ib[3];
    159 
    160    const struct ilo_vma *vma;
    161 };
    162 
    163 static inline size_t
    164 ilo_state_vf_data_size(const struct ilo_dev *dev, uint8_t element_count)
    165 {
    166    const struct ilo_state_vf *vf = NULL;
    167    return (sizeof(vf->user_ve[0]) +
    168            sizeof(vf->user_instancing[0])) * element_count;
    169 }
    170 
    171 bool
    172 ilo_state_vf_valid_element_format(const struct ilo_dev *dev,
    173                                   enum gen_surface_format format);
    174 
    175 bool
    176 ilo_state_vf_init(struct ilo_state_vf *vf,
    177                   const struct ilo_dev *dev,
    178                   const struct ilo_state_vf_info *info);
    179 
    180 bool
    181 ilo_state_vf_init_for_rectlist(struct ilo_state_vf *vf,
    182                                const struct ilo_dev *dev,
    183                                void *data, size_t data_size,
    184                                const struct ilo_state_vf_element_info *elements,
    185                                uint8_t element_count);
    186 
    187 bool
    188 ilo_state_vf_set_params(struct ilo_state_vf *vf,
    189                         const struct ilo_dev *dev,
    190                         const struct ilo_state_vf_params_info *params);
    191 
    192 /**
    193  * Return the number of attributes in the VUE.
    194  */
    195 static inline uint8_t
    196 ilo_state_vf_get_attr_count(const struct ilo_state_vf *vf)
    197 {
    198    return vf->internal_ve_count + vf->user_ve_count;
    199 }
    200 
    201 void
    202 ilo_state_vf_full_delta(const struct ilo_state_vf *vf,
    203                         const struct ilo_dev *dev,
    204                         struct ilo_state_vf_delta *delta);
    205 
    206 void
    207 ilo_state_vf_get_delta(const struct ilo_state_vf *vf,
    208                        const struct ilo_dev *dev,
    209                        const struct ilo_state_vf *old,
    210                        struct ilo_state_vf_delta *delta);
    211 
    212 uint32_t
    213 ilo_state_vertex_buffer_size(const struct ilo_dev *dev, uint32_t size,
    214                              uint32_t *alignment);
    215 
    216 bool
    217 ilo_state_vertex_buffer_set_info(struct ilo_state_vertex_buffer *vb,
    218                                  const struct ilo_dev *dev,
    219                                  const struct ilo_state_vertex_buffer_info *info);
    220 
    221 uint32_t
    222 ilo_state_index_buffer_size(const struct ilo_dev *dev, uint32_t size,
    223                             uint32_t *alignment);
    224 
    225 bool
    226 ilo_state_index_buffer_set_info(struct ilo_state_index_buffer *ib,
    227                                 const struct ilo_dev *dev,
    228                                 const struct ilo_state_index_buffer_info *info);
    229 
    230 #endif /* ILO_STATE_VF_H */
    231