101e04c3fSmrg/*
201e04c3fSmrg * Copyright 2014, 2015 Red Hat.
301e04c3fSmrg *
401e04c3fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
501e04c3fSmrg * copy of this software and associated documentation files (the "Software"),
601e04c3fSmrg * to deal in the Software without restriction, including without limitation
701e04c3fSmrg * on the rights to use, copy, modify, merge, publish, distribute, sub
801e04c3fSmrg * license, and/or sell copies of the Software, and to permit persons to whom
901e04c3fSmrg * the Software is furnished to do so, subject to the following conditions:
1001e04c3fSmrg *
1101e04c3fSmrg * The above copyright notice and this permission notice (including the next
1201e04c3fSmrg * paragraph) shall be included in all copies or substantial portions of the
1301e04c3fSmrg * Software.
1401e04c3fSmrg *
1501e04c3fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1601e04c3fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1701e04c3fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1801e04c3fSmrg * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1901e04c3fSmrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2001e04c3fSmrg * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2101e04c3fSmrg * USE OR OTHER DEALINGS IN THE SOFTWARE.
2201e04c3fSmrg */
2301e04c3fSmrg#ifndef VIRGL_ENCODE_H
2401e04c3fSmrg#define VIRGL_ENCODE_H
2501e04c3fSmrg
2601e04c3fSmrg#include "pipe/p_defines.h"
2701e04c3fSmrg#include "pipe/p_state.h"
2801e04c3fSmrg
2901e04c3fSmrg#include "virgl_winsys.h"
307ec681f3Smrg#include "virtio-gpu/virgl_protocol.h"
3101e04c3fSmrg
3201e04c3fSmrgstruct tgsi_token;
3301e04c3fSmrg
3401e04c3fSmrgstruct virgl_context;
3501e04c3fSmrgstruct virgl_resource;
369f464c52Smayastruct virgl_screen;
379f464c52Smayastruct virgl_transfer;
3801e04c3fSmrgstruct virgl_sampler_view;
3901e04c3fSmrg
4001e04c3fSmrgstruct virgl_surface {
4101e04c3fSmrg   struct pipe_surface base;
4201e04c3fSmrg   uint32_t handle;
4301e04c3fSmrg};
4401e04c3fSmrg
4501e04c3fSmrgstruct virgl_indexbuf {
4601e04c3fSmrg   unsigned offset;
4701e04c3fSmrg   unsigned index_size;  /**< size of an index, in bytes */
4801e04c3fSmrg   struct pipe_resource *buffer; /**< the actual buffer */
4901e04c3fSmrg   const void *user_buffer;  /**< pointer to a user buffer if buffer == NULL */
5001e04c3fSmrg};
5101e04c3fSmrg
5201e04c3fSmrgstatic inline struct virgl_surface *virgl_surface(struct pipe_surface *surf)
5301e04c3fSmrg{
5401e04c3fSmrg   return (struct virgl_surface *)surf;
5501e04c3fSmrg}
5601e04c3fSmrg
5701e04c3fSmrgstatic inline void virgl_encoder_write_dword(struct virgl_cmd_buf *state,
5801e04c3fSmrg                                            uint32_t dword)
5901e04c3fSmrg{
6001e04c3fSmrg   state->buf[state->cdw++] = dword;
6101e04c3fSmrg}
6201e04c3fSmrg
6301e04c3fSmrgstatic inline void virgl_encoder_write_qword(struct virgl_cmd_buf *state,
6401e04c3fSmrg                                            uint64_t qword)
6501e04c3fSmrg{
6601e04c3fSmrg   memcpy(state->buf + state->cdw, &qword, sizeof(uint64_t));
6701e04c3fSmrg   state->cdw += 2;
6801e04c3fSmrg}
6901e04c3fSmrg
7001e04c3fSmrgstatic inline void virgl_encoder_write_block(struct virgl_cmd_buf *state,
7101e04c3fSmrg                                            const uint8_t *ptr, uint32_t len)
7201e04c3fSmrg{
7301e04c3fSmrg   int x;
7401e04c3fSmrg   memcpy(state->buf + state->cdw, ptr, len);
7501e04c3fSmrg   x = (len % 4);
7601e04c3fSmrg   if (x) {
7701e04c3fSmrg      uint8_t *mp = (uint8_t *)(state->buf + state->cdw);
7801e04c3fSmrg      mp += len;
7901e04c3fSmrg      memset(mp, 0, x);
8001e04c3fSmrg   }
8101e04c3fSmrg   state->cdw += (len + 3) / 4;
8201e04c3fSmrg}
8301e04c3fSmrg
8401e04c3fSmrgextern int virgl_encode_blend_state(struct virgl_context *ctx,
8501e04c3fSmrg                                   uint32_t handle,
8601e04c3fSmrg                                   const struct pipe_blend_state *blend_state);
8701e04c3fSmrgextern int virgl_encode_rasterizer_state(struct virgl_context *ctx,
8801e04c3fSmrg                                         uint32_t handle,
8901e04c3fSmrg                                         const struct pipe_rasterizer_state *state);
9001e04c3fSmrg
9101e04c3fSmrgextern int virgl_encode_shader_state(struct virgl_context *ctx,
9201e04c3fSmrg                                     uint32_t handle,
9301e04c3fSmrg                                     uint32_t type,
9401e04c3fSmrg                                     const struct pipe_stream_output_info *so_info,
9501e04c3fSmrg                                     uint32_t cs_req_local_mem,
9601e04c3fSmrg                                     const struct tgsi_token *tokens);
9701e04c3fSmrg
9801e04c3fSmrgint virgl_encode_stream_output_info(struct virgl_context *ctx,
9901e04c3fSmrg                                   uint32_t handle,
10001e04c3fSmrg                                   uint32_t type,
10101e04c3fSmrg                                   const struct pipe_shader_state *shader);
10201e04c3fSmrg
10301e04c3fSmrgint virgl_encoder_set_so_targets(struct virgl_context *ctx,
10401e04c3fSmrg                                unsigned num_targets,
10501e04c3fSmrg                                struct pipe_stream_output_target **targets,
10601e04c3fSmrg                                unsigned append_bitmask);
10701e04c3fSmrg
10801e04c3fSmrgint virgl_encoder_create_so_target(struct virgl_context *ctx,
10901e04c3fSmrg                                  uint32_t handle,
11001e04c3fSmrg                                  struct virgl_resource *res,
11101e04c3fSmrg                                  unsigned buffer_offset,
11201e04c3fSmrg                                  unsigned buffer_size);
11301e04c3fSmrg
11401e04c3fSmrgint virgl_encode_clear(struct virgl_context *ctx,
11501e04c3fSmrg                      unsigned buffers,
11601e04c3fSmrg                      const union pipe_color_union *color,
11701e04c3fSmrg                      double depth, unsigned stencil);
11801e04c3fSmrg
1197ec681f3Smrgint virgl_encode_clear_texture(struct virgl_context *ctx,
1207ec681f3Smrg                               struct virgl_resource *res,
1217ec681f3Smrg                               unsigned int level,
1227ec681f3Smrg                               const struct pipe_box *box,
1237ec681f3Smrg                               const void *data);
1247ec681f3Smrg
12501e04c3fSmrgint virgl_encode_bind_object(struct virgl_context *ctx,
12601e04c3fSmrg                            uint32_t handle, uint32_t object);
12701e04c3fSmrgint virgl_encode_delete_object(struct virgl_context *ctx,
12801e04c3fSmrg                              uint32_t handle, uint32_t object);
12901e04c3fSmrg
13001e04c3fSmrgint virgl_encoder_set_framebuffer_state(struct virgl_context *ctx,
13101e04c3fSmrg                                       const struct pipe_framebuffer_state *state);
13201e04c3fSmrgint virgl_encoder_set_viewport_states(struct virgl_context *ctx,
13301e04c3fSmrg                                      int start_slot,
13401e04c3fSmrg                                      int num_viewports,
13501e04c3fSmrg                                      const struct pipe_viewport_state *states);
13601e04c3fSmrg
13701e04c3fSmrgint virgl_encoder_draw_vbo(struct virgl_context *ctx,
1387ec681f3Smrg                           const struct pipe_draw_info *info,
1397ec681f3Smrg                           unsigned drawid_offset,
1407ec681f3Smrg                           const struct pipe_draw_indirect_info *indirect,
1417ec681f3Smrg                           const struct pipe_draw_start_count_bias *draw);
14201e04c3fSmrg
14301e04c3fSmrg
14401e04c3fSmrgint virgl_encoder_create_surface(struct virgl_context *ctx,
14501e04c3fSmrg                                uint32_t handle,
14601e04c3fSmrg                                struct virgl_resource *res,
14701e04c3fSmrg                                const struct pipe_surface *templat);
14801e04c3fSmrg
14901e04c3fSmrgint virgl_encoder_flush_frontbuffer(struct virgl_context *ctx,
15001e04c3fSmrg                                   struct virgl_resource *res);
15101e04c3fSmrg
15201e04c3fSmrgint virgl_encoder_create_vertex_elements(struct virgl_context *ctx,
15301e04c3fSmrg                                        uint32_t handle,
15401e04c3fSmrg                                        unsigned num_elements,
15501e04c3fSmrg                                        const struct pipe_vertex_element *element);
15601e04c3fSmrg
15701e04c3fSmrgint virgl_encoder_set_vertex_buffers(struct virgl_context *ctx,
15801e04c3fSmrg                                    unsigned num_buffers,
15901e04c3fSmrg                                    const struct pipe_vertex_buffer *buffers);
16001e04c3fSmrg
16101e04c3fSmrg
16201e04c3fSmrgint virgl_encoder_inline_write(struct virgl_context *ctx,
16301e04c3fSmrg                              struct virgl_resource *res,
16401e04c3fSmrg                              unsigned level, unsigned usage,
16501e04c3fSmrg                              const struct pipe_box *box,
16601e04c3fSmrg                              const void *data, unsigned stride,
16701e04c3fSmrg                              unsigned layer_stride);
16801e04c3fSmrgint virgl_encode_sampler_state(struct virgl_context *ctx,
16901e04c3fSmrg                              uint32_t handle,
17001e04c3fSmrg                              const struct pipe_sampler_state *state);
17101e04c3fSmrgint virgl_encode_sampler_view(struct virgl_context *ctx,
17201e04c3fSmrg                             uint32_t handle,
17301e04c3fSmrg                             struct virgl_resource *res,
17401e04c3fSmrg                             const struct pipe_sampler_view *state);
17501e04c3fSmrg
17601e04c3fSmrgint virgl_encode_set_sampler_views(struct virgl_context *ctx,
17701e04c3fSmrg                                  uint32_t shader_type,
17801e04c3fSmrg                                  uint32_t start_slot,
17901e04c3fSmrg                                  uint32_t num_views,
18001e04c3fSmrg                                  struct virgl_sampler_view **views);
18101e04c3fSmrg
18201e04c3fSmrgint virgl_encode_bind_sampler_states(struct virgl_context *ctx,
18301e04c3fSmrg                                    uint32_t shader_type,
18401e04c3fSmrg                                    uint32_t start_slot,
18501e04c3fSmrg                                    uint32_t num_handles,
18601e04c3fSmrg                                    uint32_t *handles);
18701e04c3fSmrg
18801e04c3fSmrgint virgl_encoder_set_index_buffer(struct virgl_context *ctx,
18901e04c3fSmrg                                  const struct virgl_indexbuf *ib);
19001e04c3fSmrg
19101e04c3fSmrguint32_t virgl_object_assign_handle(void);
19201e04c3fSmrg
19301e04c3fSmrgint virgl_encoder_write_constant_buffer(struct virgl_context *ctx,
19401e04c3fSmrg                                       uint32_t shader,
19501e04c3fSmrg                                       uint32_t index,
19601e04c3fSmrg                                       uint32_t size,
19701e04c3fSmrg                                       const void *data);
19801e04c3fSmrg
19901e04c3fSmrgint virgl_encoder_set_uniform_buffer(struct virgl_context *ctx,
20001e04c3fSmrg                                     uint32_t shader,
20101e04c3fSmrg                                     uint32_t index,
20201e04c3fSmrg                                     uint32_t offset,
20301e04c3fSmrg                                     uint32_t length,
20401e04c3fSmrg                                     struct virgl_resource *res);
20501e04c3fSmrgint virgl_encode_dsa_state(struct virgl_context *ctx,
20601e04c3fSmrg                          uint32_t handle,
20701e04c3fSmrg                          const struct pipe_depth_stencil_alpha_state *dsa_state);
20801e04c3fSmrg
20901e04c3fSmrgint virgl_encoder_set_stencil_ref(struct virgl_context *ctx,
21001e04c3fSmrg                                 const struct pipe_stencil_ref *ref);
21101e04c3fSmrg
21201e04c3fSmrgint virgl_encoder_set_blend_color(struct virgl_context *ctx,
21301e04c3fSmrg                                 const struct pipe_blend_color *color);
21401e04c3fSmrg
21501e04c3fSmrgint virgl_encoder_set_scissor_state(struct virgl_context *ctx,
21601e04c3fSmrg                                    unsigned start_slot,
21701e04c3fSmrg                                    int num_scissors,
21801e04c3fSmrg                                    const struct pipe_scissor_state *ss);
21901e04c3fSmrg
22001e04c3fSmrgvoid virgl_encoder_set_polygon_stipple(struct virgl_context *ctx,
22101e04c3fSmrg                                      const struct pipe_poly_stipple *ps);
22201e04c3fSmrg
22301e04c3fSmrgvoid virgl_encoder_set_sample_mask(struct virgl_context *ctx,
22401e04c3fSmrg                                  unsigned sample_mask);
22501e04c3fSmrg
22601e04c3fSmrgvoid virgl_encoder_set_min_samples(struct virgl_context *ctx,
22701e04c3fSmrg                                  unsigned min_samples);
22801e04c3fSmrg
22901e04c3fSmrgvoid virgl_encoder_set_clip_state(struct virgl_context *ctx,
23001e04c3fSmrg                                 const struct pipe_clip_state *clip);
23101e04c3fSmrg
23201e04c3fSmrgint virgl_encode_resource_copy_region(struct virgl_context *ctx,
23301e04c3fSmrg                                     struct virgl_resource *dst_res,
23401e04c3fSmrg                                     unsigned dst_level,
23501e04c3fSmrg                                     unsigned dstx, unsigned dsty, unsigned dstz,
23601e04c3fSmrg                                     struct virgl_resource *src_res,
23701e04c3fSmrg                                     unsigned src_level,
23801e04c3fSmrg                                     const struct pipe_box *src_box);
23901e04c3fSmrg
24001e04c3fSmrgint virgl_encode_blit(struct virgl_context *ctx,
24101e04c3fSmrg                     struct virgl_resource *dst_res,
24201e04c3fSmrg                     struct virgl_resource *src_res,
24301e04c3fSmrg                     const struct pipe_blit_info *blit);
24401e04c3fSmrg
24501e04c3fSmrgint virgl_encoder_create_query(struct virgl_context *ctx,
24601e04c3fSmrg                              uint32_t handle,
24701e04c3fSmrg                              uint query_type,
24801e04c3fSmrg                              uint query_index,
24901e04c3fSmrg                              struct virgl_resource *res,
25001e04c3fSmrg                              uint32_t offset);
25101e04c3fSmrg
25201e04c3fSmrgint virgl_encoder_begin_query(struct virgl_context *ctx,
25301e04c3fSmrg                             uint32_t handle);
25401e04c3fSmrgint virgl_encoder_end_query(struct virgl_context *ctx,
25501e04c3fSmrg                           uint32_t handle);
25601e04c3fSmrgint virgl_encoder_get_query_result(struct virgl_context *ctx,
25701e04c3fSmrg                                  uint32_t handle, boolean wait);
25801e04c3fSmrg
25901e04c3fSmrgint virgl_encoder_render_condition(struct virgl_context *ctx,
26001e04c3fSmrg                                  uint32_t handle, boolean condition,
26101e04c3fSmrg                                  enum pipe_render_cond_flag mode);
26201e04c3fSmrg
26301e04c3fSmrgint virgl_encoder_set_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
26401e04c3fSmrgint virgl_encoder_create_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
26501e04c3fSmrgint virgl_encoder_destroy_sub_ctx(struct virgl_context *ctx, uint32_t sub_ctx_id);
26601e04c3fSmrg
26701e04c3fSmrgint virgl_encode_bind_shader(struct virgl_context *ctx,
26801e04c3fSmrg                             uint32_t handle, uint32_t type);
26901e04c3fSmrg
27001e04c3fSmrgint virgl_encode_set_tess_state(struct virgl_context *ctx,
27101e04c3fSmrg                                const float outer[4],
27201e04c3fSmrg                                const float inner[2]);
27301e04c3fSmrg
27401e04c3fSmrgint virgl_encode_set_shader_buffers(struct virgl_context *ctx,
27501e04c3fSmrg                                    enum pipe_shader_type shader,
27601e04c3fSmrg                                    unsigned start_slot, unsigned count,
27701e04c3fSmrg                                    const struct pipe_shader_buffer *buffers);
27801e04c3fSmrgint virgl_encode_set_shader_images(struct virgl_context *ctx,
27901e04c3fSmrg                                   enum pipe_shader_type shader,
28001e04c3fSmrg                                   unsigned start_slot, unsigned count,
28101e04c3fSmrg                                   const struct pipe_image_view *images);
28201e04c3fSmrgint virgl_encode_set_hw_atomic_buffers(struct virgl_context *ctx,
28301e04c3fSmrg                                       unsigned start_slot, unsigned count,
28401e04c3fSmrg                                       const struct pipe_shader_buffer *buffers);
28501e04c3fSmrgint virgl_encode_memory_barrier(struct virgl_context *ctx,
28601e04c3fSmrg                                unsigned flags);
28701e04c3fSmrgint virgl_encode_launch_grid(struct virgl_context *ctx,
28801e04c3fSmrg                             const struct pipe_grid_info *grid_info);
28901e04c3fSmrgint virgl_encode_texture_barrier(struct virgl_context *ctx,
29001e04c3fSmrg                                 unsigned flags);
2919f464c52Smaya
2929f464c52Smayaint virgl_encode_host_debug_flagstring(struct virgl_context *ctx,
2939f464c52Smaya                                  const char *envname);
2949f464c52Smaya
2959f464c52Smayaint virgl_encode_get_query_result_qbo(struct virgl_context *ctx,
2969f464c52Smaya                                      uint32_t handle,
2979f464c52Smaya                                      struct virgl_resource *res, boolean wait,
2989f464c52Smaya                                      uint32_t result_type,
2999f464c52Smaya                                      uint32_t offset,
3009f464c52Smaya                                      uint32_t index);
3019f464c52Smaya
3029f464c52Smayavoid virgl_encode_transfer(struct virgl_screen *vs, struct virgl_cmd_buf *buf,
3039f464c52Smaya                           struct virgl_transfer *trans, uint32_t direction);
3049f464c52Smaya
3057ec681f3Smrgvoid virgl_encode_copy_transfer(struct virgl_context *ctx,
3067ec681f3Smrg                                struct virgl_transfer *trans);
3077ec681f3Smrg
3089f464c52Smayavoid virgl_encode_end_transfers(struct virgl_cmd_buf *buf);
3097ec681f3Smrg
3107ec681f3Smrgint virgl_encode_tweak(struct virgl_context *ctx, enum vrend_tweak_type tweak, uint32_t value);
3117ec681f3Smrg
3127ec681f3Smrgvoid virgl_encode_get_memory_info(struct virgl_context *ctx, struct virgl_resource *res);
3137ec681f3Smrg
3147ec681f3Smrgvoid virgl_encode_emit_string_marker(struct virgl_context *ctx, const char *message,
3157ec681f3Smrg                                       int len);
3167ec681f3Smrg
3177ec681f3Smrgenum virgl_formats pipe_to_virgl_format(enum pipe_format format);
31801e04c3fSmrg#endif
319