mesa/src/gallium/drivers/virgl/virgl_encode.h
Feng Jiang 6b5aecb195 virgl: add support for hardware video acceleration
Currently H.264 and H.265 decoding is supported, and other profiles
and encodings will be added in the future.

This function relies on the virglrenderer commit:
a92fed821f5ac173ca82c011a5d7e5b25e7bd0eb

Signed-off-by: Feng Jiang <jiangfeng@kylinos.cn>
Signed-off-by: Ming Xie <xieming@kylinos.cn>
Signed-off-by: Liming Sun <sunliming@kylinos.cn>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17157>
2022-08-11 10:21:03 +00:00

349 lines
15 KiB
C

/*
* Copyright 2014, 2015 Red Hat.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* on the rights to use, copy, modify, merge, publish, distribute, sub
* license, and/or sell copies of the Software, and to permit persons to whom
* the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef VIRGL_ENCODE_H
#define VIRGL_ENCODE_H
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "virgl_winsys.h"
#include "virtio-gpu/virgl_protocol.h"
struct tgsi_token;
struct virgl_context;
struct virgl_resource;
struct virgl_screen;
struct virgl_transfer;
struct virgl_sampler_view;
struct virgl_video_codec;
struct virgl_video_buffer;
struct virgl_surface {
struct pipe_surface base;
uint32_t handle;
};
struct virgl_indexbuf {
unsigned offset;
unsigned index_size; /**< size of an index, in bytes */
struct pipe_resource *buffer; /**< the actual buffer */
const void *user_buffer; /**< pointer to a user buffer if buffer == NULL */
};
static inline struct virgl_surface *virgl_surface(struct pipe_surface *surf)
{
return (struct virgl_surface *)surf;
}
static inline void virgl_encoder_write_dword(struct virgl_cmd_buf *state,
uint32_t dword)
{
state->buf[state->cdw++] = dword;
}
static inline void virgl_encoder_write_qword(struct virgl_cmd_buf *state,
uint64_t qword)
{
memcpy(state->buf + state->cdw, &qword, sizeof(uint64_t));
state->cdw += 2;
}
static inline void virgl_encoder_write_block(struct virgl_cmd_buf *state,
const uint8_t *ptr, uint32_t len)
{
int x;
memcpy(state->buf + state->cdw, ptr, len);
x = (len % 4);
if (x) {
uint8_t *mp = (uint8_t *)(state->buf + state->cdw);
mp += len;
memset(mp, 0, x);
}
state->cdw += (len + 3) / 4;
}
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,
enum pipe_shader_type 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_clear_texture(struct virgl_context *ctx,
struct virgl_resource *res,
unsigned int level,
const struct pipe_box *box,
const void *data);
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,
unsigned drawid_offset,
const struct pipe_draw_indirect_info *indirect,
const struct pipe_draw_start_count_bias *draw);
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,
enum pipe_shader_type 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,
enum pipe_shader_type 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,
enum pipe_shader_type shader,
uint32_t index,
uint32_t size,
const void *data);
int virgl_encoder_set_uniform_buffer(struct virgl_context *ctx,
enum pipe_shader_type 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_link_shader(struct virgl_context *ctx, uint32_t *handles);
int virgl_encode_bind_shader(struct virgl_context *ctx,
uint32_t handle,
enum pipe_shader_type 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);
void virgl_encode_get_memory_info(struct virgl_context *ctx, struct virgl_resource *res);
void virgl_encode_emit_string_marker(struct virgl_context *ctx, const char *message,
int len);
void virgl_encode_create_video_codec(struct virgl_context *ctx,
struct virgl_video_codec *cdc);
void virgl_encode_destroy_video_codec(struct virgl_context *ctx,
struct virgl_video_codec *cdc);
void virgl_encode_create_video_buffer(struct virgl_context *ctx,
struct virgl_video_buffer *buf);
void virgl_encode_destroy_video_buffer(struct virgl_context *ctx,
struct virgl_video_buffer *buf);
void virgl_encode_begin_frame(struct virgl_context *ctx,
struct virgl_video_codec *cdc,
struct virgl_video_buffer *buf);
void virgl_encode_decode_bitstream(struct virgl_context *ctx,
struct virgl_video_codec *cdc,
struct virgl_video_buffer *buf,
void *desc, uint32_t desc_size);
void virgl_encode_end_frame(struct virgl_context *ctx,
struct virgl_video_codec *cdc,
struct virgl_video_buffer *buf);
enum virgl_formats pipe_to_virgl_format(enum pipe_format format);
enum pipe_format virgl_to_pipe_format(enum virgl_formats format);
#endif