diff options
author | Christian König <[email protected]> | 2012-01-26 15:30:53 +0100 |
---|---|---|
committer | Christian König <[email protected]> | 2012-02-06 10:34:57 +0100 |
commit | 9f9628c72bb16d7d64c9b38671dff8eabd2e7681 (patch) | |
tree | ef8954bcf8da68fe0cb749c0ca718633a0652309 /src | |
parent | 4ccae0dfaaee5f773fb356d052e6605ea0d99c2c (diff) |
vl/video_buffer: fix interlaced surface ordering
Signed-off-by: Christian König <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/vl/vl_video_buffer.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index 249124f42f4..f7134a57c29 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -285,23 +285,29 @@ vl_video_buffer_surfaces(struct pipe_video_buffer *buffer) struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer; struct pipe_surface surf_templ; struct pipe_context *pipe; - unsigned i, j, surf; + unsigned i, j, depth, surf; assert(buf); pipe = buf->base.context; - for (i = 0, surf = 0; i < buf->num_planes; ++i ) { - for (j = 0; j < buf->resources[i]->depth0; ++j, ++surf) { + depth = buffer->interlaced ? 2 : 1; + for (i = 0, surf = 0; i < depth; ++i ) { + for (j = 0; j < VL_MAX_PLANES; ++j, ++surf) { assert(surf < (VL_MAX_PLANES * 2)); + if (!buf->resources[j]) { + pipe_surface_reference(&buf->surfaces[surf], NULL); + continue; + } + if (!buf->surfaces[surf]) { memset(&surf_templ, 0, sizeof(surf_templ)); - surf_templ.format = buf->resources[i]->format; + surf_templ.format = buf->resources[j]->format; surf_templ.usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; - surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = j; - buf->surfaces[i] = pipe->create_surface(pipe, buf->resources[i], &surf_templ); - if (!buf->surfaces[i]) + surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = i; + buf->surfaces[surf] = pipe->create_surface(pipe, buf->resources[j], &surf_templ); + if (!buf->surfaces[surf]) goto error; } } |