summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-05-12 23:12:12 +0300
committerAlon Levy <alevy@redhat.com>2011-05-12 23:12:12 +0300
commit2b22f59a16e59b4ede7eb7259234ec2e99006c02 (patch)
tree8d78cd3a2853c378d6027398d7c4ebb95e4ecf70
parent7eef2a22f8ac3788dd73b8c498af317d9e155ba0 (diff)
server/red_worker: add back allocation of backend. UNTESTEDserver_multi_client.v6
-rw-r--r--server/red_worker.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 1989b4ea..07d86da5 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -3675,7 +3675,7 @@ static inline void red_process_drawable(RedWorker *worker, RedDrawable *drawable
static inline void red_create_surface(RedRender *render, uint32_t surface_id, uint32_t width,
uint32_t height, int32_t stride, uint32_t format,
void *line_0, int data_is_valid,
- RedSurfaceReleaseInfo *release_info);
+ RedSurfaceReleaseInfo *release_info, int on_vram);
static RedSurfaceReleaseInfo *red_create_surface_release_info(
int is_create, QXLReleaseInfo *qxl_release_info, uint32_t group_id)
@@ -3698,11 +3698,12 @@ static inline void red_create_surface_for_all_clients(RedWorker *worker,
RedSurfaceReleaseInfo *release_info =
qxl_release_info == NULL ? NULL :
red_create_surface_release_info(1, qxl_release_info, group_id);
+ int not_vram = 0;
RENDER_FOREACH(link, render, worker) {
red_create_surface(render, surface_id,
width, height, stride, format, line_0,
- data_is_valid, release_info);
+ data_is_valid, release_info, !(not_vram++));
}
}
@@ -8728,7 +8729,7 @@ static RedRender *copy_render(DisplayChannelClient *dcc, RedRender *orig)
red_create_surface(render, i,
s->context.width, s->context.height, s->context.stride,
s->context.format, s->context.line_0,
- TRUE /* surface is valid */, s->release_info);
+ TRUE /* surface is valid */, s->release_info, FALSE);
}
#ifdef PIPE_DEBUG
render->last_id = 0; // orig->last_id; // TODO: does this make any sense?
@@ -8989,7 +8990,7 @@ static inline void red_create_surface_item(DisplayChannelClient *dcc, int surfac
static inline void red_create_surface(RedRender *render, uint32_t surface_id, uint32_t width,
uint32_t height, int32_t stride, uint32_t format,
void *line_0, int data_is_valid,
- RedSurfaceReleaseInfo *release_info)
+ RedSurfaceReleaseInfo *release_info, int on_vram)
{
RedWorker *worker = render->worker;
RedSurface *surface = &render->surfaces[surface_id];
@@ -8999,7 +9000,7 @@ static inline void red_create_surface(RedRender *render, uint32_t surface_id, ui
if (stride >= 0) {
PANIC("Untested path stride >= 0");
}
- surface->backend = NULL;
+ surface->backend = on_vram ? spice_malloc_n_m(height, abs(stride), 0) : NULL;
PANIC_ON(surface->context.canvas);
if (release_info) {
@@ -9011,9 +9012,15 @@ static inline void red_create_surface(RedRender *render, uint32_t surface_id, ui
surface->context.height = height;
surface->context.format = format;
surface->context.stride = stride;
- surface->context.line_0 = line_0;
+ surface->context.line_0 = on_vram ?
+ (char *)surface->backend + (int32_t)(stride * (height - 1)) : line_0;
if (!data_is_valid) {
memset((char *)line_0 + (int32_t)(stride * (height - 1)), 0, height*abs(stride));
+ } else {
+ if (!on_vram) {
+ memcpy(surface->backend, (char *)line_0 + (int32_t)(stride * (height - 1)),
+ height*abs(stride));
+ }
}
ring_init(&surface->current);
ring_init(&surface->current_list);