Set the default sizes to be the same as in the old linux spice client. cache_size=20M pixels (instead of 32M), window_size=8M pixels for a 64MB dev ram (instead of 16M pixels). --- gtk/channel-display-priv.h | 2 - gtk/channel-display.c | 22 +++++++--- gtk/channel-main.c | 1 + gtk/spice-session-priv.h | 12 ++++++ gtk/spice-session.c | 90 +++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 117 insertions(+), 10 deletions(-)
diff --git a/gtk/channel-display-priv.h b/gtk/channel-display-priv.h index 332d271..eca1787 100644 --- a/gtk/channel-display-priv.h +++ b/gtk/channel-display-priv.h @@ -36,8 +36,6 @@ G_BEGIN_DECLS -#define DISPLAY_PIXMAP_CACHE (1024 * 1024 * 32) -#define GLZ_WINDOW_SIZE (1024 * 1024 * 16) typedef struct display_surface { RingItem link; diff --git a/gtk/channel-display.c b/gtk/channel-display.c index ec42829..2473ac6 100644 --- a/gtk/channel-display.c +++ b/gtk/channel-display.c @@ -766,13 +766,21 @@ static void emit_invalidate(SpiceChannel *channel, SpiceRect *bbox) static void spice_display_channel_up(SpiceChannel *channel) { SpiceMsgOut *out; - SpiceMsgcDisplayInit init = { - .pixmap_cache_id = 1, - .pixmap_cache_size = DISPLAY_PIXMAP_CACHE, - .glz_dictionary_id = 1, - .glz_dictionary_window_size = GLZ_WINDOW_SIZE, - }; - + SpiceSession *s = spice_channel_get_session(channel); + SpiceMsgcDisplayInit init; + int cache_size; + int glz_window_size; + + g_object_get(s, + "cache-size", &cache_size, + "glz-window-size", &glz_window_size, + NULL); + SPICE_DEBUG("%s: cache_size %d, glz_window_size %d (bytes)", __FUNCTION__, + cache_size, glz_window_size); + init.pixmap_cache_id = 1; + init.glz_dictionary_id = 1; + init.pixmap_cache_size = cache_size / 4; /* pixels */ + init.glz_dictionary_window_size = glz_window_size / 4; /* pixels */ out = spice_msg_out_new(channel, SPICE_MSGC_DISPLAY_INIT); out->marshallers->msgc_display_init(out->marshaller, &init); spice_msg_out_send_internal(out); diff --git a/gtk/channel-main.c b/gtk/channel-main.c index ebf660f..b2df547 100644 --- a/gtk/channel-main.c +++ b/gtk/channel-main.c @@ -1128,6 +1128,7 @@ static void main_handle_init(SpiceChannel *channel, SpiceMsgIn *in) init->current_mouse_mode); spice_session_set_mm_time(session, init->multi_media_time); + spice_session_set_caches_hints(session, init->ram_hint, init->display_channels_hint); c->agent_tokens = init->agent_tokens; if (init->agent_connected) diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h index 5df1182..430f4a4 100644 --- a/gtk/spice-session-priv.h +++ b/gtk/spice-session-priv.h @@ -27,6 +27,10 @@ G_BEGIN_DECLS +#define MAX_IMAGES_CACHE_SIZE (1024 * 1024 * 80) +#define MIN_GLZ_WINDOW_SIZE (1024 * 1024 * 12) +#define MAX_GLZ_WINDOW_SIZE MIN((LZ_MAX_WINDOW_SIZE * 4), 1024 * 1024 * 64) + struct _SpiceSessionPrivate { char *host; char *port; @@ -84,6 +88,11 @@ struct _SpiceSessionPrivate { display_cache images; display_cache palettes; SpiceGlzDecoderWindow *glz_window; + int images_cache_size; + int glz_window_size; + uint32_t pci_ram_size; + uint32_t display_channels_count; + /* associated objects */ SpiceAudio *audio_manager; @@ -120,6 +129,9 @@ const gchar* spice_session_get_cert_subject(SpiceSession *session); const gchar* spice_session_get_ciphers(SpiceSession *session); const gchar* spice_session_get_ca_file(SpiceSession *session); +void spice_session_set_caches_hints(SpiceSession *session, + uint32_t pci_ram_size, + uint32_t display_channels_count); void spice_session_get_caches(SpiceSession *session, display_cache **images, display_cache **palettes, diff --git a/gtk/spice-session.c b/gtk/spice-session.c index 79ba1b6..54aeabd 100644 --- a/gtk/spice-session.c +++ b/gtk/spice-session.c @@ -101,6 +101,8 @@ enum { PROP_DISABLE_EFFECTS, PROP_COLOR_DEPTH, PROP_READ_ONLY, + PROP_CACHE_SIZE, + PROP_GLZ_WINDOW_SIZE, }; /* signals */ @@ -407,7 +409,13 @@ static void spice_session_get_property(GObject *gobject, break; case PROP_READ_ONLY: g_value_set_boolean(value, s->read_only); - break; + break; + case PROP_CACHE_SIZE: + g_value_set_int(value, s->images_cache_size); + break; + case PROP_GLZ_WINDOW_SIZE: + g_value_set_int(value, s->glz_window_size); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; @@ -508,6 +516,12 @@ static void spice_session_set_property(GObject *gobject, s->read_only = g_value_get_boolean(value); g_object_notify(gobject, "read-only"); break; + case PROP_CACHE_SIZE: + s->images_cache_size = g_value_get_int(value); + break; + case PROP_GLZ_WINDOW_SIZE: + s->glz_window_size = g_value_get_int(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; @@ -913,6 +927,36 @@ static void spice_session_class_init(SpiceSessionClass *klass) G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + /** + * SpiceSession:cache-size: + * + * Images cache size. If 0, don't set. + * + **/ + g_object_class_install_property + (gobject_class, PROP_CACHE_SIZE, + g_param_spec_int("cache-size", + "Cache size", + "Images cache size (bytes)", + 0, MAX_IMAGES_CACHE_SIZE, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * SpiceSession:glz-window-size: + * + * Glz window size. If 0, don't set. + * + **/ + g_object_class_install_property + (gobject_class, PROP_GLZ_WINDOW_SIZE, + g_param_spec_int("glz-window-size", + "Glz window size", + "Glz window size (bytes)", + 0, MAX_GLZ_WINDOW_SIZE, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_type_class_add_private(klass, sizeof(SpiceSessionPrivate)); } @@ -1664,3 +1708,47 @@ void spice_session_get_caches(SpiceSession *session, if (glz_window) *glz_window = s->glz_window; } + +G_GNUC_INTERNAL +void spice_session_set_caches_hints(SpiceSession *session, + uint32_t pci_ram_size, + uint32_t display_channels_count) +{ + SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session); + + g_return_if_fail(s != NULL); + + s->pci_ram_size = pci_ram_size; + s->display_channels_count = display_channels_count; + + /* TODO: when setting cache and window size, we should consider the client's + * available memory and the number of display channels */ + if (s->images_cache_size == 0) { + s->images_cache_size = MAX_IMAGES_CACHE_SIZE; + } + + if (s->glz_window_size == 0) { + s->glz_window_size = MIN(MAX_GLZ_WINDOW_SIZE, pci_ram_size / 2); + s->glz_window_size = MAX(MIN_GLZ_WINDOW_SIZE, s->glz_window_size); + } +} + +G_GNUC_INTERNAL +int spice_session_get_images_cache_size(SpiceSession *session) +{ + SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session); + + g_return_val_if_fail(s != NULL, 0); + g_return_val_if_fail(s->images_cache_size != -1, 0); + return s->images_cache_size; +} + +G_GNUC_INTERNAL +int spice_session_get_glz_window_size(SpiceSession *session) +{ + SpiceSessionPrivate *s = SPICE_SESSION_GET_PRIVATE(session); + + g_return_val_if_fail(s != NULL, 0); + g_return_val_if_fail(s->glz_window_size != -1, 0); + return s->glz_window_size; +} -- 1.7.6.4 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel