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