diff options
author | Arnon Gilboa <agilboa@redhat.com> | 2013-06-19 18:02:42 +0300 |
---|---|---|
committer | Arnon Gilboa <agilboa@redhat.com> | 2013-06-19 18:02:42 +0300 |
commit | 14649611dc4c67ba4ab506372fedb75b3763692d (patch) | |
tree | 1b816b3ccb62b67ce6f7efc695b2a84cc5d241b8 | |
parent | 29009db452286105039056789dc105ff0b18e7b1 (diff) |
wip: GetBitmapImage, PutBytesAlignres-change.v1
note that using this driver on W8 we see:
id 0, group 0, virt start 0, virt end ffffffffffffffff, generation 0, delta 0
id 1, group 1, virt start 7f9c84000000, virt end 7f9c87ffe000, generation 0, delta 7f9c84000000
id 1, group 2, virt start 7f9c84000000, virt end 7f9c87ffe000, generation 0, delta 7f9c84000000
which seems buggy (group 1 == 2, delta == start)
for comparison, with the xddm driver on W7 we see:
id 0, group 0, virt start 0, virt end ffffffffffffffff, generation 0, delta 0
id 1, group 1, virt start 7fc584000000, virt end 7fc587ffe000, generation 0, delta 7fc584000000
id 1, group 2, virt start 7fc57ee00000, virt end 7fc582e00000, generation 0, delta 7fc57ee00000
when PushDrawable is uncommented, after a few calls we get:
Spice-CRITICAL **: red_memslots.c:123:get_virt: slot_id 255 too big, addr=ffffffffc7a2f368
followed by qemu crash
-rw-r--r-- | C++/bdd.cxx | 68 | ||||
-rw-r--r-- | C++/bdd.hxx | 5 |
2 files changed, 61 insertions, 12 deletions
diff --git a/C++/bdd.cxx b/C++/bdd.cxx index cbc5d1b..4e1437e 100644 --- a/C++/bdd.cxx +++ b/C++/bdd.cxx @@ -1186,21 +1186,66 @@ VOID BASIC_DISPLAY_DRIVER::FreeBitmapImage(Resource *res) // todo: defer DeviceLog("<--- %s\n", __FUNCTION__);
} +#define NEW_DATA_CHUNK(size) { \ + void *ptr = AllocMem(MSPACE_TYPE_DEVRAM, size + sizeof(QXLDataChunk)); \ + chunk->next_chunk = PA(ptr, QXL_RAM_RANGE_INDEX); \ + ((QXLDataChunk *)ptr)->prev_chunk = PA(chunk, QXL_RAM_RANGE_INDEX); \ + chunk = (QXLDataChunk *)ptr; \ + chunk->data_size = 0; \ + chunk->next_chunk = 0; \ + now = chunk->data; \ + end = now + size; \ +} #define BITS_BUF_MAX (64 * 1024) #define BITMAP_ALLOC_BASE (sizeof(Resource) + sizeof(QXLImage) + sizeof(QXLDataChunk)) +//FIXME: use SSE +void BASIC_DISPLAY_DRIVER::PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr, UINT8 **end_ptr, + UINT8 *src, int size, size_t alloc_size, uint32_t alignment) +{ + QXLDataChunk *chunk = *chunk_ptr; + UINT8 *now = *now_ptr; + UINT8 *end = *end_ptr; + int offset; + +// DeviceLog("---> %s\n", __FUNCTION__);
+// DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__)); + while (size) { + int cp_size = (int)min(end - now, size); + if (!cp_size) { + size_t aligned_size; + ASSERT(alloc_size > 0); + ASSERT(BITS_BUF_MAX > alignment); + aligned_size = (int)min(alloc_size + alignment - 1, BITS_BUF_MAX); + aligned_size -= aligned_size % alignment; + NEW_DATA_CHUNK(aligned_size); + cp_size = (int)min(end - now, size); + } + RtlCopyMemory(now, src, cp_size); + src += cp_size; + now += cp_size; + chunk->data_size += cp_size; + size -= cp_size; + } + *chunk_ptr = chunk; + *now_ptr = now; + *end_ptr = end; +// DEBUG_PRINT((pdev, 14, "%s: done\n", __FUNCTION__)); +// DeviceLog("<--- %s\n", __FUNCTION__);
+} + //FIXME: use SSE2 FPU Resource *BASIC_DISPLAY_DRIVER::GetBitmapImage(LONG width, LONG height, UINT8 format, UINT8 *src, UINT32 line_size, UINT32 key) { Resource *image_res; QXLImage *image; - //InternalImage *internal; size_t alloc_size; QXLDataChunk *chunk; UINT8 *src_end; UINT8 *dest; UINT8 *dest_end; + LONG line_delta; DeviceLog("---> %s\n", __FUNCTION__);
//DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__)); @@ -1217,7 +1262,10 @@ Resource *BASIC_DISPLAY_DRIVER::GetBitmapImage(LONG width, LONG height, UINT8 f //RESOURCE_TYPE(image_res, RESOURCE_TYPE_BITMAP_IMAGE); image = (QXLImage *)image_res->res; -//FIXME SetImageId(internal, cache_me, width, height, format, key); + //SetImageId(internal, cache_me, width, height, format, key); + //FIXME + image->descriptor.id = (((uint64_t)key) << 32) | ((UINT32)QXL_IMAGE_GROUP_DRIVER_DONT_CACHE << 30) | key; + image->descriptor.flags = 0; image->descriptor.type = SPICE_IMAGE_TYPE_BITMAP; chunk = (QXLDataChunk *)(&image->bitmap + 1); chunk->data_size = 0; @@ -1230,18 +1278,18 @@ Resource *BASIC_DISPLAY_DRIVER::GetBitmapImage(LONG width, LONG height, UINT8 f image->bitmap.format = format; image->bitmap.stride = line_size; -// src_end = src - surf->lDelta; -// src += surf->lDelta * (height - 1); - dest = chunk->data; dest_end = (UINT8 *)image_res + alloc_size; alloc_size = height * line_size; -/* - for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) { - PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size, - &pdev->num_bits_pages, alloc_size, line_size, use_sse); +#if 0 + line_delta = line_size; //FIXME: surf->lDelta + src_end = src - line_delta; + src += line_delta * (height - 1); + + for (; src != src_end; src -= line_delta, alloc_size -= line_size) { + PutBytesAlign(&chunk, &dest, &dest_end, src, line_size, alloc_size, line_size); } -*/ +#endif //GetPallette(pdev, &internal->image.bitmap, color_trans); //DEBUG_PRINT((pdev, 13, "%s: done\n", __FUNCTION__)); DeviceLog("<--- %s\n", __FUNCTION__);
diff --git a/C++/bdd.hxx b/C++/bdd.hxx index 2b4c1f0..28d4472 100644 --- a/C++/bdd.hxx +++ b/C++/bdd.hxx @@ -507,10 +507,11 @@ private: Resource *GetBitmapImage(LONG width, LONG height, UINT8 format, UINT8 *src, UINT32 line_size, UINT32 key); BOOL QXLGetBitmap(QXLDrawable *drawable, QXLPHYSICAL *image_phys, VOID *src, LONG stride, QXLRect *area);
BOOL PresentDisplayOnlyRect(D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId,
- VOID* src, ULONG bpp, LONG stride, UINT rotate, RECT* rect);
+ VOID* src, ULONG bpp, LONG stride, UINT rotate, RECT* rect); + void PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr, UINT8 **end_ptr, + UINT8 *src, int size, size_t alloc_size, uint32_t alignment); static VOID DeviceLogV(const char *format, va_list ap); - };
//
|