[Spice-devel] [PATCH qxl-win v4 1/3] display/surface: add surfaces from/to ram

Yonit Halperin yhalperi at redhat.com
Thu Jul 28 06:40:40 PDT 2011


On 07/27/2011 07:17 PM, Alon Levy wrote:
ACK all except for the comment bellow.
You didn't send the patch for asynchronous io port 
support(8e64b0f77890). I ACK it as well.

Yonit.
> Adds fields to SurfaceInfo to cache data previously only available
> via SurfaceArea::draw_area.
>
> Adds two functions to save and restore surfaces from ram:
>
> MoveAllSurfacesToVideoRam
>   allocates and copies surfaces from vram to ram, and calls EngModifySurface
>   with an empty hook list to make those surfaces completely managed by gdi and not
>   us.
>
> MoveAllSurfacesToRam
>   recreates surfaces on vram and calls EngModifySurface with QXL_SURFACE_HOOKS, and
>   finally sends a QXL_SURFACE_CMD_CREATE with the valid data flag to make the server
>   send a surface image message after the surface create message.
>
> Cc: Yonit Halperin<yhalperi at redhat.com>
> ---
>   display/driver.c  |    4 +-
>   display/qxldd.h   |    6 +-
>   display/res.c     |   10 ++-
>   display/res.h     |    3 +-
>   display/surface.c |  266 +++++++++++++++++++++++++++++++++++++++++++++--------
>   display/surface.h |    3 +
>   6 files changed, 248 insertions(+), 44 deletions(-)
>
> diff --git a/display/driver.c b/display/driver.c
> index d5f9d8c..6b12540 100644
> --- a/display/driver.c
> +++ b/display/driver.c
> @@ -1300,7 +1300,9 @@ VOID APIENTRY DrvDeleteDeviceBitmap(DHSURF dhsurf)
>
>       ASSERT(pdev, surface_id<  pdev->n_surfaces);
>
> -    DeleteDeviceBitmap(surface->u.pdev, surface_id, DEVICE_BITMAP_ALLOCATION_TYPE_VRAM);
> +    DeleteDeviceBitmap(surface->u.pdev, surface_id,
> +                       surface->copy ? DEVICE_BITMAP_ALLOCATION_TYPE_RAM
> +                                     : DEVICE_BITMAP_ALLOCATION_TYPE_VRAM);
>   }
>
>   #ifdef CALL_TEST
> diff --git a/display/qxldd.h b/display/qxldd.h
> index 92d1ae8..c9c2300 100644
> --- a/display/qxldd.h
> +++ b/display/qxldd.h
> @@ -187,7 +187,11 @@ typedef struct DrawArea {
>
>   typedef struct SurfaceInfo SurfaceInfo;
>   struct SurfaceInfo {
> -    DrawArea draw_area;
> +    DrawArea    draw_area;
> +    HBITMAP     hbitmap;
> +    SIZEL       size;
> +    UINT8      *copy;
> +    ULONG       bitmap_format;
>       union {
>           PDev *pdev;
>           SurfaceInfo *next_free;
> diff --git a/display/res.c b/display/res.c
> index c21b2f6..11d1b89 100644
> --- a/display/res.c
> +++ b/display/res.c
> @@ -769,8 +769,12 @@ void PushSurfaceCmd(PDev *pdev, QXLSurfaceCmd *surface_cmd)
>       EngReleaseSemaphore(pdev->Res->cmd_sem);
>   }
>
> +QXLPHYSICAL SurfaceToPhysical(PDev *pdev, UINT8 *base_mem)
> +{
> +    return PA(pdev, base_mem, pdev->vram_mem_slot);
> +}
>
> -_inline void GetSurfaceMemory(PDev *pdev, UINT32 x, UINT32 y, UINT32 depth, UINT32 *stride,
> +_inline void GetSurfaceMemory(PDev *pdev, UINT32 x, UINT32 y, UINT32 depth, INT32 *stride,
>                                 UINT8 **base_mem, QXLPHYSICAL *phys_mem, UINT8 allocation_type)
>   {
>       DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__));
> @@ -786,7 +790,7 @@ _inline void GetSurfaceMemory(PDev *pdev, UINT32 x, UINT32 y, UINT32 depth, UINT
>           *stride = x * depth / 8;
>           *stride = ALIGN(*stride, 4);
>           *base_mem = AllocMem(pdev, MSPACE_TYPE_DEVRAM, (*stride) * y);
> -        *phys_mem = PA(pdev, *base_mem, pdev->main_mem_slot);
> +        *phys_mem = SurfaceToPhysical(pdev, *base_mem);

SurfaceToPhysical use  pdev->vram_mem_slot and not pdev->main_mem_slot
However, DEVICE_BITMAP_ALLOCATION_TYPE_DEVRAM is never used for 
surfaces, so this code is not reached.



More information about the Spice-devel mailing list