qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 14/26] hw/display/apple-gfx: Refactoring of realize function


From: Phil Dennis-Jordan
Subject: [PATCH 14/26] hw/display/apple-gfx: Refactoring of realize function
Date: Mon, 15 Jul 2024 23:06:53 +0200

The apple_gfx_realize function was very long, with different
sections of the code doing mostly unrelated things.

This change groups some of the functionality into helper
functions, which hopefully makes the code easier to understand.

There are also some code formatting fixes in the general
vicinity of the refactored code.

Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu>
---
 hw/display/apple-gfx.m | 120 ++++++++++++++++++++++++++---------------
 1 file changed, 76 insertions(+), 44 deletions(-)

diff --git a/hw/display/apple-gfx.m b/hw/display/apple-gfx.m
index 39e33ed999..f9046f41a0 100644
--- a/hw/display/apple-gfx.m
+++ b/hw/display/apple-gfx.m
@@ -360,26 +360,9 @@ static void apple_gfx_init(Object *obj)
     }
 }
 
-static void apple_gfx_realize(DeviceState *dev, Error **errp)
+static void apple_gfx_register_task_mapping_handlers(AppleGFXState *s,
+                                                     PGDeviceDescriptor *desc)
 {
-    @autoreleasepool {
-    AppleGFXState *s = APPLE_GFX(dev);
-    PGDeviceDescriptor *desc = [PGDeviceDescriptor new];
-    PGDisplayDescriptor *disp_desc = [PGDisplayDescriptor new];
-    PGIOSurfaceHostDeviceDescriptor *iosfc_desc = 
[PGIOSurfaceHostDeviceDescriptor new];
-    PGDisplayMode *modes[ARRAY_SIZE(apple_gfx_modes)];
-    int i;
-
-    for (i = 0; i < ARRAY_SIZE(apple_gfx_modes); i++) {
-        modes[i] =
-            [[PGDisplayMode alloc] initWithSizeInPixels:apple_gfx_modes[i] 
refreshRateInHz:60.];
-    }
-
-    s->mtl = MTLCreateSystemDefaultDevice();
-
-    desc.device = s->mtl;
-    desc.usingIOSurfaceMapper = true;
-
     desc.createTask = ^(uint64_t vmSize, void * _Nullable * _Nonnull 
baseAddress) {
         AppleGFXTask *task = apple_gfx_new_task(s, vmSize);
         *baseAddress = (void*)task->address;
@@ -450,29 +433,18 @@ static void apple_gfx_realize(DeviceState *dev, Error 
**errp)
         return (bool)true;
     };
 
-    desc.readMemory = ^(uint64_t physicalAddress, uint64_t length, void * 
_Nonnull dst) {
+    desc.readMemory = ^(uint64_t physicalAddress, uint64_t length,
+                        void * _Nonnull dst) {
         trace_apple_gfx_read_memory(physicalAddress, length, dst);
         cpu_physical_memory_read(physicalAddress, dst, length);
         return (bool)true;
     };
 
-    desc.raiseInterrupt = ^(uint32_t vector) {
-        bool locked;
-
-        trace_apple_gfx_raise_irq(vector);
-        locked = bql_locked();
-        if (!locked) {
-            bql_lock();
-        }
-        qemu_irq_pulse(s->irq_gfx);
-        if (!locked) {
-            bql_unlock();
-        }
-    };
+}
 
-    s->pgdev = PGNewDeviceWithDescriptor(desc);
-    [desc release];
-    desc = nil;
+static PGDisplayDescriptor *apple_gfx_prepare_display_handlers(AppleGFXState 
*s)
+{
+    PGDisplayDescriptor *disp_desc = [PGDisplayDescriptor new];
 
     disp_desc.name = @"QEMU display";
     disp_desc.sizeInMillimeters = NSMakeSize(400., 300.); /* A 20" display */
@@ -484,7 +456,8 @@ static void apple_gfx_realize(DeviceState *dev, Error 
**errp)
         s->handles_frames = true;
         s->new_frame = true;
     };
-    disp_desc.modeChangeHandler = ^(PGDisplayCoord_t sizeInPixels, OSType 
pixelFormat) {
+    disp_desc.modeChangeHandler = ^(PGDisplayCoord_t sizeInPixels,
+                                    OSType pixelFormat) {
         trace_apple_gfx_mode_change(sizeInPixels.x, sizeInPixels.y);
         set_mode(s, sizeInPixels.x, sizeInPixels.y);
     };
@@ -517,15 +490,35 @@ static void apple_gfx_realize(DeviceState *dev, Error 
**errp)
         update_cursor(s);
     };
 
-    s->pgdisp = [s->pgdev newDisplayWithDescriptor:disp_desc port:0 
serialNum:1234];
-    [disp_desc release];
-    s->pgdisp.modeList = [NSArray arrayWithObjects:modes 
count:ARRAY_SIZE(apple_gfx_modes)];
+    return disp_desc;
+}
+
+static NSArray<PGDisplayMode*>* apple_gfx_prepare_display_mode_array(void)
+{
+    PGDisplayMode *modes[ARRAY_SIZE(apple_gfx_modes)];
+    NSArray<PGDisplayMode*>* mode_array = nil;
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(apple_gfx_modes); i++) {
+        modes[i] =
+            [[PGDisplayMode alloc] initWithSizeInPixels:apple_gfx_modes[i] 
refreshRateInHz:60.];
+    }
+
+    mode_array = [NSArray arrayWithObjects:modes 
count:ARRAY_SIZE(apple_gfx_modes)];
 
     for (i = 0; i < ARRAY_SIZE(apple_gfx_modes); i++) {
         [modes[i] release];
         modes[i] = nil;
     }
 
+    return mode_array;
+}
+
+static PGIOSurfaceHostDevice 
*apple_gfx_prepare_iosurface_host_device(AppleGFXState *s)
+{
+    PGIOSurfaceHostDeviceDescriptor *iosfc_desc = 
[PGIOSurfaceHostDeviceDescriptor new];
+    PGIOSurfaceHostDevice *iosfc_host_dev = nil;
+
     iosfc_desc.mapMemory = ^(uint64_t phys, uint64_t len, bool ro, void **va, 
void *e, void *f) {
         trace_apple_iosfc_map_memory(phys, len, ro, va, e, f);
         MemoryRegion *tmp_mr;
@@ -551,13 +544,52 @@ static void apple_gfx_realize(DeviceState *dev, Error 
**errp)
         return (bool)true;
     };
 
-    s->pgiosfc =
-        [[PGIOSurfaceHostDevice alloc] initWithDescriptor:iosfc_desc];
+    iosfc_host_dev = [[PGIOSurfaceHostDevice alloc] 
initWithDescriptor:iosfc_desc];
     [iosfc_desc release];
+    return iosfc_host_dev;
+}
+
+static void apple_gfx_realize(DeviceState *dev, Error **errp)
+{
+    @autoreleasepool {
+        AppleGFXState *s = APPLE_GFX(dev);
+        PGDeviceDescriptor *desc = [PGDeviceDescriptor new];
+        PGDisplayDescriptor *disp_desc = nil;
+
+        QTAILQ_INIT(&s->tasks);
+        s->mtl = MTLCreateSystemDefaultDevice();
+
+        desc.device = s->mtl;
+        desc.usingIOSurfaceMapper = true;
+
+        apple_gfx_register_task_mapping_handlers(s, desc);
+
+        desc.raiseInterrupt = ^(uint32_t vector) {
+            bool locked;
+
+            trace_apple_gfx_raise_irq(vector);
+            locked = bql_locked();
+            if (!locked) {
+                bql_lock();
+            }
+            qemu_irq_pulse(s->irq_gfx);
+            if (!locked) {
+                bql_unlock();
+            }
+        };
+
+        s->pgdev = PGNewDeviceWithDescriptor(desc);
+        [desc release];
+        desc = nil;
+
+        disp_desc = apple_gfx_prepare_display_handlers(s);
+        s->pgdisp = [s->pgdev newDisplayWithDescriptor:disp_desc port:0 
serialNum:1234];
+        [disp_desc release];
+        s->pgdisp.modeList = apple_gfx_prepare_display_mode_array();
 
-    QTAILQ_INIT(&s->tasks);
+        s->pgiosfc = apple_gfx_prepare_iosurface_host_device(s);
 
-    create_fb(s);
+        create_fb(s);
     }
 }
 
-- 
2.39.3 (Apple Git-146)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]