virgl 主要工作是将Opengl state编码成virgl command
virgl command构成:
Virgl Cmd type
enum virgl_context_cmd {
VIRGL_CCMD_NOP = 0,
VIRGL_CCMD_CREATE_OBJECT = 1,
VIRGL_CCMD_BIND_OBJECT,
VIRGL_CCMD_DESTROY_OBJECT,
VIRGL_CCMD_SET_VIEWPORT_STATE,
VIRGL_CCMD_SET_FRAMEBUFFER_STATE,
VIRGL_CCMD_SET_VERTEX_BUFFERS,
VIRGL_CCMD_CLEAR,
VIRGL_CCMD_DRAW_VBO,
VIRGL_CCMD_RESOURCE_INLINE_WRITE,
VIRGL_CCMD_SET_SAMPLER_VIEWS,
VIRGL_CCMD_SET_INDEX_BUFFER,
VIRGL_CCMD_SET_CONSTANT_BUFFER,
VIRGL_CCMD_SET_STENCIL_REF,
VIRGL_CCMD_SET_BLEND_COLOR,
VIRGL_CCMD_SET_SCISSOR_STATE,
VIRGL_CCMD_BLIT,
VIRGL_CCMD_RESOURCE_COPY_REGION,
VIRGL_CCMD_BIND_SAMPLER_STATES,
VIRGL_CCMD_BEGIN_QUERY,
VIRGL_CCMD_END_QUERY,
VIRGL_CCMD_GET_QUERY_RESULT,
VIRGL_CCMD_SET_POLYGON_STIPPLE,
VIRGL_CCMD_SET_CLIP_STATE,
VIRGL_CCMD_SET_SAMPLE_MASK,
VIRGL_CCMD_SET_STREAMOUT_TARGETS,
VIRGL_CCMD_SET_RENDER_CONDITION,
VIRGL_CCMD_SET_UNIFORM_BUFFER,
VIRGL_CCMD_SET_SUB_CTX,
VIRGL_CCMD_CREATE_SUB_CTX,
VIRGL_CCMD_DESTROY_SUB_CTX,
VIRGL_CCMD_BIND_SHADER,
VIRGL_CCMD_SET_TESS_STATE,
VIRGL_CCMD_SET_MIN_SAMPLES,
VIRGL_CCMD_SET_SHADER_BUFFERS,
VIRGL_CCMD_SET_SHADER_IMAGES,
VIRGL_CCMD_MEMORY_BARRIER,
VIRGL_CCMD_LAUNCH_GRID,
VIRGL_CCMD_SET_FRAMEBUFFER_STATE_NO_ATTACH,
VIRGL_CCMD_TEXTURE_BARRIER,
VIRGL_CCMD_SET_ATOMIC_BUFFERS,
VIRGL_CCMD_SET_DEBUG_FLAGS,
VIRGL_CCMD_GET_QUERY_RESULT_QBO,
VIRGL_CCMD_TRANSFER3D,
VIRGL_CCMD_END_TRANSFERS,
VIRGL_CCMD_COPY_TRANSFER3D,
VIRGL_CCMD_SET_TWEAKS,
};
Object type
enum virgl_object_type {
VIRGL_OBJECT_NULL,
VIRGL_OBJECT_BLEND,
VIRGL_OBJECT_RASTERIZER,
VIRGL_OBJECT_DSA,
VIRGL_OBJECT_SHADER,
VIRGL_OBJECT_VERTEX_ELEMENTS,
VIRGL_OBJECT_SAMPLER_VIEW,
VIRGL_OBJECT_SAMPLER_STATE,
VIRGL_OBJECT_SURFACE,
VIRGL_OBJECT_QUERY,
VIRGL_OBJECT_STREAMOUT_TARGET,
VIRGL_MAX_OBJECTS,
};
具体的编码函数:
virgl_encoder_write_cmd_dword() //生成command header
virgl_encoder_write_dword(); //followed dword
extern int virgl_encode_blend_state(struct virgl_context *ctx,
uint32_t handle,
const struct pipe_blend_state *blend_state);
extern int virgl_encode_rasterizer_state(struct virgl_context *ctx,
uint32_t handle,
const struct pipe_rasterizer_state *state);
extern int virgl_encode_shader_state(struct virgl_context *ctx,
uint32_t handle,
uint32_t type,
const struct pipe_stream_output_info *so_info,
uint32_t cs_req_local_mem,
const struct tgsi_token *tokens);
int virgl_encode_stream_output_info(struct virgl_context *ctx,
uint32_t handle,
uint32_t type,
const struct pipe_shader_state *shader);
int virgl_encoder_set_so_targets(struct virgl_context *ctx,
unsigned num_targets,
struct pipe_stream_output_target **targets,
unsigned append_bitmask);
int virgl_encoder_create_so_target(struct virgl_context *ctx,
uint32_t handle,
struct virgl_resource *res,
unsigned buffer_offset,
unsigned buffer_size);
int virgl_encode_clear(struct virgl_context *ctx,
unsigned buffers,
const union pipe_color_union *color,
double depth, unsigned stencil);
int virgl_encode_bind_object(struct virgl_context *ctx,
uint32_t handle, uint32_t object);
int virgl_encode_delete_object(struct virgl_context *ctx,
uint32_t handle, uint32_t object);
int virgl_encoder_set_framebuffer_state(struct virgl_context *ctx,
const struct pipe_framebuffer_state *state);
int virgl_encoder_set_viewport_states(struct virgl_context *ctx,
int start_slot,
int num_viewports,
const struct pipe_viewport_state *states);
int virgl_encoder_draw_vbo(struct virgl_context *ctx,
const struct pipe_draw_info *info);
int virgl_encoder_create_surface(struct virgl_context *ctx,
uint32_t handle,
struct virgl_resource *res,
const struct pipe_surface *templat);
int virgl_encoder_flush_frontbuffer(struct virgl_context *ctx,
struct virgl_resource *res);
int virgl_encoder_create_vertex_elements(struct virgl_context *ctx,
uint32_t handle,
unsigned num_elements,
const struct pipe_vertex_element *element);
int virgl_encoder_set_vertex_buffers(struct virgl_context *ctx,
unsigned num_buffers,
const struct pipe_vertex_buffer *buffers);
int virgl_encoder_inline_write(struct virgl_context *ctx,
struct virgl_resource *res,
unsigned level, unsigned usage,
const struct pipe_box *box,
const void *data, unsigned stride,
unsigned layer_stride);
int virgl_encode_sampler_state(struct virgl_context *ctx,
uint32_t handle,
const struct pipe_sampler_state *state);
int virgl_encode_sampler_view(struct virgl_context *ctx,
uint32_t handle,
struct virgl_resource *res,
const struct pipe_sampler_view *state);
int virgl_encode_set_sampler_views(struct virgl_context *ctx,
uint32_t shader_type,
uint32_t start_slot,
uint32_t num_views,
struct virgl_sampler_view **views);
int virgl_encode_bind_sampler_states(struct virgl_context *ctx,
uint32_t shader_type,
uint32_t start_slot,
uint32_t num_handles,
uint32_t *handles);
int virgl_encoder_set_index_buffer(struct virgl_context *ctx,
const struct virgl_indexbuf *ib);
uint32_t virgl_object_assign_handle(void);
int virgl_encoder_write_constant_buffer(struct virgl_context *ctx,
uint32_t shader,
uint32_t index,
uint32_t size,
const void *data);
int virgl_encoder_set_uniform_buffer(struct virgl_context *ctx,
uint32_t shader,
uint32_t index,
uint32_t offset,
uint32_t length,
struct virgl_resource *res);
int virgl_encode_dsa_state(struct virgl_context *ctx,
uint32_t handle,
const struct pipe_depth_stencil_alpha_state *dsa_state);
int virgl_encoder_set_stencil_ref(struct virgl_context *ctx,
const struct pipe_stencil_ref *ref);
int virgl_encoder_set_blend_color(struct virgl_context *ctx,
const struct pipe_blend_color *color);
int virgl_encoder_set_scissor_state(struct virgl_context *ctx,
unsigned start_slot,
int num_scissors,
const struct pipe_scissor_state *ss);
void virgl_encoder_set_polygon_stipple(struct virgl_context *ctx,
const struct pipe_poly_stipple *ps);
void virgl_encoder_set_sample_mask(struct virgl_context *ctx,
unsigned sample_mask);
void virgl_encoder_set_min_samples(struct virgl_context *ctx,
unsigned min_samples);
void virgl_encoder_set_clip_state(struct virgl_context *ctx,
const struct pipe_clip_state *clip);
int virgl_encode_resource_copy_region(struct virgl_context *ctx,
struct virgl_resource *dst_res,
unsigned dst_level,
unsigned dstx, unsigned dsty, unsigned dstz,
struct virgl_resource *src_res,
unsigned src_level,
const struct pipe_box *src_box);
int virgl_encode_blit(struct virgl_context *ctx,
struct virgl_resource *dst_res,
struct virgl_resource *src_res,
const struct pipe_blit_info *blit);
int virgl_encoder_create_query(struct virgl_context *ctx,
uint32_t handle,
uint query_type,
uint query_index,
struct virgl_resource *res,
uint32_t offset);
int virgl_encoder_begin_query(struct virgl_context *ctx,
uint32_t handle);
int virgl_encoder_end_query(struct virgl_context *ctx,
uint32_t handle);
int virgl_encoder_get_query_result(struct virgl_context *ctx,
uint32_t handle, boolean wait);
int virgl_encoder_render_condition(struct virgl_context *ctx,
uint32_t handle, boolean condition,
enum pipe_render_cond_flag mode);
int virgl_encoder_set_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
int virgl_encoder_create_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
int virgl_encoder_destroy_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
int virgl_encode_bind_shader(struct virgl_context *ctx,
uint32_t handle, uint32_t type);
int virgl_encode_set_tess_state(struct virgl_context *ctx,
const float outer[4],
const float inner[2]);
int virgl_encode_set_shader_buffers(struct virgl_context *ctx,
enum pipe_shader_type shader,
unsigned start_slot, unsigned count,
const struct pipe_shader_buffer *buffers);
int virgl_encode_set_shader_images(struct virgl_context *ctx,
enum pipe_shader_type shader,
unsigned start_slot, unsigned count,
const struct pipe_image_view *images);
int virgl_encode_set_hw_atomic_buffers(struct virgl_context *ctx,
unsigned start_slot, unsigned count,
const struct pipe_shader_buffer *buffers);
int virgl_encode_memory_barrier(struct virgl_context *ctx,
unsigned flags);
int virgl_encode_launch_grid(struct virgl_context *ctx,
const struct pipe_grid_info *grid_info);
int virgl_encode_texture_barrier(struct virgl_context *ctx,
unsigned flags);
int virgl_encode_host_debug_flagstring(struct virgl_context *ctx,
const char *envname);
int virgl_encode_get_query_result_qbo(struct virgl_context *ctx,
uint32_t handle,
struct virgl_resource *res, boolean wait,
uint32_t result_type,
uint32_t offset,
uint32_t index);
void virgl_encode_transfer(struct virgl_screen *vs, struct virgl_cmd_buf *buf,
struct virgl_transfer *trans, uint32_t direction);
void virgl_encode_copy_transfer(struct virgl_context *ctx,
struct virgl_transfer *trans);
void virgl_encode_end_transfers(struct virgl_cmd_buf *buf);
int virgl_encode_tweak(struct virgl_context *ctx, enum vrend_tweak_type tweak, uint32_t value);