On Wed, Mar 17, 2010 at 11:51:17AM +0100, Henrik Rydberg wrote: > >> 2. Bandwidth reduction should be made as early as possible > >> > >> The MT events from the kernel are non-filtered, bypassing the normal input > >> filtering by necessity. Duplicating this behavior further into the food > >> chain > >> would be a mistake. After parsing the MT stream in the contact driver, the > >> event > >> stream can be filtered substantially, thereby restoring bandwidth usage to > >> something more similar to non-mt devices. > > > > I don't understand what you mean by filtering here. Can you detail this? > > The kernel input layer has a filtering mechanism that removes an arbitrary > large > portion of the driver event stream. Each ABS event is registered together with > an estimate of the signal-to-noise ratio of that particular event. The driver > can then send data as often as it likes to the input core, events will only be > emitted when the change is "big enough". As an example, sitting at a computer, > resting a finger at the trackpad. You consider your hand to be resting, but in > fact the detected finger position changes slightly all the time, in effect > creating a continous stream of events from the driver. > > The ABS_MT events, on the other hand, bypass the filtering mechanism, for two > reasons. Firstly, the input filtering requires absolute identity of the ABS > event, which is not the case in the sequential MT stream. Secondly, the > signal-to-noise ratio of a combined finger movement is different from each > finger separately. It is first when considered as a whole a reasonable > filtering > can be performed. > > And we *do* want filtering. The difference in number of events could easily be > an order of magnitude.
no argument there, I fully agree. > >> 3. The contact driver produces the more digested contact events > >> > >> The contact driver takes the flora of driver MT events and produces a > >> consistent > >> stream of contact events. The contact event stream is less > >> bandwidth-consuming, > >> and follows the init-move-destroy concept we discussed last summer, if you > >> recall. We are still talking about a low-level stream, there are no > >> gesture or > >> other high-level derivatives. Just a consistent stream of data. > > > > Same as above. You've worked more with the kernel's multitouch interface > > than I did. can you give us an example of what the data from the kernel > > would look like and how it would be "digested"? > > Pick a random kernel driver which supports some finger touches, but not yet MT > events. Now we want to make this driver work with multitouch gestures. We have > available in the driver some finger positions not yet reported as events, but > nothing more. The MT protocol allows us to go ahead and simply add > ABS_MT_POSITION_X and ABS_MT_POSITION_Y for the individual fingers, insert a > few > input_mt_sync()'s, and we are done with the kernel changes. > > Enters the Contact Driver. It will now see ABS_MT_POSITION events appearing in > the stream, so it knows the driver is MT-enabled. However, there is no > tracking > id, so the driver computes how to distribute the changes onto individual, > identifiable fingers. Perhaps the resulting motion is below some > signal-to-noise > threshold, so it holds on to the change a while longer. Some time later an > additional change makes it worthwhile to emit an event, so it pushes the > changes > onto the appropriate valuators. > ACK > [...] > >> The Contact Driver > >> ------------------ > >> > >> The general structure of the MT events is that of contacts appearing, > >> changing > >> and disappearing. Because of the diversity of capabilities of the drivers, > >> this > >> structure is quite relaxed in the kernel stream, to the point that it > >> requires > >> work to fully impose this structure further down the stream. That is the > >> job of > >> the Contact Driver. It translates the relaxed kernel MT events into a > >> steady > >> stream of contact events, containing the same level of information for all > >> drivers. The contact events follow the same logic as the MT events, but > >> because > >> all data is present, the init-move-destroy mechanism can be employed > >> fully. Here > >> is an example of what a two-finger scroll would look like: > >> > >> init id = 588, x = -234, y = 42 > >> init id = 123, x = 933, y = 3 > >> sync > >> move id = 588, x = -211, y = 529 > >> move id = 123, x = 863, y = 732 > >> sync > >> destroy id = 588 > >> destroy id = 123 > >> sync > > > > This is exactly what I had in mind to handle MT in the evdev driver. The > > driver handles this, then forwards it on to the client. The only difference > > I see so far is that the init/destroy is implicit by the presence of the > > valuators. Is this different to what you are proposing? If so, can you > > provide more detail? > > No difference. I believe we have converged. I agree, most of the disagreements seemed to have ben in wording. I think we can go forward with this to see if it holds up when we actually have a working prototype. Cheers, Peter, goes looking for some time. _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel