summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2012-01-16 13:52:47 +0200
committerYonit Halperin <yhalperi@redhat.com>2012-01-24 10:18:29 +0200
commit9ca834caf187ee96d981d1ff497dbea80a8159ab (patch)
tree8a6f0fd4a0742745baeca07742364235c75c35fa /gtk
parentc4ac4ca2bfdd01feb5049a83be781fab14bb7050 (diff)
Change the setting of the images cache size and the glz window size
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).
Diffstat (limited to 'gtk')
-rw-r--r--gtk/channel-display-priv.h2
-rw-r--r--gtk/channel-display.c22
-rw-r--r--gtk/channel-main.c1
-rw-r--r--gtk/spice-session-priv.h12
-rw-r--r--gtk/spice-session.c70
5 files changed, 97 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..a814cfe 100644
--- a/gtk/spice-session-priv.h
+++ b/gtk/spice-session-priv.h
@@ -27,6 +27,10 @@
G_BEGIN_DECLS
+#define IMAGES_CACHE_SIZE_DEFAULT (1024 * 1024 * 80)
+#define MIN_GLZ_WINDOW_SIZE_DEFAULT (1024 * 1024 * 12)
+#define MAX_GLZ_WINDOW_SIZE_DEFAULT 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..33c297a 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, G_MAXINT, 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, LZ_MAX_WINDOW_SIZE * 4, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
g_type_class_add_private(klass, sizeof(SpiceSessionPrivate));
}
@@ -1664,3 +1708,27 @@ 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 = IMAGES_CACHE_SIZE_DEFAULT;
+ }
+
+ if (s->glz_window_size == 0) {
+ s->glz_window_size = MIN(MAX_GLZ_WINDOW_SIZE_DEFAULT, pci_ram_size / 2);
+ s->glz_window_size = MAX(MIN_GLZ_WINDOW_SIZE_DEFAULT, s->glz_window_size);
+ }
+}