• Home
  • 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