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