[Spice-devel] [RFC PATCH spice-common v2 02/20] A version 2 of the MousePosition message
Marc-André Lureau
marcandre.lureau at gmail.com
Thu Aug 23 10:04:35 UTC 2018
Hi
On Thu, Aug 23, 2018 at 11:53 AM Frediano Ziglio <fziglio at redhat.com> wrote:
>
> >
> > Hi
> > On Thu, Aug 23, 2018 at 9:51 AM Frediano Ziglio <fziglio at redhat.com> wrote:
> > >
> > > >
> > > > Hi
> > > >
> > > > On Wed, Aug 22, 2018 at 11:11 PM Jonathon Jongsma <jjongsma at redhat.com>
> > > > wrote:
> > > > >
> > > > > On Thu, 2018-08-16 at 18:26 +0200, Lukáš Hrázký wrote:
> > > > > > The version 2 is using a (channel_id, monitor_id) pair to uniquely
> > > > > > identify the display on which the event occured, instead of the
> > > > > > ambiguous display_id.
> > > > > >
> > > > > > Signed-off-by: Lukáš Hrázký <lhrazky at redhat.com>
> > > > > > ---
> > > > > > common/messages.h | 8 ++++++++
> > > > > > spice.proto | 8 ++++++++
> > > > > > 2 files changed, 16 insertions(+)
> > > > > >
> > > > > > diff --git a/common/messages.h b/common/messages.h
> > > > > > index 942ba07..9b05cee 100644
> > > > > > --- a/common/messages.h
> > > > > > +++ b/common/messages.h
> > > > > > @@ -460,6 +460,14 @@ typedef struct SpiceMsgcMousePosition {
> > > > > > uint8_t display_id;
> > > > > > } SpiceMsgcMousePosition;
> > > > > >
> > > > > > +typedef struct SpiceMsgcMousePositionV2 {
> > > > > > + uint32_t x;
> > > > > > + uint32_t y;
> > > > > > + uint32_t buttons_state;
> > > > > > + uint32_t channel_id;
> > > > > > + uint32_t monitor_id;
> > > > > > +} SpiceMsgcMousePositionV2;
> > > > > > +
> > > > > > typedef struct SpiceMsgcMousePress {
> > > > > > int32_t button;
> > > > > > int32_t buttons_state;
> > > > > > diff --git a/spice.proto b/spice.proto
> > > > > > index 80976d4..14475fc 100644
> > > > > > --- a/spice.proto
> > > > > > +++ b/spice.proto
> > > > > > @@ -1092,6 +1092,14 @@ channel InputsChannel : BaseChannel {
> > > > > > uint8 display_id;
> > > > > > } @ctype(SpiceMsgcMousePosition) mouse_position;
> > > > > >
> > > > > > + message {
> > > > > > + uint32 x;
> > > > > > + uint32 y;
> > > > > > + mouse_button_mask buttons_state;
> > > > > > + uint32 channel_id;
> > > > > > + uint32 monitor_id;
> > >
> > > uint8 for both channel_id and monitor_id.
> > >
> > > > > > + } @ctype(SpiceMsgcMousePositionV2) mouse_position_v2;
> > > > > > +
> > > > > > message {
> > > > > > mouse_button button;
> > > > > > mouse_button_mask buttons_state;
> > > > >
> > > > >
> > > > > This protocol change is clearly necessary if we're going to support any
> > > > > configurations other than those that we've supported in the past.
> > > >
> > > > It's not clear to me that it's necessary if we still have the same
> > > > constrains, that allow us to use the "displayid = channeld_id ||
> > > > monitor_id" formula.
> > >
> > > The formula is not "channel_id || monitor_id", this is just confusing, is
> > > more "channel_id + monitor_id" or using GCC extension "channel_id ?:
> > > monitor_id".
> >
> > "channel_id + monitor_id" is wrong: we don't support the combination
> > with channel_id != 0.
> >
>
> The formula is correct, not wrong, channel_id != 0 is a limitation of the
> values that does not make the formula wrong. The || is C is a boolean operator
> that would allow to support only two monitors in total. I agree that the +
> formula is not enough to describe everything but from the mathematical/C point
> of view is more correct than the || version. I would say that the COALESCE
> function of some SQL dialect express better what the formula is trying to
> do and why.
>
> > > Note that this formula is present in spice-gtk, virt-viewer (as Lukash
> > > mentioned),
> > > and in SPICE protocol as index in agent MonitorsConfig (structure that is
> > > used also by the server) and agent MouseState (as display_id field).
> > > One of the main reason of these patches is that before (as use cases were
> > > limited)
> > > the agent understand what the display_id was, now this is no more true.
> >
> > This is not a good argument. We can reason and agree about the
> > protocol, and fix the agent/guest implementation.
> >
>
> "This is not a good argument" why? That sentence without any reason does
That "the agent understand what the display_id was, now this is no
more true" is not an argument to change the protocol.
The protocol supports one display channel with multiple monitor:
display_id is unambigous. Or multiple display channels: the protocol
is also unambigous. The agent implementation issues do not need
protocol changes.
> not make sense to me. In previous e-mail you said we support multiple
> devices and I explained why this is not true on Linux. You also said that
> that formula is not part of the protocol and I explained why this is not
> true and why the formula is part of the protocol. These are good argument
> for me. Why are not good for you?
>
> Agree on second sentence, I don't know if "fix" is used correctly here, fix
> usually mean that something is broken, but here we are trying to make some
> new use cases work in a sensible way, they are fix basically for new use
> cases, not strongly regressions (this maybe are not good argument).
>
> > >
> > > Note also that under Linux currently all these protocol limitations allows
> > > to support only a single device with multiple output, which is a problem
> > > for
> >
> > On linux, a single device with multiple monitors (which is
> > recommended), or multiple devices (the QXL & Windows way).
> >
>
> Sorry, what are you trying to say here? Are you adding something? Trying
> to sum up what I'm saying? Suggesting an implementation?
>
> > > vGPU. Under Windows we support multiple devices but all devices are limited
> > > to one monitor. Extending Linux using the same limitation requires
> > > currently
> > > that all monitor output would be mapped to a single DisplayChannel surface
> > > (as currently only surface 0 can be primary) with all monitor sub-area of
> > > the single surface. The complexity of this just for the above formula is
> > > not
> > > worth. Extending the Windows idea (also in Linux) would require to have
> > > single
> > > monitor for each DisplayChannel (so QXL devices has to be limited to one
> > > output)
> > > so potentially we need to map a single device (like vGPU) to multiple
> > > DisplayChannels (each with one monitor). This I think would be the only
> > > option
> > > to carry on the above formula (which I state again is part of the
> > > protocol).
> > > Potentially is possible to allocate in advance enough DisplayChannels (on
> > > the
> > > server) to make possible to bind/unbind the outputs dynamically. This last
> > > however won't solve the agent not knowing what a given display_id is and
> > > would require some protocol updates (but not between client and server).
> > > I think Jonathon, whom is mainly working on multi monitor support, was
> > > thinking on not using these mappings but instead using a single
> > > DisplayChannel
> > > for a single vGPU device even with multiple outputs.
> > > Personally I would remove the restriction (mainly implementation, not
> > > protocol) of having the primary surface only with surface_id == 0, this
> > > was discussed also with Gerd when atomic settings were implemented in Linux
> > > driver.
> >
> > That doesn't change the argument about MonitorConfig display_id vs
> > channel_id & monitor_id.
> >
>
> Yes, it does. Can you explain why it doesn't change the argument?
> If we need to support multiple monitor for every DisplayChannel the
> protocol is currently not able to do it.
>
Then I agree, read my first reply. (but I still don't understand how
is the client going to chose a configuration - if it's done by the
guest/server, then the mapping between display_id and
channel_id/monitor_id can be done there without changing the
protocol).
> > The only reason I have so far is that the agent is not able to map a
> > display_id to the correct channel/monitor. Yet, I don't understand why
> > and why the protocol would need to change.
> >
>
> The above formula is not injective so is not invertible. So display_id 1
> can be channel_id == 0 and monitor_id == 1 or channel_id == 1 and monitor_id == 0,
> the agent cannot know. This is one problem.
> The other problem is, correctly, the mapping (assuming the above formula is now
> injective), the new use cases make the mapping display_id -> output not reliable,
> the agent needs some additional information to make more reliable and this
> requires to extend some part of the protocol in order to get these information.
> Maybe we should specify which part of the protocol we are talking about here, by
> simply "protocol" I assume any part so SPICE (client <-> server), agent or QXL.
>
> Frediano
--
Marc-André Lureau
More information about the Spice-devel
mailing list