summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xddm/display/res.c55
-rw-r--r--xddm/display/res.h2
-rw-r--r--xddm/display/rop.c2
3 files changed, 16 insertions, 43 deletions
diff --git a/xddm/display/res.c b/xddm/display/res.c
index 6f04475..bfb3571 100644
--- a/xddm/display/res.c
+++ b/xddm/display/res.c
@@ -2070,7 +2070,8 @@ BOOL QXLCheckIfCacheImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *color_trans)
return FALSE;
}
-static CacheImage *GetCacheImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *color_trans, int high_bits_set, UINT32 *hash_key)
+static CacheImage *GetCacheImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *color_trans,
+ BOOL has_alpha, BOOL high_bits_set, UINT32 *hash_key)
{
CacheImage *cache_image;
UINT64 gdi_unique;
@@ -2085,6 +2086,10 @@ static CacheImage *GetCacheImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *color_tran
return FALSE;
}
+ if (has_alpha) {
+ ASSERT(pdev, surf->iBitmapFormat == BMF_32BPP);
+ format = SPICE_BITMAP_FMT_RGBA;
+ }
if (!ImageKeyGet(pdev, surf->hsurf, gdi_unique, &key)) {
key = GetHash(surf->pvScan0, surf->sizlBitmap.cx, surf->sizlBitmap.cy, format,
high_bits_set, line_size, surf->lDelta, color_trans);
@@ -2225,7 +2230,7 @@ BOOL QXLGetBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phys, SU
&high_bits_set) &&
!high_bits_set) {
return QXLGetAlphaBitmap(pdev, drawable, image_phys,
- surf, area, surface_dest);
+ surf, area, surface_dest, color_trans);
}
}
@@ -2238,7 +2243,7 @@ BOOL QXLGetBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phys, SU
surf->iBitmapFormat));
if (use_cache) {
- cache_image = GetCacheImage(pdev, surf, color_trans, high_bits_set, hash_key);
+ cache_image = GetCacheImage(pdev, surf, color_trans, FALSE, high_bits_set, hash_key);
if (cache_image && cache_image->image) {
DEBUG_PRINT((pdev, 11, "%s: cached image found %u\n", __FUNCTION__, cache_image->key));
internal = cache_image->image;
@@ -2331,7 +2336,7 @@ BOOL QXLGetBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phys, SU
}
BOOL QXLGetAlphaBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phys,
- SURFOBJ *surf, QXLRect *area, INT32 *surface_dest)
+ SURFOBJ *surf, QXLRect *area, INT32 *surface_dest, XLATEOBJ *color_trans)
{
Resource *image_res;
InternalImage *internal;
@@ -2347,10 +2352,11 @@ BOOL QXLGetAlphaBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phy
area->top >= 0 && area->bottom <= surf->sizlBitmap.cy);
DEBUG_PRINT((pdev, 11, "%s: iUniq=%x DONTCACHE=%x w=%d h=%d cx=%d cy=%d "
- "hsurf=%x format=%u\n", __FUNCTION__, surf->iUniq,
+ "hsurf=%x format=%u color_trans->iUniq=%x\n", __FUNCTION__, surf->iUniq,
surf->fjBitmap & BMF_DONTCACHE, width, height,
surf->sizlBitmap.cx, surf->sizlBitmap.cy, surf->hsurf,
- surf->iBitmapFormat));
+ surf->iBitmapFormat,
+ color_trans ? color_trans->iUniq : 0));
if (surf->iType != STYPE_BITMAP) {
UINT32 alloc_size;
@@ -2381,30 +2387,9 @@ BOOL QXLGetAlphaBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phy
}
ASSERT(pdev, surf->iBitmapFormat == BMF_32BPP && surf->iType == STYPE_BITMAP);
+ cache_image = GetCacheImage(pdev, surf, color_trans, TRUE, FALSE, &key);
- //todo: use GetCacheImage
-
- // NOTE: Same BMF_DONTCACHE issue as in QXLGetBitmap
- if (!surf->iUniq || (surf->fjBitmap & BMF_DONTCACHE)) {
- gdi_unique = 0;
- } else {
- gdi_unique = surf->iUniq;
- }
-
- if (!ImageKeyGet(pdev, surf->hsurf, gdi_unique, &key)) {
- key = GetHash(surf->pvScan0, surf->sizlBitmap.cx, surf->sizlBitmap.cy, SPICE_BITMAP_FMT_RGBA,
- FALSE, surf->sizlBitmap.cx << 2, surf->lDelta, NULL);
- ImageKeyPut(pdev, surf->hsurf, gdi_unique, key);
- DEBUG_PRINT((pdev, 11, "%s: ImageKeyPut %u\n", __FUNCTION__, key));
- } else {
- DEBUG_PRINT((pdev, 11, "%s: ImageKeyGet %u\n", __FUNCTION__, key));
- }
-
- if (cache_image = ImageCacheGetByKey(pdev, key, TRUE, SPICE_BITMAP_FMT_RGBA,
- surf->sizlBitmap.cx, surf->sizlBitmap.cy)) {
- DEBUG_PRINT((pdev, 11, "%s: ImageCacheGetByKey %u hits %u\n", __FUNCTION__,
- key, cache_image->hits));
- cache_image->hits++;
+ if (cache_image) {
if (internal = cache_image->image) {
DEBUG_PRINT((pdev, 11, "%s: cached image found %u\n", __FUNCTION__, key));
*image_phys = PA(pdev, &internal->image, pdev->main_mem_slot);
@@ -2412,18 +2397,6 @@ BOOL QXLGetAlphaBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phy
DrawableAddRes(pdev, drawable, image_res);
return TRUE;
}
- } else if (CacheSizeTest(pdev, surf)) {
- CacheImage *cache_image;
- cache_image = AllocCacheImage(pdev);
- ImageCacheRemove(pdev, cache_image);
- cache_image->key = key;
- cache_image->image = NULL;
- cache_image->format = SPICE_BITMAP_FMT_RGBA;
- cache_image->width = surf->sizlBitmap.cx;
- cache_image->height = surf->sizlBitmap.cy;
- ImageCacheAdd(pdev, cache_image);
- RingAdd(pdev, &pdev->cache_image_lru, &cache_image->lru_link);
- DEBUG_PRINT((pdev, 11, "%s: ImageCacheAdd %u\n", __FUNCTION__, key));
}
if (cache_image) {
diff --git a/xddm/display/res.h b/xddm/display/res.h
index d69986e..6ce9a68 100644
--- a/xddm/display/res.h
+++ b/xddm/display/res.h
@@ -47,7 +47,7 @@ BOOL QXLGetBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phys, SU
INT32 *surface_dest);
BOOL QXLGetBitsFromCache(PDev *pdev, QXLDrawable *drawable, UINT32 hash_key, QXLPHYSICAL *image_phys);
BOOL QXLGetAlphaBitmap(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *image_phys, SURFOBJ *surf,
- QXLRect *area, INT32 *surface_dest);
+ QXLRect *area, INT32 *surface_dest, XLATEOBJ *color_trans);
BOOL QXLCheckIfCacheImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *color_trans);
UINT8 *QXLGetBuf(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *buf_phys, UINT32 size);
BOOL QXLGetStr(PDev *pdev, QXLDrawable *drawable, QXLPHYSICAL *str_phys, FONTOBJ *font, STROBJ *str);
diff --git a/xddm/display/rop.c b/xddm/display/rop.c
index 9fb3527..a77a912 100644
--- a/xddm/display/rop.c
+++ b/xddm/display/rop.c
@@ -1647,7 +1647,7 @@ BOOL APIENTRY DrvAlphaBlend(SURFOBJ *dest, SURFOBJ *src, CLIPOBJ *clip, XLATEOBJ
ASSERT(pdev, src->iBitmapFormat == BMF_32BPP);
if (!QXLGetAlphaBitmap(pdev, drawable, &drawable->u.alpha_blend.src_bitmap, src,
&drawable->u.alpha_blend.src_area,
- &drawable->surfaces_dest[0])) {
+ &drawable->surfaces_dest[0], color_trans)) {
DEBUG_PRINT((pdev, 0, "%s: QXLGetAlphaBitmap failed\n", __FUNCTION__));
ReleaseOutput(pdev, drawable->release_info.id);
return FALSE;