TODO revision 1.1 1 1.1 mrg - Acceleration
2 1.1 mrg - Blits and solid fill
3 1.1 mrg
4 1.1 mrg - XAA and the shadow buffer will not work together, because the
5 1.1 mrg shadow buffer updates in the block handler, so if we got any XAA
6 1.1 mrg calls in between, things would get messed up.
7 1.1 mrg
8 1.1 mrg Current plan:
9 1.1 mrg - Add our own damage tracker that produces raw rectangles
10 1.1 mrg - Whenever it fires, submit the copy immediately
11 1.1 mrg
12 1.1 mrg - Wrap the necessary ops in such a way that the original
13 1.1 mrg implementation gets called first. The original implementation
14 1.1 mrg will use fb, which will produce damage, which will get
15 1.1 mrg submitted.
16 1.1 mrg
17 1.1 mrg If we decide to accelerate a particular operation, first set
18 1.1 mrg a flag that the immediately following damage event should not
19 1.1 mrg result in spice protocol being sent. Ie.,
20 1.1 mrg
21 1.1 mrg on_op:
22 1.1 mrg qxl->enable_copying = FALSE
23 1.1 mrg
24 1.1 mrg call original;
25 1.1 mrg
26 1.1 mrg send acceleration command
27 1.1 mrg
28 1.1 mrg qxl->enable_copying = TRUE
29 1.1 mrg
30 1.1 mrg Note damage is added before the drawing hits the framebuffer, so
31 1.1 mrg it will have to be stored, then cleared
32 1.1 mrg - in a block handler
33 1.1 mrg - before accelerating
34 1.1 mrg
35 1.1 mrg Ie.,
36 1.1 mrg
37 1.1 mrg on_op:
38 1.1 mrg clear damage
39 1.1 mrg disable damage reporting
40 1.1 mrg call original (this will generate unreported damage and
41 1.1 mrg paint to the shadow)
42 1.1 mrg submit command
43 1.1 mrg enable damage
44 1.1 mrg
45 1.1 mrg It may be possible to use the shadow code if we added a
46 1.1 mrg shadowReportNow() that would report any existing
47 1.1 mrg damage. Ie., basically export shadowRedisplay()
48 1.1 mrg
49 1.1 mrg 1. Get damage added, out of CreateScreenResources
50 1.1 mrg 2. Make sure it works
51 1.1 mrg 3. Submit copies and disable shadow
52 1.1 mrg 4. Delete shadow
53 1.1 mrg 5. Wrap some of the ops, or use XAA?
54 1.1 mrg
55 1.1 mrg The input we get is:
56 1.1 mrg
57 1.1 mrg - First a damage notification: "I am going to draw here"
58 1.1 mrg - Then maybe an exa notification
59 1.1 mrg
60 1.1 mrg So the algorithm is.
61 1.1 mrg
62 1.1 mrg Maintain a "to_copy" region to be copied into the device
63 1.1 mrg
64 1.1 mrg - in damage, if there is anything in to_copy, copy it
65 1.1 mrg
66 1.1 mrg - in block handler, if there is anything in to_copy, copy it
67 1.1 mrg
68 1.1 mrg - in exa, if we manage to accelerate, delete to_copy.
69 1.1 mrg
70 1.1 mrg Unfortunately, for core text, what happens is
71 1.1 mrg - damage is produced for the glyph box
72 1.1 mrg - solid fill is generated
73 1.1 mrg - the glyph is drawn
74 1.1 mrg And the algorithm above means the damage is thrown away.
75 1.1 mrg
76 1.1 mrg - Coding style fixes
77 1.1 mrg
78 1.1 mrg - Better malloc() implementation
79 1.1 mrg - Take malloc() from the windows driver?
80 1.1 mrg - Put blocks in a tree?
81 1.1 mrg
82 1.1 mrg - Find out why it picks 8x6 rather than a reasonable mode
83 1.1 mrg - Possibly has to do with the timings it reports. RandR only
84 1.1 mrg allows 8x6 and 6x4.
85 1.1 mrg
86 1.1 mrg - Only compile mmtest if glib is installed
87 1.1 mrg Or maybe just get rid of mmtest.c
88 1.1 mrg
89 1.1 mrg - Notes on offscreen pixmaps
90 1.1 mrg
91 1.1 mrg Yaniv says that PCI resources is a concern and that it would be better
92 1.1 mrg if we can use guest memory instead of video memory. I guess we can
93 1.1 mrg do that, given a kernel driver that can allocate pinned memory.
94 1.1 mrg
95 1.1 mrg - If/when we add hardware acceleration to pixman, pixman will need to
96 1.1 mrg generate QXL protocol. This could be tricky because DRM assumes that
97 1.1 mrg everything is a pixmap, but qxl explicitly has a framebuffer. Same
98 1.1 mrg goes for cairo-drm.
99 1.1 mrg
100 1.1 mrg - Hashing
101 1.1 mrg
102 1.1 mrg QXL has a feature where it can send hash codes for pixmaps. Unfortunately
103 1.1 mrg most of the pixmaps we use are very shortlived. But there may be a benefit
104 1.1 mrg for the root pixmap (and in general for the (few) windows that have
105 1.1 mrg a pixmap background).
106 1.1 mrg
107 1.1 mrg - When copying from pixmap to framebuffer, right now we just copy
108 1.1 mrg the bits from the fb allocated pixmap.
109 1.1 mrg
110 1.1 mrg - With hashing, we need to copy it to video memory, hash it, then set the
111 1.1 mrg "unique" field to that hash value (plus the QXL_CACHE
112 1.1 mrg flag). Presumably we'll get a normal remove on it when it is no
113 1.1 mrg longer in use.
114 1.1 mrg
115 1.1 mrg - If we know an image is available in video memory already, we should just
116 1.1 mrg submit it. There is no race condition here because the image is
117 1.1 mrg ultimately removed from vmem by the driver.
118 1.1 mrg
119 1.1 mrg (Note hash value could probably just be XID plus a serial number).
120 1.1 mrg
121 1.1 mrg - So for the proof of concept we'll be hashing complete pixmaps every time
122 1.1 mrg we submit them.
123 1.1 mrg
124 1.1 mrg - Tiles
125 1.1 mrg
126 1.1 mrg It may be beneficial to send pixmaps in smaller tiles, though Yaniv
127 1.1 mrg says we will need atomic drawing to prevent tearing.
128 1.1 mrg
129 1.1 mrg - Video
130 1.1 mrg
131 1.1 mrg We should certainly support Xv. The scaled blits should be sent
132 1.1 mrg as commands, rather than as software. Does spice support YUV images?
133 1.1 mrg If not, then it probably should.
134 1.1 mrg
135 1.1 mrg - Multi-monitor:
136 1.1 mrg
137 1.1 mrg - Windows may not support more than dual-head, but we do support more than
138 1.1 mrg dual-head in spice. This is why they do the multi-pci device.
139 1.1 mrg
140 1.1 mrg Ie,. the claim is that Yaniv did not find any API that would
141 1.1 mrg support more than two outputs per PCI device. (This seems dubious
142 1.1 mrg given that four-head cards do exist).
143 1.1 mrg
144 1.1 mrg - Linux multi-monitor configuration supports hotplug of monitors,
145 1.1 mrg and you can't make up PCI devices from inside the driver.
146 1.1 mrg
147 1.1 mrg - On windows the guest agent is responsible for setting the monitors
148 1.1 mrg and resolutions.
149 1.1 mrg
150 1.1 mrg - On linux we should support EDID information, and enabling and
151 1.1 mrg disabling PCI devices on the fly is pretty difficult to deal with
152 1.1 mrg in X. Ie., we would need working support for both GPU hotplug and
153 1.1 mrg for shatter. This is just not happening in RHEL 5 or 6.
154 1.1 mrg
155 1.1 mrg - Reading back EDID over the spice protocol would be necessary
156 1.1 mrg because when you hit detect displays, that's what needs to happen.
157 1.1 mrg
158 1.1 mrg Better acceleration:
159 1.1 mrg
160 1.1 mrg - Given offscreen pixmaps, we should get rid of the shadow framebuffer.
161 1.1 mrg If we have to fall back to software, we can use the drawing area to
162 1.1 mrg get the area in question, then copy them to qxl_malloced memory,
163 1.1 mrg then draw there, then finally send the bits.
164 1.1 mrg
165 1.1 mrg -=-=-=-=-
166 1.1 mrg
167 1.1 mrg Done:
168 1.1 mrg
169 1.1 mrg Question:
170 1.1 mrg
171 1.1 mrg - Submit cursor images
172 1.1 mrg
173 1.1 mrg - Note: when we set a mode, all allocated memory should be considered
174 1.1 mrg released.
175 1.1 mrg
176 1.1 mrg - What is the "vram" PCI range used for?
177 1.1 mrg
178 1.1 mrg As I read the Windows driver, it can be mapped with the ioctl
179 1.1 mrg VIDEO_MAP_VIDEO_MEMORY. In driver.c it is mapped as pdev->fb, but
180 1.1 mrg it is then never used for anything as far as I can tell.
181 1.1 mrg
182 1.1 mrg Does Windows itself use that ioctl, and if so, for what. The area
183 1.1 mrg is only 32K in size so it can't really be used for any realistic
184 1.1 mrg bitmaps.
185 1.1 mrg
186 1.1 mrg It's a required ioctl. I believe it's needed for DGA-like things.
187 1.1 mrg I have no idea how the Windows driver manages syncing for that,
188 1.1 mrg but I think we can safely ignore it. [ajax]
189 1.1 mrg
190 1.1 mrg - Hook up randr if it isn't already
191 1.1 mrg
192 1.1 mrg - Garbage collection
193 1.1 mrg - Before every allocation?
194 1.1 mrg - When we run out of memory?
195 1.1 mrg - Whenever we overflow some fixed pool?
196 1.1 mrg
197 1.1 mrg - Get rid of qxl_mem.h header; just use qxl.h
198 1.1 mrg
199 1.1 mrg - Split out ring code into qxl_ring.c
200 1.1 mrg
201 1.1 mrg - Don't keep the maps around that are just used in preinit
202 1.1 mrg (Is there any real reason to not just do the CheckDevice in
203 1.1 mrg ScreenInit?)
204 1.1 mrg
205 1.1 mrg
206