[Spice-devel] [PATCH 12/14] Use a single class for every escape command
Christophe Fergeau
cfergeau at redhat.com
Thu Sep 1 14:37:12 UTC 2016
On Thu, Sep 01, 2016 at 01:00:54PM +0100, Frediano Ziglio wrote:
> Do not use two classes one for XPDM and the other for WDDM.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> vdagent/display_configuration.cpp | 76 +++++++++++++++++----------------------
> vdagent/display_configuration.h | 17 +++++++++
> 2 files changed, 49 insertions(+), 44 deletions(-)
>
> diff --git a/vdagent/display_configuration.cpp b/vdagent/display_configuration.cpp
> index 301e136..2387073 100644
> --- a/vdagent/display_configuration.cpp
> +++ b/vdagent/display_configuration.cpp
> @@ -204,48 +204,40 @@ struct D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME {
> UINT VidPnSourceId;
> };
>
> -struct QXLMonitorEscape {
> - QXLMonitorEscape(DEVMODE* dev_mode)
> - {
> - ZeroMemory(&_head, sizeof(_head));
> - _head.x = dev_mode->dmPosition.x;
> - _head.y = dev_mode->dmPosition.y;
> - _head.width = dev_mode->dmPelsWidth;
> - _head.height = dev_mode->dmPelsHeight;
> - }
> - QXLHead _head;
> -};
> +template <typename Content>
> +static inline int ExtEscape(HDC hdc, EscapeData<Content>& data)
> +{
> + return ExtEscape(hdc, data._ioctl, sizeof(data._data), (LPCSTR) &data._data, 0, NULL);
> +}
>
> -struct QxlCustomEscapeObj : public QXLEscapeSetCustomDisplay {
> - QxlCustomEscapeObj(uint32_t bitsPerPel, uint32_t width, uint32_t height)
> +struct QxlMonitorEscape: public EscapeData<QXLHead> {
> + QxlMonitorEscape(const DEVMODE& dev_mode):
> + EscapeData<QXLHead>(QXL_ESCAPE_MONITOR_CONFIG)
> {
> - xres = width;
> - yres = height;
> - bpp = bitsPerPel;
> + _data.x = dev_mode.dmPosition.x;
> + _data.y = dev_mode.dmPosition.y;
> + _data.width = dev_mode.dmPelsWidth;
> + _data.height = dev_mode.dmPelsHeight;
> }
> -};
> -
> -struct WDDMCustomDisplayEscape {
> - WDDMCustomDisplayEscape(DEVMODE* dev_mode)
> + QxlMonitorEscape(const DisplayMode& mode):
> + EscapeData<QXLHead>(QXL_ESCAPE_MONITOR_CONFIG)
> {
> - _ioctl = QXL_ESCAPE_SET_CUSTOM_DISPLAY;
> - _custom.bpp = dev_mode->dmBitsPerPel;
> - _custom.xres = dev_mode->dmPelsWidth;
> - _custom.yres = dev_mode->dmPelsHeight;
> + _data.x = mode.get_pos_x();
> + _data.y = mode.get_pos_y();
> + _data.width = mode.get_width();
> + _data.height = mode.get_height();
> }
> uint32_t _ioctl;
> QXLEscapeSetCustomDisplay _custom;
> };
>
> -struct WDDMMonitorConfigEscape {
> - WDDMMonitorConfigEscape(DisplayMode* mode)
> +struct QxlCustomEscape : public EscapeData<QXLEscapeSetCustomDisplay> {
> + QxlCustomEscape(const DEVMODE& dev_mode):
> + EscapeData<QXLEscapeSetCustomDisplay>(QXL_ESCAPE_SET_CUSTOM_DISPLAY)
> {
> - _ioctl = QXL_ESCAPE_MONITOR_CONFIG;
> - _head.id = _head.surface_id = 0;
> - _head.x = mode->get_pos_x();
> - _head.y = mode->get_pos_y();
> - _head.width = mode->get_width();
> - _head.height = mode->get_height();
> + _data.xres = dev_mode.dmPelsWidth;
> + _data.yres = dev_mode.dmPelsHeight;
> + _data.bpp = dev_mode.dmBitsPerPel;
> }
> uint32_t _ioctl;
> QXLHead _head;
> @@ -331,11 +323,8 @@ bool XPDMInterface::custom_display_escape(LPCTSTR device_name, DEVMODE* dev_mode
> }
> }
>
> - QxlCustomEscapeObj custom_escape(dev_mode->dmBitsPerPel,
> - dev_mode->dmPelsWidth, dev_mode->dmPelsHeight);
> -
> - int err = ExtEscape(hdc, QXL_ESCAPE_SET_CUSTOM_DISPLAY,
> - sizeof(QXLEscapeSetCustomDisplay), (LPCSTR) &custom_escape, 0, NULL);
> + QxlCustomEscape custom_escape(*dev_mode);
> + int err = ExtEscape(hdc, custom_escape);
> if (err <= 0) {
> vd_printf("%s: Can't set custom display, perhaps running with an older driver?",
> __FUNCTION__);
> @@ -356,7 +345,7 @@ bool XPDMInterface::update_monitor_config(LPCTSTR device_name, DisplayMode* mode
> return false;
> }
>
> - QXLMonitorEscape monitor_config(dev_mode);
> + QxlMonitorEscape monitor_config(*dev_mode);
> HDC hdc(CreateDC(device_name, NULL, NULL, NULL));
> int err(0);
>
> @@ -364,8 +353,7 @@ bool XPDMInterface::update_monitor_config(LPCTSTR device_name, DisplayMode* mode
> return false;
> }
>
> - err = ExtEscape(hdc, QXL_ESCAPE_MONITOR_CONFIG, sizeof(QXLHead),
> - (LPCSTR) &monitor_config, 0, NULL);
> + err = ExtEscape(hdc, monitor_config);
> if (err < 0) {
> vd_printf("%s: %S can't update monitor config, may have old, old driver",
> __FUNCTION__, device_name);
Looks similar to what you fixed in patch 4.
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160901/99d1d57c/attachment.sig>
More information about the Spice-devel
mailing list