mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 07:07:34 +00:00
Kernel: Implement basic VirGL device
This commit flips VirtIOGPU back to using a Mutex for its operation lock (instead of a spinlock). This is necessary for avoiding a few system hangs when queuing actions on the driver from multiple processes, which becomes much more of an issue when using VirGL from multiple userspace process. This does result in a few code paths where we inevitably have to grab a mutex from inside a spinlock, the only way to fix both issues is to move to issuing asynchronous virtio gpu commands.
This commit is contained in:
parent
966989afe8
commit
fd6a536c60
7 changed files with 503 additions and 8 deletions
|
@ -11,10 +11,28 @@
|
|||
#define VIRTIO_GPU_MAX_SCANOUTS 16
|
||||
|
||||
namespace Kernel::Graphics::VirtIOGPU {
|
||||
TYPEDEF_DISTINCT_ORDERED_ID(u32, ContextID);
|
||||
TYPEDEF_DISTINCT_ORDERED_ID(u32, ResourceID);
|
||||
TYPEDEF_DISTINCT_ORDERED_ID(u32, ScanoutID);
|
||||
};
|
||||
|
||||
#define VREND_MAX_CTX 64
|
||||
|
||||
#define VIRGL_BIND_DEPTH_STENCIL (1 << 0)
|
||||
#define VIRGL_BIND_RENDER_TARGET (1 << 1)
|
||||
#define VIRGL_BIND_SAMPLER_VIEW (1 << 3)
|
||||
#define VIRGL_BIND_VERTEX_BUFFER (1 << 4)
|
||||
#define VIRGL_BIND_INDEX_BUFFER (1 << 5)
|
||||
#define VIRGL_BIND_CONSTANT_BUFFER (1 << 6)
|
||||
#define VIRGL_BIND_DISPLAY_TARGET (1 << 7)
|
||||
#define VIRGL_BIND_COMMAND_ARGS (1 << 8)
|
||||
#define VIRGL_BIND_STREAM_OUTPUT (1 << 11)
|
||||
#define VIRGL_BIND_SHADER_BUFFER (1 << 14)
|
||||
#define VIRGL_BIND_QUERY_BUFFER (1 << 15)
|
||||
#define VIRGL_BIND_CURSOR (1 << 16)
|
||||
#define VIRGL_BIND_CUSTOM (1 << 17)
|
||||
#define VIRGL_BIND_SCANOUT (1 << 18)
|
||||
|
||||
namespace Kernel::Graphics::VirtIOGPU::Protocol {
|
||||
|
||||
// Specification equivalent: enum virtio_gpu_ctrl_type
|
||||
|
@ -32,6 +50,18 @@ enum class CommandType : u32 {
|
|||
VIRTIO_GPU_CMD_GET_CAPSET,
|
||||
VIRTIO_GPU_CMD_GET_EDID,
|
||||
|
||||
/* 3d commands */
|
||||
VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
|
||||
VIRTIO_GPU_CMD_CTX_DESTROY,
|
||||
VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
|
||||
VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
|
||||
VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
|
||||
VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
|
||||
VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
|
||||
VIRTIO_GPU_CMD_SUBMIT_3D,
|
||||
VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
|
||||
VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
|
||||
|
||||
/* cursor commands */
|
||||
VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
|
||||
VIRTIO_GPU_CMD_MOVE_CURSOR,
|
||||
|
@ -52,6 +82,54 @@ enum class CommandType : u32 {
|
|||
VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
|
||||
};
|
||||
|
||||
enum class ObjectType : u32 {
|
||||
NONE,
|
||||
BLEND,
|
||||
RASTERIZER,
|
||||
DSA,
|
||||
SHADER,
|
||||
VERTEX_ELEMENTS,
|
||||
SAMPLER_VIEW,
|
||||
SAMPLER_STATE,
|
||||
SURFACE,
|
||||
QUERY,
|
||||
STREAMOUT_TARGET,
|
||||
MSAA_SURFACE,
|
||||
MAX_OBJECTS,
|
||||
};
|
||||
|
||||
enum class PipeTextureTarget : u32 {
|
||||
BUFFER = 0,
|
||||
TEXTURE_1D,
|
||||
TEXTURE_2D,
|
||||
TEXTURE_3D,
|
||||
TEXTURE_CUBE,
|
||||
TEXTURE_RECT,
|
||||
TEXTURE_1D_ARRAY,
|
||||
TEXTURE_2D_ARRAY,
|
||||
TEXTURE_CUBE_ARRAY,
|
||||
MAX
|
||||
};
|
||||
|
||||
enum class PipePrimitiveTypes : u32 {
|
||||
POINTS = 0,
|
||||
LINES,
|
||||
LINE_LOOP,
|
||||
LINE_STRIP,
|
||||
TRIANGLES,
|
||||
TRIANGLE_STRIP,
|
||||
TRIANGLE_FAN,
|
||||
QUADS,
|
||||
QUAD_STRIP,
|
||||
POLYGON,
|
||||
LINES_ADJACENCY,
|
||||
LINE_STRIP_ADJACENCY,
|
||||
TRIANGLES_ADJACENCY,
|
||||
TRIANGLE_STRIP_ADJACENCY,
|
||||
PATCHES,
|
||||
MAX
|
||||
};
|
||||
|
||||
// Specification equivalent: struct virtio_gpu_ctrl_hdr
|
||||
struct ControlHeader {
|
||||
u32 type;
|
||||
|
@ -103,6 +181,23 @@ struct ResourceCreate2D {
|
|||
u32 height;
|
||||
};
|
||||
|
||||
// Specification equivalent: struct virtio_gpu_resource_create_3d
|
||||
struct ResourceCreate3D {
|
||||
ControlHeader header;
|
||||
u32 resource_id;
|
||||
u32 target;
|
||||
u32 format;
|
||||
u32 bind;
|
||||
u32 width;
|
||||
u32 height;
|
||||
u32 depth;
|
||||
u32 array_size;
|
||||
u32 last_level;
|
||||
u32 nr_samples;
|
||||
u32 flags;
|
||||
u32 padding;
|
||||
};
|
||||
|
||||
// Specification equivalent: struct virtio_gpu_resource_unref
|
||||
struct ResourceUnref {
|
||||
ControlHeader header;
|
||||
|
@ -171,4 +266,68 @@ struct GetEDIDResponse {
|
|||
u8 edid[1024];
|
||||
};
|
||||
|
||||
// No equivalent in specification
|
||||
struct ContextCreate {
|
||||
ControlHeader header;
|
||||
u32 name_length;
|
||||
u32 padding;
|
||||
AK::Array<char, 64> debug_name;
|
||||
};
|
||||
|
||||
static_assert(sizeof(ContextCreate::debug_name) == 64);
|
||||
|
||||
// No equivalent in specification
|
||||
struct ContextAttachResource {
|
||||
ControlHeader header;
|
||||
u32 resource_id;
|
||||
u32 padding;
|
||||
};
|
||||
|
||||
// No equivalent in specification
|
||||
struct CommandSubmit {
|
||||
ControlHeader header;
|
||||
u32 size;
|
||||
u32 padding;
|
||||
};
|
||||
|
||||
namespace Gallium {
|
||||
|
||||
enum class PipeTextureTarget : u32 {
|
||||
BUFFER,
|
||||
TEXTURE_1D,
|
||||
TEXTURE_2D,
|
||||
TEXTURE_3D,
|
||||
TEXTURE_CUBE,
|
||||
TEXTURE_RECT,
|
||||
TEXTURE_1D_ARRAY,
|
||||
TEXTURE_2D_ARRAY,
|
||||
TEXTURE_CUBE_ARRAY,
|
||||
MAX_TEXTURE_TYPES,
|
||||
};
|
||||
|
||||
enum class ShaderType : u32 {
|
||||
SHADER_VERTEX = 0,
|
||||
SHADER_FRAGMENT,
|
||||
SHADER_GEOMETRY,
|
||||
SHADER_TESS_CTRL,
|
||||
SHADER_TESS_EVAL,
|
||||
SHADER_COMPUTE,
|
||||
SHADER_TYPES
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
struct Resource3DSpecification {
|
||||
Gallium::PipeTextureTarget target;
|
||||
u32 format;
|
||||
u32 bind;
|
||||
u32 width;
|
||||
u32 height;
|
||||
u32 depth;
|
||||
u32 array_size;
|
||||
u32 last_level;
|
||||
u32 nr_samples;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue