- for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
- if (resource_formats[i] != PIPE_FORMAT_NONE) {
- vl_video_buffer_template(&templ, &vidtemplate,
- resource_formats[i], 1,
- array_size, PIPE_USAGE_DEFAULT, i);
- /* Set PIPE_BIND_SHARED to avoid reallocation in si_texture_get_handle,
- * which can't handle joined surfaces. */
- /* TODO: get tiling working */
- templ.bind = PIPE_BIND_LINEAR | PIPE_BIND_SHARED;
- resources[i] = (struct si_texture *)
- pipe->screen->resource_create(pipe->screen, &templ);
- if (!resources[i])
- goto error;
- }
- }
-
- for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
- if (!resources[i])
- continue;
-
- surfaces[i] = & resources[i]->surface;
- pbs[i] = &resources[i]->buffer.buf;
- }
-
- si_vid_join_surfaces(ctx, pbs, surfaces);
-
- for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
- if (!resources[i])
- continue;
-
- /* reset the address */
- resources[i]->buffer.gpu_address = ctx->ws->buffer_get_virtual_address(
- resources[i]->buffer.buf);
- }
-
- vidtemplate.height *= array_size;
- return vl_video_buffer_create_ex2(pipe, &vidtemplate, (struct pipe_resource **)resources);
-
-error:
- for (i = 0; i < VL_NUM_COMPONENTS; ++i)
- si_texture_reference(&resources[i], NULL);
-
- return NULL;