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." -- 1.7.12.1
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel