1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 04:47:34 +00:00

LibVirtGPU: Replace magic values with command bitfields

This commit is contained in:
Stephan Unverwerth 2022-12-21 16:07:00 +01:00 committed by Andreas Kling
parent 93b5af932e
commit 4b792cb7be
2 changed files with 42 additions and 21 deletions

View file

@ -11,6 +11,7 @@
#include <sys/ioctl_numbers.h>
#include <LibVirtGPU/CommandBufferBuilder.h>
#include <LibVirtGPU/Commands.h>
#include <LibVirtGPU/VirGLProtocol.h>
namespace VirtGPU {
@ -145,7 +146,6 @@ void CommandBufferBuilder::append_clear(float r, float g, float b, float a)
{
CommandBuilder builder(m_buffer, Protocol::VirGLCommand::CLEAR, Protocol::ObjectType::NONE);
Protocol::ClearType clear_flags {};
clear_flags.flags.depth = 1;
clear_flags.flags.color0 = 1;
builder.appendu32(clear_flags.value);
builder.appendf32(r);
@ -181,10 +181,18 @@ void CommandBufferBuilder::append_set_vertex_buffers(u32 stride, u32 offset, Pro
void CommandBufferBuilder::append_create_blend(Protocol::ObjectHandle handle)
{
CommandBuilder builder(m_buffer, Protocol::VirGLCommand::CREATE_OBJECT, Protocol::ObjectType::BLEND);
CreateBlendCommand::S0Flags s0 {};
CreateBlendCommand::S1Flags s1 {};
CreateBlendCommand::S2Flags s2 {};
s0.dither = 1;
s2.colormask = 0xf;
builder.appendu32(handle.value());
builder.appendu32(4); // Enable dither flag, and nothing else
builder.appendu32(0);
builder.appendu32(0x78000000); // Enable all bits of color mask for color buffer 0, and nothing else
builder.appendu32(s0.u32_value);
builder.appendu32(s1.u32_value);
builder.appendu32(s2.u32_value);
for (size_t i = 1; i < 8; ++i) {
builder.appendu32(0); // Explicitly disable all flags for other color buffers
}
@ -196,18 +204,16 @@ void CommandBufferBuilder::append_bind_blend(Protocol::ObjectHandle handle)
builder.appendu32(handle.value()); // VIRGL_OBJ_BIND_HANDLE
}
void CommandBufferBuilder::append_create_vertex_elements(Protocol::ObjectHandle handle)
void CommandBufferBuilder::append_create_vertex_elements(Protocol::ObjectHandle handle, Vector<CreateVertexElementsCommand::ElementBinding> const& bindings)
{
CommandBuilder builder(m_buffer, Protocol::VirGLCommand::CREATE_OBJECT, Protocol::ObjectType::VERTEX_ELEMENTS);
builder.appendu32(handle.value());
builder.appendu32(12); // src_offset_0
builder.appendu32(0); // instance_divisor_0
builder.appendu32(0); // vertex_buffer_index_0
builder.appendu32(30); // src_format_0 (PIPE_FORMAT_R32G32B32_FLOAT = 30)
builder.appendu32(0); // src_offset_1
builder.appendu32(0); // instance_divisor_1
builder.appendu32(0); // vertex_buffer_index_1
builder.appendu32(30); // src_format_1 (PIPE_FORMAT_R32G32B32_FLOAT = 30)
for (auto& binding : bindings) {
builder.appendu32(binding.offset);
builder.appendu32(binding.divisor);
builder.appendu32(binding.vertex_buffer_index);
builder.appendu32(to_underlying(binding.format));
}
}
void CommandBufferBuilder::append_bind_vertex_elements(Protocol::ObjectHandle handle)
@ -294,11 +300,17 @@ void CommandBufferBuilder::append_bind_shader(Protocol::ObjectHandle handle, Gal
void CommandBufferBuilder::append_create_rasterizer(Protocol::ObjectHandle handle)
{
CommandBuilder builder(m_buffer, Protocol::VirGLCommand::CREATE_OBJECT, Protocol::ObjectType::RASTERIZER);
CreateRasterizerCommand::S0Flags s0 {};
CreateRasterizerCommand::S3Flags s3 {};
s0.depth_clip = 1;
builder.appendu32(handle.value()); // Handle
builder.appendu32(0x00000002); // S0 (bitfield of state bits)
builder.appendu32(s0.u32_value); // S0 (bitfield of state bits)
builder.appendf32(1.0); // Point size
builder.appendu32(0); // Sprite coord enable
builder.appendu32(0x00000000); // S3 (bitfield of state bits)
builder.appendu32(s3.u32_value); // S3 (bitfield of state bits)
builder.appendf32(0.1); // Line width
builder.appendf32(0.0); // Offset units
builder.appendf32(0.0); // offset scale
@ -314,11 +326,19 @@ void CommandBufferBuilder::append_bind_rasterizer(Protocol::ObjectHandle handle)
void CommandBufferBuilder::append_create_dsa(Protocol::ObjectHandle handle)
{
CommandBuilder builder(m_buffer, Protocol::VirGLCommand::CREATE_OBJECT, Protocol::ObjectType::DSA);
builder.appendu32(handle.value()); // Handle
builder.appendu32(0x00000007); // S0 (bitset: (v >> 0) & 1 = depth.enabled, (v >> 1) & 1 = depth.writemask, (v >> 2) & 7 = depth.func)
builder.appendu32(0x00000000); // S1 (bitset for 1st stencil buffer)
builder.appendu32(0x00000000); // S2 (bitset for 2nd stencil buffer)
builder.appendf32(1.0); // Alpha Ref
CreateDSACommand::S0Flags s0 {};
CreateDSACommand::S1Flags s1[2] {};
s0.depth_enabled = 1;
s0.depth_writemask = 1;
s0.depth_func = 1;
builder.appendu32(handle.value()); // Handle
builder.appendu32(s0.u32_value); // S0 (bitset for depth buffer)
builder.appendu32(s1[0].u32_value); // S1 (bitset for 1st stencil buffer)
builder.appendu32(s1[1].u32_value); // S2 (bitset for 2nd stencil buffer)
builder.appendf32(1.0); // Alpha Ref
}
void CommandBufferBuilder::append_bind_dsa(Protocol::ObjectHandle handle)

View file

@ -11,6 +11,7 @@
#include <AK/StringView.h>
#include <AK/Vector.h>
#include <LibGfx/Size.h>
#include <LibVirtGPU/Commands.h>
#include <LibVirtGPU/VirGLProtocol.h>
#include <sys/ioctl_numbers.h>
@ -29,7 +30,7 @@ public:
void append_bind_blend(Protocol::ObjectHandle handle);
void append_create_surface(Protocol::ResourceID drawtarget_resource, Protocol::ObjectHandle drawtarget_handle, Protocol::TextureFormat format);
void append_set_framebuffer_state(Protocol::ObjectHandle drawtarget, Protocol::ObjectHandle depthbuffer = 0);
void append_create_vertex_elements(Protocol::ObjectHandle handle);
void append_create_vertex_elements(Protocol::ObjectHandle handle, Vector<CreateVertexElementsCommand::ElementBinding> const&);
void append_bind_vertex_elements(Protocol::ObjectHandle handle);
void append_viewport(Gfx::IntSize);
void append_set_framebuffer_state_no_attach(Gfx::IntSize);