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