virgl command 解析

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);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值