diff mbox series

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

Message ID 20240715210705.32365-15-phil@philjordan.eu (mailing list archive)
State New, archived
Headers show
Series [01/26] hw/vmapple/apple-gfx: Introduce ParavirtualizedGraphics.Framework support | expand

Commit Message

Phil Dennis-Jordan July 15, 2024, 9:06 p.m. UTC
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 mbox series

Patch

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);
     }
 }