diff options
author | Alon Levy <alevy@redhat.com> | 2011-05-12 23:12:12 +0300 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2011-05-12 23:12:12 +0300 |
commit | 2b22f59a16e59b4ede7eb7259234ec2e99006c02 (patch) | |
tree | 8d78cd3a2853c378d6027398d7c4ebb95e4ecf70 | |
parent | 7eef2a22f8ac3788dd73b8c498af317d9e155ba0 (diff) |
server/red_worker: add back allocation of backend. UNTESTEDserver_multi_client.v6
-rw-r--r-- | server/red_worker.c | 19 |
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); |