On Mon, Jan 16, 2012 at 06:15:08PM +0200, Yonit Halperin wrote: > 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)
Why 80MB? why not just 0xffffffff or any other meaninglessly high number - we will fail when trying to allocate if the number is too large anyway. > +#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; indentation error > + 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; ok, so this is actually a default value? rename to DEFAULT_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 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel