1/* 2 * Copyright 2014, 2015 Red Hat. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23#ifndef VIRGL_ENCODE_H 24#define VIRGL_ENCODE_H 25 26#include "pipe/p_defines.h" 27#include "pipe/p_state.h" 28 29#include "virgl_winsys.h" 30 31struct tgsi_token; 32 33struct virgl_context; 34struct virgl_resource; 35struct virgl_screen; 36struct virgl_transfer; 37struct virgl_sampler_view; 38 39struct virgl_surface { 40 struct pipe_surface base; 41 uint32_t handle; 42}; 43 44struct virgl_indexbuf { 45 unsigned offset; 46 unsigned index_size; /**< size of an index, in bytes */ 47 struct pipe_resource *buffer; /**< the actual buffer */ 48 const void *user_buffer; /**< pointer to a user buffer if buffer == NULL */ 49}; 50 51static inline struct virgl_surface *virgl_surface(struct pipe_surface *surf) 52{ 53 return (struct virgl_surface *)surf; 54} 55 56static inline void virgl_encoder_write_dword(struct virgl_cmd_buf *state, 57 uint32_t dword) 58{ 59 state->buf[state->cdw++] = dword; 60} 61 62static inline void virgl_encoder_write_qword(struct virgl_cmd_buf *state, 63 uint64_t qword) 64{ 65 memcpy(state->buf + state->cdw, &qword, sizeof(uint64_t)); 66 state->cdw += 2; 67} 68 69static inline void virgl_encoder_write_block(struct virgl_cmd_buf *state, 70 const uint8_t *ptr, uint32_t len) 71{ 72 int x; 73 memcpy(state->buf + state->cdw, ptr, len); 74 x = (len % 4); 75 if (x) { 76 uint8_t *mp = (uint8_t *)(state->buf + state->cdw); 77 mp += len; 78 memset(mp, 0, x); 79 } 80 state->cdw += (len + 3) / 4; 81} 82 83extern int virgl_encode_blend_state(struct virgl_context *ctx, 84 uint32_t handle, 85 const struct pipe_blend_state *blend_state); 86extern int virgl_encode_rasterizer_state(struct virgl_context *ctx, 87 uint32_t handle, 88 const struct pipe_rasterizer_state *state); 89 90extern int virgl_encode_shader_state(struct virgl_context *ctx, 91 uint32_t handle, 92 uint32_t type, 93 const struct pipe_stream_output_info *so_info, 94 uint32_t cs_req_local_mem, 95 const struct tgsi_token *tokens); 96 97int virgl_encode_stream_output_info(struct virgl_context *ctx, 98 uint32_t handle, 99 uint32_t type, 100 const struct pipe_shader_state *shader); 101 102int virgl_encoder_set_so_targets(struct virgl_context *ctx, 103 unsigned num_targets, 104 struct pipe_stream_output_target **targets, 105 unsigned append_bitmask); 106 107int virgl_encoder_create_so_target(struct virgl_context *ctx, 108 uint32_t handle, 109 struct virgl_resource *res, 110 unsigned buffer_offset, 111 unsigned buffer_size); 112 113int virgl_encode_clear(struct virgl_context *ctx, 114 unsigned buffers, 115 const union pipe_color_union *color, 116 double depth, unsigned stencil); 117 118int virgl_encode_bind_object(struct virgl_context *ctx, 119 uint32_t handle, uint32_t object); 120int virgl_encode_delete_object(struct virgl_context *ctx, 121 uint32_t handle, uint32_t object); 122 123int virgl_encoder_set_framebuffer_state(struct virgl_context *ctx, 124 const struct pipe_framebuffer_state *state); 125int virgl_encoder_set_viewport_states(struct virgl_context *ctx, 126 int start_slot, 127 int num_viewports, 128 const struct pipe_viewport_state *states); 129 130int virgl_encoder_draw_vbo(struct virgl_context *ctx, 131 const struct pipe_draw_info *info); 132 133 134int virgl_encoder_create_surface(struct virgl_context *ctx, 135 uint32_t handle, 136 struct virgl_resource *res, 137 const struct pipe_surface *templat); 138 139int virgl_encoder_flush_frontbuffer(struct virgl_context *ctx, 140 struct virgl_resource *res); 141 142int virgl_encoder_create_vertex_elements(struct virgl_context *ctx, 143 uint32_t handle, 144 unsigned num_elements, 145 const struct pipe_vertex_element *element); 146 147int virgl_encoder_set_vertex_buffers(struct virgl_context *ctx, 148 unsigned num_buffers, 149 const struct pipe_vertex_buffer *buffers); 150 151 152int virgl_encoder_inline_write(struct virgl_context *ctx, 153 struct virgl_resource *res, 154 unsigned level, unsigned usage, 155 const struct pipe_box *box, 156 const void *data, unsigned stride, 157 unsigned layer_stride); 158int virgl_encode_sampler_state(struct virgl_context *ctx, 159 uint32_t handle, 160 const struct pipe_sampler_state *state); 161int virgl_encode_sampler_view(struct virgl_context *ctx, 162 uint32_t handle, 163 struct virgl_resource *res, 164 const struct pipe_sampler_view *state); 165 166int virgl_encode_set_sampler_views(struct virgl_context *ctx, 167 uint32_t shader_type, 168 uint32_t start_slot, 169 uint32_t num_views, 170 struct virgl_sampler_view **views); 171 172int virgl_encode_bind_sampler_states(struct virgl_context *ctx, 173 uint32_t shader_type, 174 uint32_t start_slot, 175 uint32_t num_handles, 176 uint32_t *handles); 177 178int virgl_encoder_set_index_buffer(struct virgl_context *ctx, 179 const struct virgl_indexbuf *ib); 180 181uint32_t virgl_object_assign_handle(void); 182 183int virgl_encoder_write_constant_buffer(struct virgl_context *ctx, 184 uint32_t shader, 185 uint32_t index, 186 uint32_t size, 187 const void *data); 188 189int virgl_encoder_set_uniform_buffer(struct virgl_context *ctx, 190 uint32_t shader, 191 uint32_t index, 192 uint32_t offset, 193 uint32_t length, 194 struct virgl_resource *res); 195int virgl_encode_dsa_state(struct virgl_context *ctx, 196 uint32_t handle, 197 const struct pipe_depth_stencil_alpha_state *dsa_state); 198 199int virgl_encoder_set_stencil_ref(struct virgl_context *ctx, 200 const struct pipe_stencil_ref *ref); 201 202int virgl_encoder_set_blend_color(struct virgl_context *ctx, 203 const struct pipe_blend_color *color); 204 205int virgl_encoder_set_scissor_state(struct virgl_context *ctx, 206 unsigned start_slot, 207 int num_scissors, 208 const struct pipe_scissor_state *ss); 209 210void virgl_encoder_set_polygon_stipple(struct virgl_context *ctx, 211 const struct pipe_poly_stipple *ps); 212 213void virgl_encoder_set_sample_mask(struct virgl_context *ctx, 214 unsigned sample_mask); 215 216void virgl_encoder_set_min_samples(struct virgl_context *ctx, 217 unsigned min_samples); 218 219void virgl_encoder_set_clip_state(struct virgl_context *ctx, 220 const struct pipe_clip_state *clip); 221 222int virgl_encode_resource_copy_region(struct virgl_context *ctx, 223 struct virgl_resource *dst_res, 224 unsigned dst_level, 225 unsigned dstx, unsigned dsty, unsigned dstz, 226 struct virgl_resource *src_res, 227 unsigned src_level, 228 const struct pipe_box *src_box); 229 230int virgl_encode_blit(struct virgl_context *ctx, 231 struct virgl_resource *dst_res, 232 struct virgl_resource *src_res, 233 const struct pipe_blit_info *blit); 234 235int virgl_encoder_create_query(struct virgl_context *ctx, 236 uint32_t handle, 237 uint query_type, 238 uint query_index, 239 struct virgl_resource *res, 240 uint32_t offset); 241 242int virgl_encoder_begin_query(struct virgl_context *ctx, 243 uint32_t handle); 244int virgl_encoder_end_query(struct virgl_context *ctx, 245 uint32_t handle); 246int virgl_encoder_get_query_result(struct virgl_context *ctx, 247 uint32_t handle, boolean wait); 248 249int virgl_encoder_render_condition(struct virgl_context *ctx, 250 uint32_t handle, boolean condition, 251 enum pipe_render_cond_flag mode); 252 253int virgl_encoder_set_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id); 254int virgl_encoder_create_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id); 255int virgl_encoder_destroy_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id); 256 257int virgl_encode_bind_shader(struct virgl_context *ctx, 258 uint32_t handle, uint32_t type); 259 260int virgl_encode_set_tess_state(struct virgl_context *ctx, 261 const float outer[4], 262 const float inner[2]); 263 264int virgl_encode_set_shader_buffers(struct virgl_context *ctx, 265 enum pipe_shader_type shader, 266 unsigned start_slot, unsigned count, 267 const struct pipe_shader_buffer *buffers); 268int virgl_encode_set_shader_images(struct virgl_context *ctx, 269 enum pipe_shader_type shader, 270 unsigned start_slot, unsigned count, 271 const struct pipe_image_view *images); 272int virgl_encode_set_hw_atomic_buffers(struct virgl_context *ctx, 273 unsigned start_slot, unsigned count, 274 const struct pipe_shader_buffer *buffers); 275int virgl_encode_memory_barrier(struct virgl_context *ctx, 276 unsigned flags); 277int virgl_encode_launch_grid(struct virgl_context *ctx, 278 const struct pipe_grid_info *grid_info); 279int virgl_encode_texture_barrier(struct virgl_context *ctx, 280 unsigned flags); 281 282int virgl_encode_host_debug_flagstring(struct virgl_context *ctx, 283 const char *envname); 284 285int virgl_encode_get_query_result_qbo(struct virgl_context *ctx, 286 uint32_t handle, 287 struct virgl_resource *res, boolean wait, 288 uint32_t result_type, 289 uint32_t offset, 290 uint32_t index); 291 292void virgl_encode_transfer(struct virgl_screen *vs, struct virgl_cmd_buf *buf, 293 struct virgl_transfer *trans, uint32_t direction); 294 295void virgl_encode_end_transfers(struct virgl_cmd_buf *buf); 296#endif 297