summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnon Gilboa <agilboa@redhat.com>2013-06-19 18:02:42 +0300
committerArnon Gilboa <agilboa@redhat.com>2013-06-19 18:02:42 +0300
commit14649611dc4c67ba4ab506372fedb75b3763692d (patch)
tree1b816b3ccb62b67ce6f7efc695b2a84cc5d241b8
parent29009db452286105039056789dc105ff0b18e7b1 (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.cxx68
-rw-r--r--C++/bdd.hxx5
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);
-
};
//