Ver Fonte

LibGPU+LibVirtGPU: Allow loading the driver and instantiating the device

This adds LibVirtGPU to the list of allowed drivers in LibGPU and adds a
factory method to create the device to libVirtGPU.
Stephan Unverwerth há 2 anos atrás
pai
commit
bd7931ff23

+ 3 - 0
Userland/Libraries/LibGPU/Driver.cpp

@@ -13,16 +13,19 @@
 namespace GPU {
 
 // FIXME: Think of a better way to configure these paths. Maybe use ConfigServer?
+// clang-format off
 static HashMap<DeprecatedString, DeprecatedString> const s_driver_path_map
 {
 #if defined(AK_OS_SERENITY)
     { "softgpu", "libsoftgpu.so.serenity" },
+    { "virtgpu", "libvirtgpu.so.serenity" },
 #elif defined(AK_OS_MACOS)
     { "softgpu", "liblagom-softgpu.dylib" },
 #else
     { "softgpu", "liblagom-softgpu.so.0" },
 #endif
 };
+// clang-format on
 
 static HashMap<DeprecatedString, WeakPtr<Driver>> s_loaded_drivers;
 

+ 15 - 0
Userland/Libraries/LibVirtGPU/Device.cpp

@@ -4,12 +4,18 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <AK/NonnullOwnPtr.h>
 #include <LibVirtGPU/Device.h>
 #include <LibVirtGPU/Image.h>
 #include <LibVirtGPU/Shader.h>
 
 namespace VirtGPU {
 
+ErrorOr<NonnullOwnPtr<Device>> Device::create(Gfx::IntSize)
+{
+    return make<Device>();
+}
+
 GPU::DeviceInfo Device::info() const
 {
     return {
@@ -173,3 +179,12 @@ void Device::bind_fragment_shader(RefPtr<GPU::Shader>)
 }
 
 }
+
+extern "C" GPU::Device* serenity_gpu_create_device(Gfx::IntSize size)
+{
+    auto device_or_error = VirtGPU::Device::create(size);
+    if (device_or_error.is_error())
+        return nullptr;
+
+    return device_or_error.release_value().leak_ptr();
+}

+ 2 - 0
Userland/Libraries/LibVirtGPU/Device.h

@@ -12,6 +12,8 @@ namespace VirtGPU {
 
 class Device final : public GPU::Device {
 public:
+    static ErrorOr<NonnullOwnPtr<Device>> create(Gfx::IntSize min_size);
+
     virtual GPU::DeviceInfo info() const override;
 
     virtual void draw_primitives(GPU::PrimitiveType, FloatMatrix4x4 const& model_view_transform, FloatMatrix4x4 const& projection_transform, Vector<GPU::Vertex>& vertices) override;