[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)
- Re: [PATCH 16/26] hw/display/apple-gfx: Asynchronous MMIO writes on x86-64, (continued)
[PATCH 11/26] hw/display/apple-gfx: Uses ObjC category extension for private property, Phil Dennis-Jordan, 2024/07/17
[PATCH 15/26] hw/display/apple-gfx: Separates generic & vmapple-specific functionality, Phil Dennis-Jordan, 2024/07/17
[PATCH 19/26] ui/cocoa: Adds non-app runloop on main thread mode, Phil Dennis-Jordan, 2024/07/17
[PATCH 12/26] hw/display/apple-gfx: Task memory mapping cleanup, Phil Dennis-Jordan, 2024/07/17
[PATCH 26/26] hw/display/apple-gfx: Removes UI pointer support check, Phil Dennis-Jordan, 2024/07/17
[PATCH 03/26] hw/display/apple-gfx: Moved from hw/vmapple/, Phil Dennis-Jordan, 2024/07/17
[PATCH 18/26] hw/display/apple-gfx: Adds PCI implementation, Phil Dennis-Jordan, 2024/07/17
[PATCH 22/26] hw/display/apple-gfx: Replaces magic number with queried MMIO length, Phil Dennis-Jordan, 2024/07/17
[PATCH 14/26] hw/display/apple-gfx: Refactoring of realize function,
Phil Dennis-Jordan <=