• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /**************************************************************************
2   *
3   * Copyright (C) 2015 Red Hat Inc.
4   *
5   * Permission is hereby granted, free of charge, to any person obtaining a
6   * copy of this software and associated documentation files (the "Software"),
7   * to deal in the Software without restriction, including without limitation
8   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9   * and/or sell copies of the Software, and to permit persons to whom the
10   * Software is furnished to do so, subject to the following conditions:
11   *
12   * The above copyright notice and this permission notice shall be included
13   * in all copies or substantial portions of the Software.
14   *
15   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16   * OR 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
19   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21   * OTHER DEALINGS IN THE SOFTWARE.
22   *
23   **************************************************************************/
24  #ifndef VIRGL_ENCODE_H
25  #define VIRGL_ENCODE_H
26  
27  #include <stdio.h>
28  
29  #include "testvirgl.h"
30  
31  struct virgl_surface {
32     struct pipe_surface base;
33     uint32_t handle;
34  };
35  
virgl_encoder_write_dword(struct virgl_cmd_buf * state,uint32_t dword)36  static inline void virgl_encoder_write_dword(struct virgl_cmd_buf *state,
37                                              uint32_t dword)
38  {
39     state->buf[state->cdw++] = dword;
40  }
41  
virgl_encoder_write_qword(struct virgl_cmd_buf * state,uint64_t qword)42  static inline void virgl_encoder_write_qword(struct virgl_cmd_buf *state,
43                                              uint64_t qword)
44  {
45     memcpy(state->buf + state->cdw, &qword, sizeof(uint64_t));
46     state->cdw += 2;
47  }
48  
virgl_encoder_write_double(struct virgl_cmd_buf * state,double qword)49  static inline void virgl_encoder_write_double(struct virgl_cmd_buf *state,
50                                                double qword)
51  {
52     memcpy(state->buf + state->cdw, &qword, sizeof(double));
53     state->cdw += 2;
54  }
55  
virgl_encoder_write_block(struct virgl_cmd_buf * state,const uint8_t * ptr,uint32_t len)56  static inline void virgl_encoder_write_block(struct virgl_cmd_buf *state,
57  					    const uint8_t *ptr, uint32_t len)
58  {
59     int x;
60     memcpy(state->buf + state->cdw, ptr, len);
61     x = (len % 4);
62  //   fprintf(stderr, "[%d] block %d x is %d\n", state->cdw, len, x);
63     if (x) {
64        uint8_t *mp = (uint8_t *)(state->buf + state->cdw);
65        mp += len;
66        memset(mp, 0, x);
67     }
68     state->cdw += (len + 3) / 4;
69  }
70  
71  extern int virgl_encode_blend_state(struct virgl_context *ctx,
72                                     uint32_t handle,
73                                     const struct pipe_blend_state *blend_state);
74  extern int virgl_encode_rasterizer_state(struct virgl_context *ctx,
75                                           uint32_t handle,
76                                           const struct pipe_rasterizer_state *state);
77  
78  extern int virgl_encode_shader_state(struct virgl_context *ctx,
79                                      uint32_t handle,
80                                      uint32_t type,
81  				     const struct pipe_shader_state *shader,
82  				     const char *shad_str);
83  
84  int virgl_encode_stream_output_info(struct virgl_context *ctx,
85                                     uint32_t handle,
86                                     uint32_t type,
87                                     const struct pipe_shader_state *shader);
88  
89  int virgl_encoder_set_so_targets(struct virgl_context *ctx,
90                                  unsigned num_targets,
91                                  struct pipe_stream_output_target **targets,
92                                  unsigned append_bitmask);
93  
94  int virgl_encoder_create_so_target(struct virgl_context *ctx,
95                                    uint32_t handle,
96                                    struct virgl_resource *res,
97                                    unsigned buffer_offset,
98                                    unsigned buffer_size);
99  
100  int virgl_encode_clear(struct virgl_context *ctx,
101                        unsigned buffers,
102                        const union pipe_color_union *color,
103                        double depth, unsigned stencil);
104  
105  int virgl_encode_bind_object(struct virgl_context *ctx,
106  			    uint32_t handle, uint32_t object);
107  int virgl_encode_delete_object(struct virgl_context *ctx,
108                                uint32_t handle, uint32_t object);
109  
110  int virgl_encoder_set_framebuffer_state(struct virgl_context *ctx,
111  				       const struct pipe_framebuffer_state *state);
112  int virgl_encoder_set_viewport_states(struct virgl_context *ctx,
113                                        int start_slot,
114                                        int num_viewports,
115                                        const struct pipe_viewport_state *states);
116  
117  int virgl_encoder_draw_vbo(struct virgl_context *ctx,
118  			  const struct pipe_draw_info *info);
119  
120  
121  int virgl_encoder_create_surface(struct virgl_context *ctx,
122                                  uint32_t handle,
123                                  struct virgl_resource *res,
124  				const struct pipe_surface *templat);
125  
126  int virgl_encoder_flush_frontbuffer(struct virgl_context *ctx,
127                                     struct virgl_resource *res);
128  
129  int virgl_encoder_create_vertex_elements(struct virgl_context *ctx,
130                                          uint32_t handle,
131                                          unsigned num_elements,
132                                          const struct pipe_vertex_element *element);
133  
134  int virgl_encoder_set_vertex_buffers(struct virgl_context *ctx,
135                                      unsigned num_buffers,
136                                      const struct pipe_vertex_buffer *buffers);
137  
138  
139  int virgl_encoder_inline_write(struct virgl_context *ctx,
140                                struct virgl_resource *res,
141                                unsigned level, unsigned usage,
142                                const struct pipe_box *box,
143                                const void *data, unsigned stride,
144                                unsigned layer_stride);
145  int virgl_encode_sampler_state(struct virgl_context *ctx,
146                                uint32_t handle,
147                                const struct pipe_sampler_state *state);
148  int virgl_encode_sampler_view(struct virgl_context *ctx,
149                               uint32_t handle,
150                               struct virgl_resource *res,
151                               const struct pipe_sampler_view *state);
152  
153  int virgl_encode_set_sampler_views(struct virgl_context *ctx,
154                                    uint32_t shader_type,
155                                    uint32_t start_slot,
156                                    uint32_t num_views,
157                                    struct virgl_sampler_view **views);
158  
159  int virgl_encode_bind_sampler_states(struct virgl_context *ctx,
160                                      uint32_t shader_type,
161                                      uint32_t start_slot,
162                                      uint32_t num_handles,
163                                      uint32_t *handles);
164  
165  int virgl_encoder_set_index_buffer(struct virgl_context *ctx,
166                                    const struct pipe_index_buffer *ib);
167  
168  uint32_t virgl_object_assign_handle(void);
169  
170  int virgl_encoder_write_constant_buffer(struct virgl_context *ctx,
171                                         uint32_t shader,
172                                         uint32_t index,
173                                         uint32_t size,
174                                         const void *data);
175  
176  int virgl_encoder_set_uniform_buffer(struct virgl_context *ctx,
177                                       uint32_t shader,
178                                       uint32_t index,
179                                       uint32_t offset,
180                                       uint32_t length,
181                                       struct virgl_resource *res);
182  int virgl_encode_dsa_state(struct virgl_context *ctx,
183                            uint32_t handle,
184                            const struct pipe_depth_stencil_alpha_state *dsa_state);
185  
186  int virgl_encoder_set_stencil_ref(struct virgl_context *ctx,
187                                   const struct pipe_stencil_ref *ref);
188  
189  int virgl_encoder_set_blend_color(struct virgl_context *ctx,
190                                   const struct pipe_blend_color *color);
191  
192  int virgl_encoder_set_scissor_state(struct virgl_context *ctx,
193  				    unsigned start_slot,
194  				    int num_scissors,
195  				    const struct pipe_scissor_state *ss);
196  
197  void virgl_encoder_set_polygon_stipple(struct virgl_context *ctx,
198                                        const struct pipe_poly_stipple *ps);
199  
200  void virgl_encoder_set_sample_mask(struct virgl_context *ctx,
201                                    unsigned sample_mask);
202  
203  void virgl_encoder_set_clip_state(struct virgl_context *ctx,
204                                   const struct pipe_clip_state *clip);
205  
206  int virgl_encode_resource_copy_region(struct virgl_context *ctx,
207                                       struct virgl_resource *dst_res,
208                                       unsigned dst_level,
209                                       unsigned dstx, unsigned dsty, unsigned dstz,
210                                       struct virgl_resource *src_res,
211                                       unsigned src_level,
212                                       const struct pipe_box *src_box);
213  
214  int virgl_encode_blit(struct virgl_context *ctx,
215                       struct virgl_resource *dst_res,
216                       struct virgl_resource *src_res,
217                       const struct pipe_blit_info *blit);
218  
219  int virgl_encoder_create_query(struct virgl_context *ctx,
220                                uint32_t handle,
221                                uint query_type,
222                                struct virgl_resource *res,
223                                uint32_t offset);
224  
225  int virgl_encoder_begin_query(struct virgl_context *ctx,
226                               uint32_t handle);
227  int virgl_encoder_end_query(struct virgl_context *ctx,
228                             uint32_t handle);
229  int virgl_encoder_get_query_result(struct virgl_context *ctx,
230                                    uint32_t handle, boolean wait);
231  
232  int virgl_encoder_render_condition(struct virgl_context *ctx,
233                                    uint32_t handle, boolean condition,
234                                    uint mode);
235  
236  int virgl_encoder_set_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
237  int virgl_encoder_create_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
238  int virgl_encoder_destroy_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
239  int virgl_encode_bind_shader(struct virgl_context *ctx,
240                               uint32_t handle, uint32_t type);
241  #endif
242