[Spice-devel] [PATCH v3 13/22] client: rewrite surfaces cache
Alon Levy
alevy at redhat.com
Sun Sep 25 14:36:39 PDT 2011
On Sun, Sep 25, 2011 at 03:36:51PM +0300, Yonit Halperin wrote:
> use std::map instead of a specific template (CHash).
> There is no need for special template. Moreover, using
> std::map will allow easy iteration over the surfaces.
>
This doesn't apply cleanly, in a trivial to fix way.
> Signed-off-by: Yonit Halperin <yhalperi at redhat.com>
> ---
> client/canvas.cpp | 25 +++++++-
> client/canvas.h | 152 ++++----------------------------------------
> client/display_channel.cpp | 149 +++++++++++++++----------------------------
> client/display_channel.h | 18 +-----
> client/red_gdi_canvas.cpp | 4 +-
> client/red_gdi_canvas.h | 2 +-
> client/red_gl_canvas.cpp | 4 +-
> client/red_gl_canvas.h | 2 +-
> client/red_sw_canvas.cpp | 6 +-
> client/red_sw_canvas.h | 2 +-
> 10 files changed, 101 insertions(+), 263 deletions(-)
>
> diff --git a/client/canvas.cpp b/client/canvas.cpp
> index 284a814..6a50a32 100644
> --- a/client/canvas.cpp
> +++ b/client/canvas.cpp
> @@ -21,14 +21,35 @@
> #include "utils.h"
> #include "debug.h"
>
> +static SpiceCanvas* surfaces_cache_op_get(SpiceImageSurfaces *surfaces, uint32_t surface_id)
> +{
> + SurfacesCache* surfaces_cache = static_cast<SurfacesCache*>(surfaces);
> + if (!surfaces_cache->exist(surface_id)) {
> + return NULL;
> + }
> + return (*surfaces_cache)[surface_id]->get_internal_canvas();
> +}
> +
> +SurfacesCache::SurfacesCache()
> +{
> + static SpiceImageSurfacesOps surfaces_ops = {
> + surfaces_cache_op_get,
> + };
> + ops = &surfaces_ops;
> +}
> +
> +bool SurfacesCache::exist(uint32_t surface_id)
> +{
> + return (this->count(surface_id) != 0);
> +}
>
> Canvas::Canvas(PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces &csurfaces)
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces)
> : _canvas (NULL)
> , _pixmap_cache (pixmap_cache)
> , _palette_cache (palette_cache)
> , _glz_decoder(glz_decoder_window, _glz_handler, _glz_debug)
> - , _csurfaces(csurfaces)
> + , _surfaces_cache(csurfaces)
> {
> }
>
> diff --git a/client/canvas.h b/client/canvas.h
> index 4844c31..5deafda 100644
> --- a/client/canvas.h
> +++ b/client/canvas.h
> @@ -31,6 +31,7 @@
> #include "glz_decoder.h"
> #include "jpeg_decoder.h"
> #include "zlib_decoder.h"
> +#include <map>
>
> enum CanvasType {
> CANVAS_TYPE_INVALID,
> @@ -39,102 +40,6 @@ enum CanvasType {
> CANVAS_TYPE_GDI,
> };
>
> -template <class T, int HASH_SIZE, class Base = EmptyBase>
> -class CHash : public Base {
> -public:
> - CHash()
> - {
> - memset(_hash, 0, sizeof(_hash));
> - }
> -
> - ~CHash()
> - {
> - }
> -
> - void add(uint32_t id, T* data)
> - {
> - Item** item = &_hash[key(id)];
> -
> - while (*item) {
> - PANIC_ON((*item)->id == id);
> - item = &(*item)->next;
> - }
> - *item = new Item(id, data);
> - }
> -
> - bool is_present(uint32_t id)
> - {
> - Item* item = _hash[key(id)];
> -
> - for (;;) {
> - if (!item) {
> - return false;
> - }
> -
> - if (item->id != id) {
> - item = item->next;
> - continue;
> - }
> -
> - return true;
> - }
> - }
> -
> - T* get(uint32_t id)
> - {
> - Item* item = _hash[key(id)];
> -
> - for (;;) {
> - PANIC_ON(!item);
> -
> - if (item->id != id) {
> - item = item->next;
> - continue;
> - }
> -
> - return item->data;
> - }
> - }
> -
> - void remove(uint32_t id)
> - {
> - Item** item = &_hash[key(id)];
> -
> - while (*item) {
> - if ((*item)->id == id) {
> - Item *rm_item = *item;
> - *item = rm_item->next;
> - delete rm_item;
> - return;
> - }
> - item = &(*item)->next;
> - }
> - THROW("id %lu, not found", id);
> - }
> -
> -private:
> - inline uint32_t key(uint32_t id) {return id % HASH_SIZE;}
> -
> -private:
> - class Item {
> - public:
> - Item(uint32_t in_id, T* data)
> - : id (in_id)
> - , next (NULL)
> - , data (data) {}
> -
> - ~Item()
> - {
> - }
> -
> - uint64_t id;
> - Item* next;
> - T* data;
> - };
> -
> - Item* _hash[HASH_SIZE];
> -};
> -
> class PixmapCacheTreat {
> public:
> static inline pixman_image_t *get(pixman_image_t *surf)
> @@ -201,44 +106,6 @@ public:
> }
> };
>
> -class SpiceImageSurfacesBase;
> -
> -typedef CHash<SpiceCanvas, 1024, SpiceImageSurfacesBase> CSurfaces;
> -
> -class SpiceImageSurfacesBase {
> -public:
> - SpiceImageSurfaces base;
> -
> - static void op_put(SpiceImageSurfaces *c, uint32_t surface_id, SpiceCanvas *surface)
> - {
> - CSurfaces* cache = reinterpret_cast<CSurfaces*>(c);
> - cache->add(surface_id, surface);
> - }
> -
> - static SpiceCanvas* op_get(SpiceImageSurfaces *s, uint32_t surface_id)
> - {
> - CSurfaces* cache = reinterpret_cast<CSurfaces*>(s);
> - return cache->get(surface_id);
> - }
> -
> - static void op_del(SpiceImageSurfaces *c, uint32_t surface_id)
> - {
> - CSurfaces* cache = reinterpret_cast<CSurfaces*>(c);
> - cache->remove(surface_id);
> - }
> -
> - SpiceImageSurfacesBase()
> - {
> - static SpiceImageSurfacesOps cache_ops = {
> - op_get
> - };
> - base.ops = &cache_ops;
> - }
> -};
> -
> -class Canvas;
> -
> -typedef CHash<Canvas, 1024, SpiceImageSurfacesBase> CCanvases;
>
> class CachedPalette {
> public:
> @@ -400,10 +267,20 @@ public:
> }
> };
>
> +class Canvas;
> +
> +typedef std::map<uint32_t, Canvas*> SurfacesCanvasesMap;
> +
> +class SurfacesCache: public SpiceImageSurfaces, public SurfacesCanvasesMap {
> +public:
> + SurfacesCache();
> + bool exist(uint32_t surface_id);
> +};
> +
> class Canvas {
> public:
> Canvas(PixmapCache& bits_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces& csurfaces);
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache& csurfaces);
> virtual ~Canvas();
>
> virtual void copy_pixels(const QRegion& region, RedDrawable* dc,
> @@ -443,7 +320,7 @@ protected:
>
> PixmapCache& pixmap_cache() { return _pixmap_cache;}
> PaletteCache& palette_cache() { return _palette_cache;}
> - CSurfaces& csurfaces() { return _csurfaces; }
> + SurfacesCache& surfaces_cache() { return _surfaces_cache;}
>
> GlzDecoder& glz_decoder() {return _glz_decoder;}
> JpegDecoder& jpeg_decoder() { return _jpeg_decoder;}
> @@ -454,7 +331,6 @@ private:
>
> protected:
> SpiceCanvas* _canvas;
> - CSurfaces _surfaces;
>
> private:
> PixmapCache& _pixmap_cache;
> @@ -467,7 +343,7 @@ private:
> JpegDecoder _jpeg_decoder;
> ZlibDecoder _zlib_decoder;
>
> - CSurfaces& _csurfaces;
> + SurfacesCache& _surfaces_cache;
>
> unsigned long _base;
> unsigned long _max;
> diff --git a/client/display_channel.cpp b/client/display_channel.cpp
> index ea0623c..6127a96 100644
> --- a/client/display_channel.cpp
> +++ b/client/display_channel.cpp
> @@ -544,42 +544,6 @@ void ResetTimer::response(AbstractProcessLoop& events_loop)
> _client.deactivate_interval_timer(this);
> }
>
> -void DisplaySurfacesManger::add_surface(int surface_id, SpiceCanvas *surface)
> -{
> - surfaces.add(surface_id, surface);
> -}
> -
> -void DisplaySurfacesManger::del_surface(int surface_id)
> -{
> - surfaces.remove(surface_id);
> -}
> -
> -void DisplaySurfacesManger::add_canvas(int surface_id, Canvas *canvas)
> -{
> - canvases.add(surface_id, canvas);
> -}
> -
> -void DisplaySurfacesManger::del_canvas(int surface_id)
> -{
> - canvases.remove(surface_id);
> -}
> -
> -CSurfaces& DisplaySurfacesManger::get_surfaces()
> -{
> - return surfaces;
> -}
> -
> -bool DisplaySurfacesManger::is_present_canvas(int surface_id)
> -{
> -
> - return canvases.is_present(surface_id);
> -}
> -
> -Canvas* DisplaySurfacesManger::get_canvas(int surface_id)
> -{
> - return canvases.get(surface_id);
> -}
> -
> class DisplayHandler: public MessageHandlerImp<DisplayChannel, SPICE_CHANNEL_DISPLAY> {
> public:
> DisplayHandler(DisplayChannel& channel)
> @@ -716,11 +680,11 @@ void DisplayChannel::copy_pixels(const QRegion& dest_region,
> {
> Canvas *canvas;
>
> - if (!surfaces_mngr.is_present_canvas(0)) {
> + if (!_surfaces_cache.exist(0)) {
> return;
> }
>
> - canvas = surfaces_mngr.get_canvas(0);
> + canvas = _surfaces_cache[0];
> canvas->copy_pixels(dest_region, NULL, &dest_pixmap);
> }
>
> @@ -729,8 +693,8 @@ void DisplayChannel::recreate_ogl_context_interrupt()
> {
> Canvas* canvas;
>
> - if (surfaces_mngr.is_present_canvas(0)) { //fix me to all surfaces
> - canvas = surfaces_mngr.get_canvas(0);
> + if (_surfaces_cache.exist(0)) { //fix me to all surfaces
> + canvas = _surfaces_cache[0];
> ((GCanvas *)(canvas))->touch_context();
> ((GCanvas *)canvas)->textures_lost();
> delete canvas;
> @@ -740,13 +704,13 @@ void DisplayChannel::recreate_ogl_context_interrupt()
> THROW("create_ogl_canvas failed");
> }
>
> - canvas = surfaces_mngr.get_canvas(0);
> + canvas = _surfaces_cache[0];
> ((GCanvas *)(canvas))->touch_context();
> }
>
> void DisplayChannel::recreate_ogl_context()
> {
> - if (surfaces_mngr.is_present_canvas(0) && surfaces_mngr.get_canvas(0)->get_pixmap_type() ==
> + if (_surfaces_cache.exist(0) && _surfaces_cache[0]->get_pixmap_type() ==
> CANVAS_TYPE_GL) {
> if (!screen()->need_recreate_context_gl()) {
> _gl_interrupt_recreate.trigger();
> @@ -886,12 +850,12 @@ void DisplayChannel::update_interrupt()
> Canvas *canvas;
> #endif
>
> - if (!surfaces_mngr.is_present_canvas(0) || !screen()) {
> + if (!_surfaces_cache.exist(0) || !screen()) {
> return;
> }
>
> #ifdef USE_OGL
> - canvas = surfaces_mngr.get_canvas(0);
> + canvas = _surfaces_cache[0];
> if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
> ((GCanvas *)(canvas))->pre_gl_copy();
> }
> @@ -915,7 +879,7 @@ void DisplayChannel::pre_migrate()
> void DisplayChannel::post_migrate()
> {
> #ifdef USE_OGL
> - if (surfaces_mngr.get_canvas(0)->get_pixmap_type() == CANVAS_TYPE_GL) {
> + if (_surfaces_cache.exist(0) && _surfaces_cache[0]->get_pixmap_type() == CANVAS_TYPE_GL) {
> _gl_interrupt_recreate.trigger();
> }
> #endif
> @@ -926,15 +890,11 @@ void DisplayChannel::post_migrate()
> void DisplayChannel::copy_pixels(const QRegion& dest_region,
> RedDrawable& dest_dc)
> {
> - Canvas *canvas;
> -
> - if (!surfaces_mngr.is_present_canvas(0)) {
> + if (!_surfaces_cache.exist(0)) {
> return;
> }
>
> - canvas = surfaces_mngr.get_canvas(0);
> -
> - canvas->copy_pixels(dest_region, dest_dc);
> + _surfaces_cache[0]->copy_pixels(dest_region, dest_dc);
> }
>
> class ActivateTimerEvent: public Event {
> @@ -1040,11 +1000,8 @@ void DisplayChannel::on_connect()
>
> void DisplayChannel::on_disconnect()
> {
> - if (surfaces_mngr.is_present_canvas(0)) {
> - Canvas *canvas;
> -
> - canvas = surfaces_mngr.get_canvas(0);
> - canvas->clear();
> + if (_surfaces_cache.exist(0)) {
> + _surfaces_cache[0]->clear();
> }
>
> if (screen()) {
> @@ -1070,9 +1027,8 @@ bool DisplayChannel::create_sw_canvas(int surface_id, int width, int height, uin
> SCanvas *canvas = new SCanvas(surface_id == 0, width, height, format,
> screen()->get_window(),
> _pixmap_cache, _palette_cache, _glz_window,
> - surfaces_mngr.get_surfaces());
> - surfaces_mngr.add_canvas(surface_id, canvas);
> - surfaces_mngr.add_surface(surface_id, canvas->get_internal_canvas());
> + _surfaces_cache);
> + _surfaces_cache[surface_id] = canvas;
> if (surface_id == 0) {
> LOG_INFO("display %d: using sw", get_id());
> }
> @@ -1094,12 +1050,11 @@ bool DisplayChannel::create_ogl_canvas(int surface_id, int width, int height, ui
> _pixmap_cache,
> _palette_cache,
> _glz_window,
> - surfaces_mngr.get_surfaces());
> + _surfaces_cache);
>
> screen()->untouch_context();
>
> - surfaces_mngr.add_canvas(surface_id, canvas);
> - surfaces_mngr.add_surface(surface_id, canvas->get_internal_canvas());
> + _surfaces_cache[surface_id] = canvas;
> _rendertype = rendertype;
> if (surface_id == 0) {
> LOG_INFO("display %d: using ogl", get_id());
> @@ -1118,9 +1073,8 @@ bool DisplayChannel::create_gdi_canvas(int surface_id, int width, int height, ui
> try {
> GDICanvas *canvas = new GDICanvas(width, height, format,
> _pixmap_cache, _palette_cache, _glz_window,
> - surfaces_mngr.get_surfaces());
> - surfaces_mngr.add_canvas(surface_id, canvas);
> - surfaces_mngr.add_surface(surface_id, canvas->get_internal_canvas());
> + _surfaces_cache);
> + _surfaces_cache[surface_id] = canvas;
> if (surface_id == 0) {
> LOG_INFO("display %d: using gdi", get_id());
> }
> @@ -1136,11 +1090,13 @@ void DisplayChannel::destroy_canvas(int surface_id)
> {
> Canvas *canvas;
>
> - if (!surfaces_mngr.is_present_canvas(surface_id)) {
> + if (!_surfaces_cache.exist(surface_id)) {
> + LOG_INFO("surface does not exist: %d", surface_id);
> return;
> }
>
> - canvas = surfaces_mngr.get_canvas(surface_id);
> + canvas = _surfaces_cache[surface_id];
> + _surfaces_cache.erase(surface_id);
>
> #ifdef USE_OGL
> if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
> @@ -1148,9 +1104,6 @@ void DisplayChannel::destroy_canvas(int surface_id)
> }
> #endif
>
> - surfaces_mngr.del_canvas(surface_id);
> - surfaces_mngr.del_surface(surface_id);
> -
> delete canvas;
> }
>
> @@ -1168,10 +1121,13 @@ void DisplayChannel::create_canvas(int surface_id, const std::vector<int>& canva
> recreate = false;
> }
> #endif
> -
> screen()->set_update_interrupt_trigger(NULL);
> }
>
> + if (_surfaces_cache.exist(surface_id)) {
> + LOG_WARN("surface already exists: %d", surface_id);
> + }
> +
> for (i = 0; i < canvas_types.size(); i++) {
>
> if (canvas_types[i] == CANVAS_OPTION_SW && create_sw_canvas(surface_id, width, height, format)) {
> @@ -1205,7 +1161,7 @@ void DisplayChannel::handle_mode(RedPeer::InMessage* message)
> {
> SpiceMsgDisplayMode *mode = (SpiceMsgDisplayMode *)message->data();
>
> - if (surfaces_mngr.is_present_canvas(0)) {
> + if (_surfaces_cache.exist(0)) {
> destroy_primary_surface();
> }
> create_primary_surface(mode->x_res, mode->y_res,
> @@ -1241,10 +1197,8 @@ void DisplayChannel::reset_screen()
>
> void DisplayChannel::handle_reset(RedPeer::InMessage *message)
> {
> - if (surfaces_mngr.is_present_canvas(0)) {
> - Canvas *canvas;
> - canvas = surfaces_mngr.get_canvas(0);
> - canvas->clear();
> + if (_surfaces_cache.exist(0)) {
> + _surfaces_cache[0]->clear();
> }
>
> _palette_cache.clear();
> @@ -1323,10 +1277,14 @@ void DisplayChannel::handle_stream_create(RedPeer::InMessage* message)
> THROW("stream exist");
> }
>
> + if (!_surfaces_cache.exist(surface_id)) {
> + THROW("surface does not exist: %d", surface_id);
> + }
> +
> uint32_t num_clip_rects;
> SpiceRect* clip_rects;
> set_clip_rects(stream_create->clip, num_clip_rects, clip_rects);
> - _streams[stream_create->id] = new VideoStream(get_client(), *surfaces_mngr.get_canvas(surface_id),
> + _streams[stream_create->id] = new VideoStream(get_client(), *_surfaces_cache[surface_id],
> *this, stream_create->codec_type,
> !!(stream_create->flags & SPICE_STREAM_FLAGS_TOP_DOWN),
> stream_create->stream_width,
> @@ -1429,7 +1387,7 @@ void DisplayChannel::create_primary_surface(int width, int height, uint32_t form
> _format = format;
>
> #ifdef USE_OGL
> - canvas = surfaces_mngr.get_canvas(0);
> + canvas = _surfaces_cache[0];
>
> if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
> ((GCanvas *)(canvas))->touch_context();
> @@ -1452,7 +1410,7 @@ void DisplayChannel::create_surface(int surface_id, int width, int height, uint3
> #ifdef USE_OGL
> Canvas *canvas;
>
> - canvas = surfaces_mngr.get_canvas(surface_id);
> + canvas = _surfaces_cache[surface_id];
>
> if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
> ((GCanvas *)(canvas))->touch_context();
> @@ -1464,11 +1422,8 @@ void DisplayChannel::destroy_primary_surface()
> {
> if (screen()) {
> #ifdef USE_OGL
> - if (surfaces_mngr.is_present_canvas(0)) {
> - Canvas *canvas;
> -
> - canvas = surfaces_mngr.get_canvas(0);
> - if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) {
> + if (_surfaces_cache.exist(0)) {
> + if (_surfaces_cache[0]->get_pixmap_type() == CANVAS_TYPE_GL) {
> screen()->unset_type_gl();
> screen()->untouch_context();
> }
> @@ -1535,7 +1490,7 @@ void DisplayChannel::handle_copy_bits(RedPeer::InMessage* message)
> Canvas *canvas;
> SpiceMsgDisplayCopyBits* copy_bits = (SpiceMsgDisplayCopyBits*)message->data();
> PRE_DRAW;
> - canvas = surfaces_mngr.get_canvas(copy_bits->base.surface_id);
> + canvas = _surfaces_cache[copy_bits->base.surface_id];
> canvas->copy_bits(*copy_bits, message->size());
> POST_DRAW;
> if (copy_bits->base.surface_id == 0) {
> @@ -1547,7 +1502,7 @@ void DisplayChannel::handle_draw_fill(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawFill* fill = (SpiceMsgDisplayDrawFill*)message->data();
> - canvas = surfaces_mngr.get_canvas(fill->base.surface_id);
> + canvas = _surfaces_cache[fill->base.surface_id];
> DRAW(fill);
> }
>
> @@ -1555,7 +1510,7 @@ void DisplayChannel::handle_draw_opaque(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawOpaque* opaque = (SpiceMsgDisplayDrawOpaque*)message->data();
> - canvas = surfaces_mngr.get_canvas(opaque->base.surface_id);
> + canvas = _surfaces_cache[opaque->base.surface_id];
> DRAW(opaque);
> }
>
> @@ -1563,7 +1518,7 @@ void DisplayChannel::handle_draw_copy(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawCopy* copy = (SpiceMsgDisplayDrawCopy*)message->data();
> - canvas = surfaces_mngr.get_canvas(copy->base.surface_id);
> + canvas = _surfaces_cache[copy->base.surface_id];
> DRAW(copy);
> }
>
> @@ -1571,7 +1526,7 @@ void DisplayChannel::handle_draw_blend(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawBlend* blend = (SpiceMsgDisplayDrawBlend*)message->data();
> - canvas = surfaces_mngr.get_canvas(blend->base.surface_id);
> + canvas = _surfaces_cache[blend->base.surface_id];
> DRAW(blend);
> }
>
> @@ -1579,7 +1534,7 @@ void DisplayChannel::handle_draw_blackness(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawBlackness* blackness = (SpiceMsgDisplayDrawBlackness*)message->data();
> - canvas = surfaces_mngr.get_canvas(blackness->base.surface_id);
> + canvas = _surfaces_cache[blackness->base.surface_id];
> DRAW(blackness);
> }
>
> @@ -1587,7 +1542,7 @@ void DisplayChannel::handle_draw_whiteness(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawWhiteness* whiteness = (SpiceMsgDisplayDrawWhiteness*)message->data();
> - canvas = surfaces_mngr.get_canvas(whiteness->base.surface_id);
> + canvas = _surfaces_cache[whiteness->base.surface_id];
> DRAW(whiteness);
> }
>
> @@ -1595,7 +1550,7 @@ void DisplayChannel::handle_draw_invers(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawInvers* invers = (SpiceMsgDisplayDrawInvers*)message->data();
> - canvas = surfaces_mngr.get_canvas(invers->base.surface_id);
> + canvas = _surfaces_cache[invers->base.surface_id];
> DRAW(invers);
> }
>
> @@ -1603,7 +1558,7 @@ void DisplayChannel::handle_draw_rop3(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawRop3* rop3 = (SpiceMsgDisplayDrawRop3*)message->data();
> - canvas = surfaces_mngr.get_canvas(rop3->base.surface_id);
> + canvas = _surfaces_cache[rop3->base.surface_id];
> DRAW(rop3);
> }
>
> @@ -1611,7 +1566,7 @@ void DisplayChannel::handle_draw_stroke(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawStroke* stroke = (SpiceMsgDisplayDrawStroke*)message->data();
> - canvas = surfaces_mngr.get_canvas(stroke->base.surface_id);
> + canvas = _surfaces_cache[stroke->base.surface_id];
> DRAW(stroke);
> }
>
> @@ -1619,7 +1574,7 @@ void DisplayChannel::handle_draw_text(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawText* text = (SpiceMsgDisplayDrawText*)message->data();
> - canvas = surfaces_mngr.get_canvas(text->base.surface_id);
> + canvas = _surfaces_cache[text->base.surface_id];
> DRAW(text);
> }
>
> @@ -1627,7 +1582,7 @@ void DisplayChannel::handle_draw_transparent(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawTransparent* transparent = (SpiceMsgDisplayDrawTransparent*)message->data();
> - canvas = surfaces_mngr.get_canvas(transparent->base.surface_id);
> + canvas = _surfaces_cache[transparent->base.surface_id];
> DRAW(transparent);
> }
>
> @@ -1635,7 +1590,7 @@ void DisplayChannel::handle_draw_alpha_blend(RedPeer::InMessage* message)
> {
> Canvas *canvas;
> SpiceMsgDisplayDrawAlphaBlend* alpha_blend = (SpiceMsgDisplayDrawAlphaBlend*)message->data();
> - canvas = surfaces_mngr.get_canvas(alpha_blend->base.surface_id);
> + canvas = _surfaces_cache[alpha_blend->base.surface_id];
> DRAW(alpha_blend);
> }
>
> diff --git a/client/display_channel.h b/client/display_channel.h
> index e6cd227..cdad5ff 100644
> --- a/client/display_channel.h
> +++ b/client/display_channel.h
> @@ -80,21 +80,6 @@ private:
> DisplayChannel& _channel;
> };
>
> -class DisplaySurfacesManger {
> -public:
> - void add_surface(int surface_id, SpiceCanvas *surface);
> - void del_surface(int surface_id);
> - void add_canvas(int surface_id, Canvas *canvas);
> - void del_canvas(int surface_id);
> -
> - CSurfaces& get_surfaces();
> - bool is_present_canvas(int surface_id);
> - Canvas* get_canvas(int surface_id);
> -private:
> - CSurfaces surfaces;
> - CCanvases canvases;
> -};
> -
> class DisplayChannel: public RedChannel, public ScreenLayer {
> public:
> DisplayChannel(RedClient& client, uint32_t id,
> @@ -191,8 +176,9 @@ private:
> void reset_screen();
>
> static void set_clip_rects(const SpiceClip& clip, uint32_t& num_clip_rects, SpiceRect*& clip_rects);
> +
> private:
> - DisplaySurfacesManger surfaces_mngr;
> + SurfacesCache _surfaces_cache;
> PixmapCache& _pixmap_cache;
> PaletteCache _palette_cache;
> GlzDecoderWindow& _glz_window;
> diff --git a/client/red_gdi_canvas.cpp b/client/red_gdi_canvas.cpp
> index 72b31df..0c38832 100644
> --- a/client/red_gdi_canvas.cpp
> +++ b/client/red_gdi_canvas.cpp
> @@ -25,7 +25,7 @@
>
> GDICanvas::GDICanvas(int width, int height, uint32_t format,
> PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces &csurfaces)
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces)
> : Canvas (pixmap_cache, palette_cache, glz_decoder_window, csurfaces)
> , _pixmap (0)
> {
> @@ -36,7 +36,7 @@ GDICanvas::GDICanvas(int width, int height, uint32_t format,
> &_pixmap->get_mutex(),
> format, &pixmap_cache.base,
> &palette_cache.base,
> - &csurfaces.base,
> + &csurfaces,
> &glz_decoder(),
> &jpeg_decoder(),
> &zlib_decoder()))) {
> diff --git a/client/red_gdi_canvas.h b/client/red_gdi_canvas.h
> index 643f3c6..b88c298 100644
> --- a/client/red_gdi_canvas.h
> +++ b/client/red_gdi_canvas.h
> @@ -29,7 +29,7 @@ class GDICanvas: public Canvas {
> public:
> GDICanvas(int width, int height, uint32_t format,
> PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces &csurfaces);
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces);
> virtual ~GDICanvas();
>
> virtual void thread_touch() {}
> diff --git a/client/red_gl_canvas.cpp b/client/red_gl_canvas.cpp
> index d7841b9..e2bff7f 100644
> --- a/client/red_gl_canvas.cpp
> +++ b/client/red_gl_canvas.cpp
> @@ -27,7 +27,7 @@
> GCanvas::GCanvas(int width, int height, uint32_t format, RedWindow *win,
> RenderType rendertype,
> PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces &csurfaces)
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces)
> : Canvas(pixmap_cache, palette_cache, glz_decoder_window, csurfaces)
> , _pixmap (0)
> , _textures_lost (false)
> @@ -39,7 +39,7 @@ GCanvas::GCanvas(int width, int height, uint32_t format, RedWindow *win,
> SPICE_SURFACE_FMT_DEPTH(format),
> &pixmap_cache.base,
> &palette_cache.base,
> - &csurfaces.base,
> + &csurfaces,
> &glz_decoder(),
> &jpeg_decoder(),
> &zlib_decoder()))) {
> diff --git a/client/red_gl_canvas.h b/client/red_gl_canvas.h
> index 0260958..8c19882 100644
> --- a/client/red_gl_canvas.h
> +++ b/client/red_gl_canvas.h
> @@ -31,7 +31,7 @@ public:
> GCanvas(int width, int height, uint32_t format, RedWindow *win,
> RenderType rendertype,
> PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces &csurfaces);
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces);
> virtual ~GCanvas();
>
> void set_mode();
> diff --git a/client/red_sw_canvas.cpp b/client/red_sw_canvas.cpp
> index b580e61..08d4e09 100644
> --- a/client/red_sw_canvas.cpp
> +++ b/client/red_sw_canvas.cpp
> @@ -28,7 +28,7 @@
> SCanvas::SCanvas(bool onscreen,
> int width, int height, uint32_t format, RedWindow *win,
> PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces& csurfaces)
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache& csurfaces)
> : Canvas (pixmap_cache, palette_cache, glz_decoder_window, csurfaces)
> , _pixmap (0)
> {
> @@ -41,7 +41,7 @@ SCanvas::SCanvas(bool onscreen,
> _pixmap->get_stride(),
> &pixmap_cache.base,
> &palette_cache.base,
> - &csurfaces.base,
> + &csurfaces,
> &glz_decoder(),
> &jpeg_decoder(),
> &zlib_decoder());
> @@ -49,7 +49,7 @@ SCanvas::SCanvas(bool onscreen,
> _canvas = canvas_create(width, height, format,
> &pixmap_cache.base,
> &palette_cache.base,
> - &csurfaces.base,
> + &csurfaces,
> &glz_decoder(),
> &jpeg_decoder(),
> &zlib_decoder());
> diff --git a/client/red_sw_canvas.h b/client/red_sw_canvas.h
> index ebac710..cf97d1d 100644
> --- a/client/red_sw_canvas.h
> +++ b/client/red_sw_canvas.h
> @@ -29,7 +29,7 @@ public:
> SCanvas(bool onscreen,
> int width, int height, uint32_t format, RedWindow *win,
> PixmapCache& pixmap_cache, PaletteCache& palette_cache,
> - GlzDecoderWindow &glz_decoder_window, CSurfaces &csurfaces);
> + GlzDecoderWindow &glz_decoder_window, SurfacesCache &csurfaces);
> virtual ~SCanvas();
>
> virtual void thread_touch() {}
> --
> 1.7.4.4
>
More information about the Spice-devel
mailing list