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_VIEWPORT_H
     29 #define ILO_STATE_VIEWPORT_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 38:
     38  *
     39  *     "... 16 sets of viewport (VP) state parameters in the Clip unit's
     40  *      VertexClipTest function and in the SF unit's ViewportMapping and
     41  *      Scissor functions."
     42  */
     43 #define ILO_STATE_VIEWPORT_MAX_COUNT 16
     44 
     45 enum ilo_state_viewport_dirty_bits {
     46    ILO_STATE_VIEWPORT_SF_CLIP_VIEWPORT             = (1 << 0),
     47    ILO_STATE_VIEWPORT_CC_VIEWPORT                  = (1 << 1),
     48    ILO_STATE_VIEWPORT_SCISSOR_RECT                 = (1 << 2),
     49 };
     50 
     51 struct ilo_state_viewport_matrix_info {
     52    float scale[3];
     53    float translate[3];
     54 };
     55 
     56 struct ilo_state_viewport_scissor_info {
     57    /* all inclusive */
     58    uint16_t min_x;
     59    uint16_t min_y;
     60    uint16_t max_x;
     61    uint16_t max_y;
     62 };
     63 
     64 struct ilo_state_viewport_params_info {
     65    const struct ilo_state_viewport_matrix_info *matrices;
     66    const struct ilo_state_viewport_scissor_info *scissors;
     67    uint8_t count;
     68 };
     69 
     70 struct ilo_state_viewport_info {
     71    void *data;
     72    size_t data_size;
     73 
     74    struct ilo_state_viewport_params_info params;
     75 };
     76 
     77 struct ilo_state_viewport {
     78    void *data;
     79    uint8_t array_size;
     80 
     81    uint8_t count;
     82    uint32_t (*sf_clip)[16];
     83    uint32_t (*cc)[2];
     84    uint32_t (*scissor)[2];
     85 };
     86 
     87 struct ilo_state_viewport_delta {
     88    uint32_t dirty;
     89 };
     90 
     91 static inline size_t
     92 ilo_state_viewport_data_size(const struct ilo_dev *dev, uint8_t array_size)
     93 {
     94    const struct ilo_state_viewport *vp = NULL;
     95    return (sizeof(vp->sf_clip[0]) +
     96            sizeof(vp->cc[0]) +
     97            sizeof(vp->scissor[0])) * array_size;
     98 }
     99 
    100 bool
    101 ilo_state_viewport_init(struct ilo_state_viewport *vp,
    102                         const struct ilo_dev *dev,
    103                         const struct ilo_state_viewport_info *info);
    104 
    105 bool
    106 ilo_state_viewport_init_data_only(struct ilo_state_viewport *vp,
    107                                   const struct ilo_dev *dev,
    108                                   void *data, size_t data_size);
    109 
    110 bool
    111 ilo_state_viewport_init_for_rectlist(struct ilo_state_viewport *vp,
    112                                      const struct ilo_dev *dev,
    113                                      void *data, size_t data_size);
    114 
    115 bool
    116 ilo_state_viewport_set_params(struct ilo_state_viewport *vp,
    117                               const struct ilo_dev *dev,
    118                               const struct ilo_state_viewport_params_info *params,
    119                               bool scissors_only);
    120 
    121 void
    122 ilo_state_viewport_full_delta(const struct ilo_state_viewport *vp,
    123                               const struct ilo_dev *dev,
    124                               struct ilo_state_viewport_delta *delta);
    125 
    126 void
    127 ilo_state_viewport_get_delta(const struct ilo_state_viewport *vp,
    128                              const struct ilo_dev *dev,
    129                              const struct ilo_state_viewport *old,
    130                              struct ilo_state_viewport_delta *delta);
    131 
    132 #endif /* ILO_STATE_VIEWPORT_H */
    133