xref: /qemu/hw/display/apple-gfx.h (revision fc524567087c2537b5103cdfc1d41e4f442892b6)
1 /*
2  * Data structures and functions shared between variants of the macOS
3  * ParavirtualizedGraphics.framework based apple-gfx display adapter.
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  */
7 
8 #ifndef QEMU_APPLE_GFX_H
9 #define QEMU_APPLE_GFX_H
10 
11 #include "qemu/queue.h"
12 #include "system/memory.h"
13 #include "hw/qdev-properties.h"
14 #include "ui/surface.h"
15 
16 #define TYPE_APPLE_GFX_MMIO         "apple-gfx-mmio"
17 #define TYPE_APPLE_GFX_PCI          "apple-gfx-pci"
18 
19 @class PGDeviceDescriptor;
20 @protocol PGDevice;
21 @protocol PGDisplay;
22 @protocol MTLDevice;
23 @protocol MTLTexture;
24 @protocol MTLCommandQueue;
25 
26 typedef QTAILQ_HEAD(, PGTask_s) PGTaskList;
27 
28 typedef struct AppleGFXDisplayMode {
29     uint16_t width_px;
30     uint16_t height_px;
31     uint16_t refresh_rate_hz;
32 } AppleGFXDisplayMode;
33 
34 typedef struct AppleGFXState {
35     /* Initialised on init/realize() */
36     MemoryRegion iomem_gfx;
37     id<PGDevice> pgdev;
38     id<PGDisplay> pgdisp;
39     QemuConsole *con;
40     id<MTLDevice> mtl;
41     id<MTLCommandQueue> mtl_queue;
42     AppleGFXDisplayMode *display_modes;
43     uint32_t num_display_modes;
44 
45     /* List `tasks` is protected by task_mutex */
46     QemuMutex task_mutex;
47     PGTaskList tasks;
48 
49     /* Mutable state (BQL protected) */
50     QEMUCursor *cursor;
51     DisplaySurface *surface;
52     id<MTLTexture> texture;
53     int8_t pending_frames; /* # guest frames in the rendering pipeline */
54     bool gfx_update_requested; /* QEMU display system wants a new frame */
55     bool new_frame_ready; /* Guest has rendered a frame, ready to be used */
56     bool using_managed_texture_storage;
57     uint32_t rendering_frame_width;
58     uint32_t rendering_frame_height;
59 
60     /* Mutable state (atomic) */
61     bool cursor_show;
62 } AppleGFXState;
63 
64 void apple_gfx_common_init(Object *obj, AppleGFXState *s, const char* obj_name);
65 bool apple_gfx_common_realize(AppleGFXState *s, DeviceState *dev,
66                               PGDeviceDescriptor *desc, Error **errp);
67 void *apple_gfx_host_ptr_for_gpa_range(uint64_t guest_physical,
68                                        uint64_t length, bool read_only,
69                                        MemoryRegion **mapping_in_region);
70 
71 extern const PropertyInfo qdev_prop_apple_gfx_display_mode;
72 
73 #endif
74 
75