diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2011-09-18 14:52:04 +0300 |
---|---|---|
committer | Yonit Halperin <yhalperi@redhat.com> | 2011-11-02 11:30:21 +0200 |
commit | f22caf9aee2aa64313468b04efa615e2e1c7f8b3 (patch) | |
tree | f34d73c8f99b8eef51c43378617411fd5def8353 /client/display_channel.cpp | |
parent | 76966571748efa32a706d21830349ab2431aa4e6 (diff) | |
download | spice-f22caf9aee2aa64313468b04efa615e2e1c7f8b3.tar.gz spice-f22caf9aee2aa64313468b04efa615e2e1c7f8b3.tar.xz spice-f22caf9aee2aa64313468b04efa615e2e1c7f8b3.zip |
client: rewrite surfaces cache
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.
(cherry picked from commit fcb3b4ce5231218bcf949da4270bd85a2cfb3535 branch 0.8)
Conflicts:
client/display_channel.cpp
Diffstat (limited to 'client/display_channel.cpp')
-rw-r--r-- | client/display_channel.cpp | 149 |
1 files changed, 52 insertions, 97 deletions
diff --git a/client/display_channel.cpp b/client/display_channel.cpp index 5ab74936..b166c70f 100644 --- a/client/display_channel.cpp +++ b/client/display_channel.cpp @@ -547,42 +547,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) @@ -719,11 +683,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); } @@ -732,8 +696,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; @@ -743,13 +707,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(); @@ -889,12 +853,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_OPENGL - canvas = surfaces_mngr.get_canvas(0); + canvas = _surfaces_cache[0]; if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) { ((GCanvas *)(canvas))->pre_gl_copy(); } @@ -918,7 +882,7 @@ void DisplayChannel::pre_migrate() void DisplayChannel::post_migrate() { #ifdef USE_OPENGL - 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 @@ -929,15 +893,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 { @@ -1043,11 +1003,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()) { @@ -1073,9 +1030,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()); } @@ -1097,12 +1053,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()); @@ -1121,9 +1076,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()); } @@ -1139,11 +1093,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_OPENGL if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) { @@ -1151,9 +1107,6 @@ void DisplayChannel::destroy_canvas(int surface_id) } #endif - surfaces_mngr.del_canvas(surface_id); - surfaces_mngr.del_surface(surface_id); - delete canvas; } @@ -1171,10 +1124,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)) { @@ -1208,7 +1164,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, @@ -1244,10 +1200,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(); @@ -1326,10 +1280,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, @@ -1432,7 +1390,7 @@ void DisplayChannel::create_primary_surface(int width, int height, uint32_t form _format = format; #ifdef USE_OPENGL - canvas = surfaces_mngr.get_canvas(0); + canvas = _surfaces_cache[0]; if (canvas->get_pixmap_type() == CANVAS_TYPE_GL) { ((GCanvas *)(canvas))->touch_context(); @@ -1455,7 +1413,7 @@ void DisplayChannel::create_surface(int surface_id, int width, int height, uint3 #ifdef USE_OPENGL 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(); @@ -1467,11 +1425,8 @@ void DisplayChannel::destroy_primary_surface() { if (screen()) { #ifdef USE_OPENGL - 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(); } @@ -1538,7 +1493,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) { @@ -1550,7 +1505,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); } @@ -1558,7 +1513,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); } @@ -1566,7 +1521,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); } @@ -1574,7 +1529,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); } @@ -1582,7 +1537,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); } @@ -1590,7 +1545,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); } @@ -1598,7 +1553,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); } @@ -1606,7 +1561,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); } @@ -1614,7 +1569,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); } @@ -1622,7 +1577,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); } @@ -1630,7 +1585,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); } @@ -1638,7 +1593,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); } |