[Spice-devel] [PATCH qxl-win] add registry key "DisableSurfaces"
Arnon Gilboa
agilboa at redhat.com
Tue Oct 2 09:05:51 PDT 2012
ack
Alon Levy wrote:
> Presence of the key disables off screen surfaces creation; The callback
> is still registered, but it always fails.
>
> Registry key is checked on device initialization only, not during
> runtime, so you must reset the vm to see any affects.
> ---
> display/driver.c | 8 ++++++++
> display/driver.rc | 4 ++--
> display/qxldd.h | 1 +
> include/qxl_driver.h | 2 ++
> miniport/qxl.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
> miniport/qxl.inf | 2 +-
> miniport/qxl.rc | 6 +++---
> 7 files changed, 63 insertions(+), 7 deletions(-)
>
> diff --git a/display/driver.c b/display/driver.c
> index ef011ad..90c52c5 100644
> --- a/display/driver.c
> +++ b/display/driver.c
> @@ -843,6 +843,10 @@ static BOOL PrepareHardware(PDev *pdev)
>
> pdev->dev_id = dev_info.dev_id;
>
> + pdev->create_non_primary_surfaces = dev_info.create_non_primary_surfaces;
> + DEBUG_PRINT((pdev, 1, "%s: create_non_primary_surfaces = %d\n", __FUNCTION__,
> + pdev->create_non_primary_surfaces));
> +
> CreateVRamSlot(pdev);
>
> DEBUG_PRINT((NULL, 1, "%s: 0x%lx exit: 0x%lx %ul\n", __FUNCTION__, pdev,
> @@ -1409,6 +1413,10 @@ HBITMAP APIENTRY DrvCreateDeviceBitmap(DHPDEV dhpdev, SIZEL size, ULONG format)
>
> pdev = (PDev *)dhpdev;
>
> + if (!pdev->create_non_primary_surfaces) {
> + return FALSE;
> + }
> +
> if (!pdev->vram_slot_initialized || pdev->bitmap_format != format || pdev->fb == 0) {
> DEBUG_PRINT((pdev, 3, "%s failed: %p: slot_initialized %d, format(%d,%d), fb %p\n",
> __FUNCTION__, pdev, pdev->vram_slot_initialized,
> diff --git a/display/driver.rc b/display/driver.rc
> index 4368925..f11c9db 100644
> --- a/display/driver.rc
> +++ b/display/driver.rc
> @@ -16,12 +16,12 @@
> #define VER_FILEDESCRIPTION_STR "Red Hat QXL Display Driver"
> #define VER_INTERNALNAME_STR "qxldd.dll"
> #define VER_ORIGINALFILENAME_STR VER_INTERNALNAME_STR
> -#define VER_FILEVERSION_STR "1.4.1.1"
> +#define VER_FILEVERSION_STR "1.4.2.3"
> #define VER_PRODUCTNAME_STR "Spice"
> #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR
>
> #undef VER_PRODUCTVERSION
> -#define VER_PRODUCTVERSION 1,4,1,1
> +#define VER_PRODUCTVERSION 1,4,2,3
>
> #define VER_COMPANYNAME_STR "Red Hat Inc."
> #define VER_LEGALCOPYRIGHT_STR "� Red Hat Inc. All rights reserved."
> diff --git a/display/qxldd.h b/display/qxldd.h
> index d0166b5..1a1b5d5 100644
> --- a/display/qxldd.h
> +++ b/display/qxldd.h
> @@ -220,6 +220,7 @@ typedef struct PDev {
> SIZEL resolution;
> UINT32 max_bitmap_size;
> ULONG bitmap_format;
> + UINT8 create_non_primary_surfaces;
>
> ULONG fb_size;
> BYTE* fb;
> diff --git a/include/qxl_driver.h b/include/qxl_driver.h
> index eac6f5f..677ee17 100644
> --- a/include/qxl_driver.h
> +++ b/include/qxl_driver.h
> @@ -119,6 +119,8 @@ typedef struct QXLDriverInfo {
> UINT32 n_surfaces;
>
> UINT64 fb_phys;
> +
> + UINT8 create_non_primary_surfaces;
> } QXLDriverInfo;
>
> #endif
> diff --git a/miniport/qxl.c b/miniport/qxl.c
> index 003669b..bd449c3 100644
> --- a/miniport/qxl.c
> +++ b/miniport/qxl.c
> @@ -95,6 +95,8 @@ typedef struct QXLExtension {
>
> char *log_buf;
> PUCHAR log_port;
> +
> + UINT8 create_non_primary_surfaces;
> } QXLExtension;
>
> #define QXL_ALLOC_TAG '_lxq'
> @@ -1002,6 +1004,47 @@ static VP_STATUS SetCustomDisplay(QXLExtension *dev_ext, QXLEscapeSetCustomDispl
> dev_ext->custom_mode);
> }
>
> +VP_STATUS QXLRegistryCallback(
> + PVOID HwDeviceExtension,
> + PVOID Context,
> + PWSTR ValueName,
> + PVOID ValueData,
> + ULONG ValueLength
> +)
> +{
> + QXLExtension *dev_ext = HwDeviceExtension;
> + ULONG *key_ret = (ULONG *)Context;
> +
> + DEBUG_PRINT((dev_ext, 60, "%s: length %d, first byte %d\n", __FUNCTION__,
> + ValueLength, (UINT8)ValueData));
> +
> + if (key_ret) {
> + *key_ret = *(PULONG)ValueData;
> + }
> + return NO_ERROR;
> +}
> +
> +static UINT8 check_non_primary_surfaces_registry_key(QXLExtension *dev_ext)
> +{
> + VP_STATUS ret;
> + ULONG key_ret;
> +
> + ret = VideoPortGetRegistryParameters(
> + dev_ext,
> + L"DisableSurfaces",
> + FALSE,
> + QXLRegistryCallback,
> + &key_ret);
> + if (ret == ERROR_INVALID_PARAMETER) {
> + dev_ext->create_non_primary_surfaces = 1;
> + DEBUG_PRINT((dev_ext, 0, "%s: CreateNonPrimarySurfaces key doesn't exist, default to 1\n",
> + __FUNCTION__));
> + } else {
> + dev_ext->create_non_primary_surfaces = 0;
> + }
> + return dev_ext->create_non_primary_surfaces;
> +}
> +
> BOOLEAN StartIO(PVOID dev_extension, PVIDEO_REQUEST_PACKET packet)
> {
> QXLExtension *dev_ext = dev_extension;
> @@ -1187,9 +1230,11 @@ BOOLEAN StartIO(PVOID dev_extension, PVIDEO_REQUEST_PACKET packet)
>
> driver_info->n_surfaces = dev_ext->rom->n_surfaces;
>
> - driver_info->fb_phys = dev_ext->vram_physical.QuadPart;
> + driver_info->fb_phys = dev_ext->vram_physical.QuadPart;
>
> driver_info->dev_id = dev_ext->rom->id;
> +
> + driver_info->create_non_primary_surfaces = check_non_primary_surfaces_registry_key(dev_ext);
> }
> break;
>
> diff --git a/miniport/qxl.inf b/miniport/qxl.inf
> index d20778b..9b17575 100644
> --- a/miniport/qxl.inf
> +++ b/miniport/qxl.inf
> @@ -3,7 +3,7 @@
>
> [Version]
> Signature = "$CHICAGO$"
> -DriverVer = 03/20/2011,1.4.1.1
> +DriverVer = 08/15/2012,1.4.2.3
> Provider = %RHAT%
> CatalogFile = qxl.cat
> Class = Display
> diff --git a/miniport/qxl.rc b/miniport/qxl.rc
> index 86f04b9..50abefe 100644
> --- a/miniport/qxl.rc
> +++ b/miniport/qxl.rc
> @@ -16,12 +16,12 @@
> #define VER_FILEDESCRIPTION_STR "Red Hat QXL Display Driver"
> #define VER_INTERNALNAME_STR "qxl.sys"
> #define VER_ORIGINALFILENAME_STR VER_INTERNALNAME_STR
> -#define VER_FILEVERSION_STR "1.4.1.1"
> +#define VER_FILEVERSION_STR "1.4.2.3"
> #define VER_PRODUCTNAME_STR "Spice"
> -#define VER_PRODUCTVERSION_STR "1.4.1.1"
> +#define VER_PRODUCTVERSION_STR "1.4.2.3"
>
> #undef VER_PRODUCTVERSION
> -#define VER_PRODUCTVERSION 1,4,1,1
> +#define VER_PRODUCTVERSION 1,4,2,3
>
> #define VER_COMPANYNAME_STR "Red Hat Inc."
> #define VER_LEGALCOPYRIGHT_STR "� Red Hat Inc. All rights reserved."
>
More information about the Spice-devel
mailing list