[Spice-devel] [PATCH v3 5/6] qxl-wddm-dod: Implement non-forced bitmap allocation
Frediano Ziglio
fziglio at redhat.com
Mon Apr 10 12:35:35 UTC 2017
>
> Preparation for non-forced allocations.
> Update bitmap creation procedure to allocate device memory forced
> or non-forced.
> In forced case it works as before.
> In non-forced case, if allocation fails, the procedure allocates
> memory from OS pool for entire bitmap and copies source data to it.
> Later, before sending command, memory will be allocated from device
> memory and copied from intermediate location to new one.
>
> Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
Acked
Frediano
> ---
> qxldod/QxlDod.cpp | 29 +++++++++++++++++++++++++----
> qxldod/QxlDod.h | 2 +-
> 2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index 353f3c7..c832c93 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -4416,7 +4416,7 @@ QXLDrawable *QxlDevice::PrepareCopyBits(const RECT&
> rect, const POINT& sourcePoi
> return drawable;
> }
>
> -BOOLEAN QxlDevice::AttachNewBitmap(QXLDrawable *drawable, UINT8 *src, UINT8
> *src_end, INT pitch)
> +BOOLEAN QxlDevice::AttachNewBitmap(QXLDrawable *drawable, UINT8 *src, UINT8
> *src_end, INT pitch, BOOLEAN bForce)
> {
> PAGED_CODE();
> LONG width, height;
> @@ -4434,7 +4434,7 @@ BOOLEAN QxlDevice::AttachNewBitmap(QXLDrawable
> *drawable, UINT8 *src, UINT8 *src
>
> alloc_size = BITMAP_ALLOC_BASE + BITS_BUF_MAX - BITS_BUF_MAX %
> line_size;
> alloc_size = MIN(BITMAP_ALLOC_BASE + height * line_size, alloc_size);
> - image_res = (Resource*)AllocMem(MSPACE_TYPE_VRAM, alloc_size, TRUE);
> + image_res = (Resource*)AllocMem(MSPACE_TYPE_VRAM, alloc_size, bForce);
>
> if (image_res) {
> image_res->refs = 1;
> @@ -4466,6 +4466,27 @@ BOOLEAN QxlDevice::AttachNewBitmap(QXLDrawable
> *drawable, UINT8 *src, UINT8 *src
> DrawableAddRes(drawable, image_res);
> RELEASE_RES(image_res);
> alloc_size = height * line_size;
> + } else if (!bForce) {
> + alloc_size = height * line_size;
> + // allocate delayed chunck for entire bitmap without limitation
> + QXL_DELAYED_CHUNK *pChunk = (QXL_DELAYED_CHUNK *)new
> (PagedPool)BYTE[alloc_size + sizeof(QXL_DELAYED_CHUNK)];
> + if (pChunk) {
> + // add it to delayed list
> + InsertTailList(pDelayedList, &pChunk->list);
> + // PutBytesAlign do not need to allocate additional memory
> + pDelayedList = NULL;
> + chunk = &pChunk->chunk;
> + chunk->data_size = 0;
> + chunk->prev_chunk = 0;
> + chunk->next_chunk = 0;
> + // set dest and dest_end
> + dest = chunk->data;
> + dest_end = chunk->data + alloc_size;
> + } else {
> + // can't allocate memory
> + DbgPrint(TRACE_LEVEL_ERROR, ("Cannot allocate delayed bitmap for
> drawable\n"));
> + return FALSE;
> + }
> } else {
> // can't allocate memory (forced), driver abort flow
> DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get bitmap for drawable
> (stopping)\n"));
> @@ -4473,7 +4494,7 @@ BOOLEAN QxlDevice::AttachNewBitmap(QXLDrawable
> *drawable, UINT8 *src, UINT8 *src
> }
>
> for (; src != src_end; src -= pitch, alloc_size -= line_size) {
> - BOOLEAN b = PutBytesAlign(&chunk, &dest, &dest_end, src, line_size,
> alloc_size, NULL);
> + BOOLEAN b = PutBytesAlign(&chunk, &dest, &dest_end, src, line_size,
> alloc_size, pDelayedList);
> if (!b) {
> DbgPrint(TRACE_LEVEL_WARNING, ("%s: aborting copy of lines\n",
> __FUNCTION__));
> return FALSE;
> @@ -4530,7 +4551,7 @@ QXLDrawable *QxlDevice::PrepareBltBits (
> UINT8* src_end = src - pSrc->Pitch;
> src += pSrc->Pitch * (height - 1);
>
> - if (!AttachNewBitmap(drawable, src, src_end, (INT)pSrc->Pitch)) {
> + if (!AttachNewBitmap(drawable, src, src_end, (INT)pSrc->Pitch, TRUE)) {
> ReleaseOutput(drawable->release_info.id);
> drawable = NULL;
> } else {
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index f4e632b..28373b8 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -608,7 +608,7 @@ private:
> void PushCmd(void);
> void WaitForCursorRing(void);
> void PushCursor(void);
> - BOOLEAN AttachNewBitmap(QXLDrawable *drawable, UINT8 *src, UINT8
> *src_end, INT pitch);
> + BOOLEAN AttachNewBitmap(QXLDrawable *drawable, UINT8 *src, UINT8
> *src_end, INT pitch, BOOLEAN bForce);
> BOOLEAN PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
> UINT8 **end_ptr, UINT8 *src, int size,
> size_t alloc_size, PLIST_ENTRY pDelayed);
More information about the Spice-devel
mailing list