You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
virglrenderer/src/virtgpu_hw.h

289 lines
7.3 KiB

/**************************************************************************
*
* Copyright (C) 2015 Red Hat Inc.
*
* 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
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* 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 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 NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS 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 VIRTGPU_HW_H
#define VIRTGPU_HW_H
#define VIRTGPU_CMD_HAS_RESP (1 << 31)
#define VIRTGPU_CMD_3D_ONLY (1 << 30)
enum virtgpu_ctrl_cmd {
VIRTGPU_CMD_NOP,
VIRTGPU_CMD_GET_DISPLAY_INFO = (1 | VIRTGPU_CMD_HAS_RESP),
VIRTGPU_CMD_GET_CAPS = (2 | VIRTGPU_CMD_HAS_RESP),
VIRTGPU_CMD_RESOURCE_CREATE_2D = 3,
VIRTGPU_CMD_RESOURCE_UNREF = 4,
VIRTGPU_CMD_SET_SCANOUT = 5,
VIRTGPU_CMD_RESOURCE_FLUSH = 6,
VIRTGPU_CMD_TRANSFER_TO_HOST_2D = 7,
VIRTGPU_CMD_RESOURCE_ATTACH_BACKING = 8,
VIRTGPU_CMD_RESOURCE_INVAL_BACKING = 9,
VIRTGPU_CMD_CTX_CREATE = (10 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_CTX_DESTROY = (11 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_CTX_ATTACH_RESOURCE = (12 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_CTX_DETACH_RESOURCE = (13 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_RESOURCE_CREATE_3D = (14 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_TRANSFER_TO_HOST_3D = (15 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_TRANSFER_FROM_HOST_3D = (16 | VIRTGPU_CMD_3D_ONLY),
VIRTGPU_CMD_SUBMIT_3D = (17 | VIRTGPU_CMD_3D_ONLY),
};
enum virtgpu_ctrl_event {
VIRTGPU_EVENT_NOP,
VIRTGPU_EVENT_ERROR,
VIRTGPU_EVENT_DISPLAY_CHANGE,
};
/* data passed in the cursor vq */
struct virtgpu_hw_cursor_page {
uint32_t cursor_x, cursor_y;
uint32_t cursor_hot_x, cursor_hot_y;
uint32_t cursor_id;
};
struct virtgpu_resource_unref {
uint32_t resource_id;
};
/* create a simple 2d resource with a format */
struct virtgpu_resource_create_2d {
uint32_t resource_id;
uint32_t format;
uint32_t width;
uint32_t height;
};
struct virtgpu_set_scanout {
uint32_t scanout_id;
uint32_t resource_id;
uint32_t width;
uint32_t height;
uint32_t x;
uint32_t y;
};
struct virtgpu_resource_flush {
uint32_t resource_id;
uint32_t width;
uint32_t height;
uint32_t x;
uint32_t y;
};
/* simple transfer to_host */
struct virtgpu_transfer_to_host_2d {
uint32_t resource_id;
uint32_t offset;
uint32_t width;
uint32_t height;
uint32_t x;
uint32_t y;
};
struct virtgpu_mem_entry {
uint64_t addr;
uint32_t length;
uint32_t pad;
};
struct virtgpu_resource_attach_backing {
uint32_t resource_id;
uint32_t nr_entries;
};
struct virtgpu_resource_inval_backing {
uint32_t resource_id;
};
#define VIRTGPU_MAX_SCANOUTS 16
struct virtgpu_display_info {
uint32_t num_scanouts;
struct {
uint32_t enabled;
uint32_t width;
uint32_t height;
uint32_t x;
uint32_t y;
uint32_t flags;
} pmodes[VIRTGPU_MAX_SCANOUTS];
};
/* 3d related */
struct virtgpu_box {
uint32_t x, y, z;
uint32_t w, h, d;
};
struct virtgpu_transfer_to_host_3d {
uint64_t data;
uint32_t resource_id;
uint32_t level;
struct virtgpu_box box;
uint32_t stride;
uint32_t layer_stride;
uint32_t ctx_id;
};
struct virtgpu_transfer_from_host_3d {
uint64_t data;
uint32_t resource_id;
uint32_t level;
struct virtgpu_box box;
uint32_t stride;
uint32_t layer_stride;
uint32_t ctx_id;
};
#define VIRTGPU_RESOURCE_FLAG_Y_0_TOP (1 << 0)
struct virtgpu_resource_create_3d {
uint32_t resource_id;
uint32_t target;
uint32_t format;
uint32_t bind;
uint32_t width;
uint32_t height;
uint32_t depth;
uint32_t array_size;
uint32_t last_level;
uint32_t nr_samples;
uint32_t flags;
};
struct virtgpu_ctx_create {
uint32_t ctx_id;
uint32_t nlen;
char debug_name[64];
};
struct virtgpu_ctx_destroy {
uint32_t ctx_id;
};
struct virtgpu_ctx_resource {
uint32_t resource_id;
uint32_t ctx_id;
};
struct virtgpu_cmd_submit {
uint64_t phy_addr;
uint32_t size;
uint32_t ctx_id;
};
struct virtgpu_caps_bool_set1 {
unsigned indep_blend_enable:1;
unsigned indep_blend_func:1;
unsigned cube_map_array:1;
unsigned shader_stencil_export:1;
unsigned conditional_render:1;
unsigned start_instance:1;
unsigned primitive_restart:1;
unsigned blend_eq_sep:1;
unsigned instanceid:1;
unsigned vertex_element_instance_divisor:1;
unsigned seamless_cube_map:1;
unsigned occlusion_query:1;
unsigned timer_query:1;
unsigned streamout_pause_resume:1;
};
/* endless expansion capabilites - current gallium has 252 formats */
struct virtgpu_supported_format_mask {
uint32_t bitmask[16];
};
/* capabilities set 2 - version 1 - 32-bit and float values */
struct virtgpu_caps_v1 {
uint32_t max_version;
struct virtgpu_supported_format_mask sampler;
struct virtgpu_supported_format_mask render;
struct virtgpu_supported_format_mask depthstencil;
struct virtgpu_supported_format_mask vertexbuffer;
struct virtgpu_caps_bool_set1 bset;
uint32_t glsl_level;
uint32_t max_texture_array_layers;
uint32_t max_streamout_buffers;
uint32_t max_dual_source_render_targets;
uint32_t max_render_targets;
};
union virtgpu_caps {
uint32_t max_version;
struct virtgpu_caps_v1 v1;
};
struct virtgpu_cmd_get_cap {
uint32_t cap_set;
uint32_t cap_set_version;
};
#define VIRTGPU_COMMAND_EMIT_FENCE (1 << 0)
struct virtgpu_command {
uint32_t type;
uint32_t flags;
uint64_t fence_id;
union virtgpu_cmds {
struct virtgpu_resource_create_2d resource_create_2d;
struct virtgpu_resource_unref resource_unref;
struct virtgpu_resource_flush resource_flush;
struct virtgpu_set_scanout set_scanout;
struct virtgpu_transfer_to_host_2d transfer_to_host_2d;
struct virtgpu_resource_attach_backing resource_attach_backing;
struct virtgpu_resource_inval_backing resource_inval_backing;
struct virtgpu_cmd_submit cmd_submit;
struct virtgpu_ctx_create ctx_create;
struct virtgpu_ctx_destroy ctx_destroy;
struct virtgpu_ctx_resource ctx_resource;
struct virtgpu_resource_create_3d resource_create_3d;
struct virtgpu_transfer_to_host_3d transfer_to_host_3d;
struct virtgpu_transfer_from_host_3d transfer_from_host_3d;
struct virtgpu_cmd_get_cap get_cap;
} u;
};
struct virtgpu_response {
uint32_t type;
uint32_t flags;
union virtgpu_resps {
struct virtgpu_display_info display_info;
union virtgpu_caps caps;
} u;
};
struct virtgpu_event {
uint32_t type;
uint32_t err_code;
union virtgpu_events {
struct virtgpu_display_info display_info;
} u;
};
#endif