Home | History | Annotate | Line # | Download | only in util
      1 /**************************************************************************
      2  *
      3  * Copyright 2012 Marek Olk <maraeo (at) gmail.com>
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL THE AUTHORS AND/OR THEIR SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #ifndef U_HELPERS_H
     29 #define U_HELPERS_H
     30 
     31 #include "pipe/p_state.h"
     32 #include "c11/threads.h"
     33 #include "compiler/shader_enums.h"
     34 #include <stdio.h>
     35 
     36 #ifdef __cplusplus
     37 extern "C" {
     38 #endif
     39 
     40 void util_set_vertex_buffers_mask(struct pipe_vertex_buffer *dst,
     41                                   uint32_t *enabled_buffers,
     42                                   const struct pipe_vertex_buffer *src,
     43                                   unsigned start_slot, unsigned count,
     44                                   unsigned unbind_num_trailing_slots,
     45                                   bool take_ownership);
     46 
     47 void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst,
     48                                    unsigned *dst_count,
     49                                    const struct pipe_vertex_buffer *src,
     50                                    unsigned start_slot, unsigned count,
     51                                    unsigned unbind_num_trailing_slots,
     52                                    bool take_ownership);
     53 
     54 void util_set_shader_buffers_mask(struct pipe_shader_buffer *dst,
     55                                   uint32_t *enabled_buffers,
     56                                   const struct pipe_shader_buffer *src,
     57                                   unsigned start_slot, unsigned count);
     58 
     59 bool util_upload_index_buffer(struct pipe_context *pipe,
     60                               const struct pipe_draw_info *info,
     61                               const struct pipe_draw_start_count_bias *draw,
     62                               struct pipe_resource **out_buffer,
     63                               unsigned *out_offset, unsigned alignment);
     64 
     65 void
     66 util_lower_uint64_vertex_elements(const struct pipe_vertex_element **velems,
     67                                   unsigned *velem_count,
     68                                   struct pipe_vertex_element tmp[PIPE_MAX_ATTRIBS]);
     69 
     70 /* Helper function to determine if the varying should contain the point
     71  * coordinates, given the sprite_coord_enable mask.  Requires
     72  * PIPE_CAP_TGSI_TEXCOORD to be enabled.
     73  */
     74 static inline bool
     75 util_varying_is_point_coord(gl_varying_slot slot, uint32_t sprite_coord_enable)
     76 {
     77    if (slot == VARYING_SLOT_PNTC)
     78       return true;
     79 
     80    if (slot >= VARYING_SLOT_TEX0 && slot <= VARYING_SLOT_TEX7 &&
     81        (sprite_coord_enable & (1 << (slot - VARYING_SLOT_TEX0)))) {
     82       return true;
     83    }
     84 
     85    return false;
     86 }
     87 
     88 struct pipe_query *
     89 util_begin_pipestat_query(struct pipe_context *ctx);
     90 
     91 void
     92 util_end_pipestat_query(struct pipe_context *ctx, struct pipe_query *q,
     93                         FILE *f);
     94 
     95 struct pipe_query *
     96 util_begin_time_query(struct pipe_context *ctx);
     97 void
     98 util_end_time_query(struct pipe_context *ctx, struct pipe_query *q, FILE *f,
     99                     const char *name);
    100 
    101 void
    102 util_wait_for_idle(struct pipe_context *ctx);
    103 
    104 /* A utility for throttling execution based on memory usage. */
    105 struct util_throttle {
    106    struct {
    107       struct pipe_fence_handle *fence;
    108       uint64_t mem_usage;
    109    } ring[10];
    110 
    111    unsigned flush_index;
    112    unsigned wait_index;
    113    uint64_t max_mem_usage;
    114 };
    115 
    116 void util_throttle_init(struct util_throttle *t, uint64_t max_mem_usage);
    117 void util_throttle_deinit(struct pipe_screen *screen, struct util_throttle *t);
    118 void util_throttle_memory_usage(struct pipe_context *pipe,
    119                                 struct util_throttle *t, uint64_t memory_size);
    120 
    121 bool
    122 util_lower_clearsize_to_dword(const void *clearValue, int *clearValueSize, uint32_t *clamped);
    123 
    124 void
    125 util_init_pipe_vertex_state(struct pipe_screen *screen,
    126                             struct pipe_vertex_buffer *buffer,
    127                             const struct pipe_vertex_element *elements,
    128                             unsigned num_elements,
    129                             struct pipe_resource *indexbuf,
    130                             uint32_t full_velem_mask,
    131                             struct pipe_vertex_state *state);
    132 
    133 #ifdef __cplusplus
    134 }
    135 #endif
    136 
    137 #endif
    138