13a2b906805985e0a4258bcbaed4cdff758875514Christian König/**************************************************************************
23a2b906805985e0a4258bcbaed4cdff758875514Christian König *
33a2b906805985e0a4258bcbaed4cdff758875514Christian König * Copyright 2011 Christian König.
43a2b906805985e0a4258bcbaed4cdff758875514Christian König * All Rights Reserved.
53a2b906805985e0a4258bcbaed4cdff758875514Christian König *
63a2b906805985e0a4258bcbaed4cdff758875514Christian König * Permission is hereby granted, free of charge, to any person obtaining a
73a2b906805985e0a4258bcbaed4cdff758875514Christian König * copy of this software and associated documentation files (the
83a2b906805985e0a4258bcbaed4cdff758875514Christian König * "Software"), to deal in the Software without restriction, including
93a2b906805985e0a4258bcbaed4cdff758875514Christian König * without limitation the rights to use, copy, modify, merge, publish,
103a2b906805985e0a4258bcbaed4cdff758875514Christian König * distribute, sub license, and/or sell copies of the Software, and to
113a2b906805985e0a4258bcbaed4cdff758875514Christian König * permit persons to whom the Software is furnished to do so, subject to
123a2b906805985e0a4258bcbaed4cdff758875514Christian König * the following conditions:
133a2b906805985e0a4258bcbaed4cdff758875514Christian König *
143a2b906805985e0a4258bcbaed4cdff758875514Christian König * The above copyright notice and this permission notice (including the
153a2b906805985e0a4258bcbaed4cdff758875514Christian König * next paragraph) shall be included in all copies or substantial portions
163a2b906805985e0a4258bcbaed4cdff758875514Christian König * of the Software.
173a2b906805985e0a4258bcbaed4cdff758875514Christian König *
183a2b906805985e0a4258bcbaed4cdff758875514Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193a2b906805985e0a4258bcbaed4cdff758875514Christian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
203a2b906805985e0a4258bcbaed4cdff758875514Christian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
213a2b906805985e0a4258bcbaed4cdff758875514Christian König * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
223a2b906805985e0a4258bcbaed4cdff758875514Christian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
233a2b906805985e0a4258bcbaed4cdff758875514Christian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
243a2b906805985e0a4258bcbaed4cdff758875514Christian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
253a2b906805985e0a4258bcbaed4cdff758875514Christian König *
263a2b906805985e0a4258bcbaed4cdff758875514Christian König **************************************************************************/
273a2b906805985e0a4258bcbaed4cdff758875514Christian König
283a2b906805985e0a4258bcbaed4cdff758875514Christian König#include <assert.h>
293a2b906805985e0a4258bcbaed4cdff758875514Christian König
3019bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_screen.h"
3119bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_context.h"
3219bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "pipe/p_state.h"
333a2b906805985e0a4258bcbaed4cdff758875514Christian König
3419bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_format.h"
3519bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_inlines.h"
3619bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_sampler.h"
3719bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_memory.h"
383a2b906805985e0a4258bcbaed4cdff758875514Christian König
39d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König#include "vl_video_buffer.h"
403a2b906805985e0a4258bcbaed4cdff758875514Christian König
4100b4e48560f4d576b7b1924257322f5167e58c8dChristian Königconst enum pipe_format const_resource_formats_YV12[3] = {
4200b4e48560f4d576b7b1924257322f5167e58c8dChristian König   PIPE_FORMAT_R8_UNORM,
4300b4e48560f4d576b7b1924257322f5167e58c8dChristian König   PIPE_FORMAT_R8_UNORM,
4400b4e48560f4d576b7b1924257322f5167e58c8dChristian König   PIPE_FORMAT_R8_UNORM
4500b4e48560f4d576b7b1924257322f5167e58c8dChristian König};
4600b4e48560f4d576b7b1924257322f5167e58c8dChristian König
4700b4e48560f4d576b7b1924257322f5167e58c8dChristian Königconst enum pipe_format const_resource_formats_NV12[3] = {
4800b4e48560f4d576b7b1924257322f5167e58c8dChristian König   PIPE_FORMAT_R8_UNORM,
4900b4e48560f4d576b7b1924257322f5167e58c8dChristian König   PIPE_FORMAT_R8G8_UNORM,
5000b4e48560f4d576b7b1924257322f5167e58c8dChristian König   PIPE_FORMAT_NONE
5100b4e48560f4d576b7b1924257322f5167e58c8dChristian König};
5200b4e48560f4d576b7b1924257322f5167e58c8dChristian König
53ac1dd440b8295289486d48902a052ebda892174dChristian Königconst enum pipe_format const_resource_formats_YUVA[3] = {
54ac1dd440b8295289486d48902a052ebda892174dChristian König   PIPE_FORMAT_R8G8B8A8_UNORM,
55ac1dd440b8295289486d48902a052ebda892174dChristian König   PIPE_FORMAT_NONE,
56ac1dd440b8295289486d48902a052ebda892174dChristian König   PIPE_FORMAT_NONE
57ac1dd440b8295289486d48902a052ebda892174dChristian König};
58ac1dd440b8295289486d48902a052ebda892174dChristian König
59ac1dd440b8295289486d48902a052ebda892174dChristian Königconst enum pipe_format const_resource_formats_VUYA[3] = {
60ac1dd440b8295289486d48902a052ebda892174dChristian König   PIPE_FORMAT_B8G8R8A8_UNORM,
61ac1dd440b8295289486d48902a052ebda892174dChristian König   PIPE_FORMAT_NONE,
62ac1dd440b8295289486d48902a052ebda892174dChristian König   PIPE_FORMAT_NONE
63ac1dd440b8295289486d48902a052ebda892174dChristian König};
64ac1dd440b8295289486d48902a052ebda892174dChristian König
657236f170e431b18518337f3af12ddde5014721f6Christian Königconst enum pipe_format const_resource_formats_YUYV[3] = {
667236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_R8G8_R8B8_UNORM,
677236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE,
687236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE
697236f170e431b18518337f3af12ddde5014721f6Christian König};
707236f170e431b18518337f3af12ddde5014721f6Christian König
717236f170e431b18518337f3af12ddde5014721f6Christian Königconst enum pipe_format const_resource_formats_UYVY[3] = {
727236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_G8R8_B8R8_UNORM,
737236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE,
747236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE
757236f170e431b18518337f3af12ddde5014721f6Christian König};
767236f170e431b18518337f3af12ddde5014721f6Christian König
772eabd05b7525f081ec203747a436d597ce33eb3bChristian Königconst unsigned const_resource_plane_order_YUV[3] = {
782eabd05b7525f081ec203747a436d597ce33eb3bChristian König   0,
792eabd05b7525f081ec203747a436d597ce33eb3bChristian König   1,
802eabd05b7525f081ec203747a436d597ce33eb3bChristian König   2
812eabd05b7525f081ec203747a436d597ce33eb3bChristian König};
822eabd05b7525f081ec203747a436d597ce33eb3bChristian König
832eabd05b7525f081ec203747a436d597ce33eb3bChristian Königconst unsigned const_resource_plane_order_YVU[3] = {
842eabd05b7525f081ec203747a436d597ce33eb3bChristian König   0,
852eabd05b7525f081ec203747a436d597ce33eb3bChristian König   2,
862eabd05b7525f081ec203747a436d597ce33eb3bChristian König   1
872eabd05b7525f081ec203747a436d597ce33eb3bChristian König};
882eabd05b7525f081ec203747a436d597ce33eb3bChristian König
8900b4e48560f4d576b7b1924257322f5167e58c8dChristian Königconst enum pipe_format *
907eca76952b6726be9459375dde7478a01789577eChristian Königvl_video_buffer_formats(struct pipe_screen *screen, enum pipe_format format)
9100b4e48560f4d576b7b1924257322f5167e58c8dChristian König{
9200b4e48560f4d576b7b1924257322f5167e58c8dChristian König   switch(format) {
9300b4e48560f4d576b7b1924257322f5167e58c8dChristian König   case PIPE_FORMAT_YV12:
9400b4e48560f4d576b7b1924257322f5167e58c8dChristian König      return const_resource_formats_YV12;
9500b4e48560f4d576b7b1924257322f5167e58c8dChristian König
9600b4e48560f4d576b7b1924257322f5167e58c8dChristian König   case PIPE_FORMAT_NV12:
9700b4e48560f4d576b7b1924257322f5167e58c8dChristian König      return const_resource_formats_NV12;
9800b4e48560f4d576b7b1924257322f5167e58c8dChristian König
99ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_R8G8B8A8_UNORM:
100ac1dd440b8295289486d48902a052ebda892174dChristian König      return const_resource_formats_YUVA;
101ac1dd440b8295289486d48902a052ebda892174dChristian König
102ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_B8G8R8A8_UNORM:
103ac1dd440b8295289486d48902a052ebda892174dChristian König      return const_resource_formats_VUYA;
104ac1dd440b8295289486d48902a052ebda892174dChristian König
1057236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_YUYV:
1067236f170e431b18518337f3af12ddde5014721f6Christian König      return const_resource_formats_YUYV;
1077236f170e431b18518337f3af12ddde5014721f6Christian König
1087236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_UYVY:
1097236f170e431b18518337f3af12ddde5014721f6Christian König      return const_resource_formats_UYVY;
1107236f170e431b18518337f3af12ddde5014721f6Christian König
11100b4e48560f4d576b7b1924257322f5167e58c8dChristian König   default:
11200b4e48560f4d576b7b1924257322f5167e58c8dChristian König      return NULL;
11300b4e48560f4d576b7b1924257322f5167e58c8dChristian König   }
11400b4e48560f4d576b7b1924257322f5167e58c8dChristian König}
11500b4e48560f4d576b7b1924257322f5167e58c8dChristian König
1162eabd05b7525f081ec203747a436d597ce33eb3bChristian Königconst unsigned *
1172eabd05b7525f081ec203747a436d597ce33eb3bChristian Königvl_video_buffer_plane_order(enum pipe_format format)
1182eabd05b7525f081ec203747a436d597ce33eb3bChristian König{
1197236f170e431b18518337f3af12ddde5014721f6Christian König   switch(format) {
1202eabd05b7525f081ec203747a436d597ce33eb3bChristian König   case PIPE_FORMAT_YV12:
1212eabd05b7525f081ec203747a436d597ce33eb3bChristian König      return const_resource_plane_order_YVU;
1222eabd05b7525f081ec203747a436d597ce33eb3bChristian König
1232eabd05b7525f081ec203747a436d597ce33eb3bChristian König   case PIPE_FORMAT_NV12:
124ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_R8G8B8A8_UNORM:
125ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_B8G8R8A8_UNORM:
1267236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_YUYV:
1277236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_UYVY:
1282eabd05b7525f081ec203747a436d597ce33eb3bChristian König      return const_resource_plane_order_YUV;
1292eabd05b7525f081ec203747a436d597ce33eb3bChristian König
1302eabd05b7525f081ec203747a436d597ce33eb3bChristian König   default:
1312eabd05b7525f081ec203747a436d597ce33eb3bChristian König      return NULL;
1322eabd05b7525f081ec203747a436d597ce33eb3bChristian König   }
1332eabd05b7525f081ec203747a436d597ce33eb3bChristian König}
1342eabd05b7525f081ec203747a436d597ce33eb3bChristian König
1357236f170e431b18518337f3af12ddde5014721f6Christian Königstatic enum pipe_format
1367236f170e431b18518337f3af12ddde5014721f6Christian Königvl_video_buffer_surface_format(enum pipe_format format)
1377236f170e431b18518337f3af12ddde5014721f6Christian König{
1387236f170e431b18518337f3af12ddde5014721f6Christian König   const struct util_format_description *desc = util_format_description(format);
1397236f170e431b18518337f3af12ddde5014721f6Christian König
1407236f170e431b18518337f3af12ddde5014721f6Christian König   /* a subsampled formats can't work as surface use RGBA instead */
1417236f170e431b18518337f3af12ddde5014721f6Christian König   if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED)
1427236f170e431b18518337f3af12ddde5014721f6Christian König      return PIPE_FORMAT_R8G8B8A8_UNORM;
1437236f170e431b18518337f3af12ddde5014721f6Christian König
1447236f170e431b18518337f3af12ddde5014721f6Christian König   return format;
1457236f170e431b18518337f3af12ddde5014721f6Christian König}
1467236f170e431b18518337f3af12ddde5014721f6Christian König
1477eca76952b6726be9459375dde7478a01789577eChristian Königboolean
1487eca76952b6726be9459375dde7478a01789577eChristian Königvl_video_buffer_is_format_supported(struct pipe_screen *screen,
1497eca76952b6726be9459375dde7478a01789577eChristian König                                    enum pipe_format format,
1507eca76952b6726be9459375dde7478a01789577eChristian König                                    enum pipe_video_profile profile)
1517eca76952b6726be9459375dde7478a01789577eChristian König{
1527eca76952b6726be9459375dde7478a01789577eChristian König   const enum pipe_format *resource_formats;
1537eca76952b6726be9459375dde7478a01789577eChristian König   unsigned i;
1547eca76952b6726be9459375dde7478a01789577eChristian König
1557eca76952b6726be9459375dde7478a01789577eChristian König   resource_formats = vl_video_buffer_formats(screen, format);
1567eca76952b6726be9459375dde7478a01789577eChristian König   if (!resource_formats)
1577eca76952b6726be9459375dde7478a01789577eChristian König      return false;
1587eca76952b6726be9459375dde7478a01789577eChristian König
1598abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
1607236f170e431b18518337f3af12ddde5014721f6Christian König      enum pipe_format format = resource_formats[i];
1617236f170e431b18518337f3af12ddde5014721f6Christian König
1627236f170e431b18518337f3af12ddde5014721f6Christian König      if (format == PIPE_FORMAT_NONE)
1637eca76952b6726be9459375dde7478a01789577eChristian König         continue;
1647eca76952b6726be9459375dde7478a01789577eChristian König
1657236f170e431b18518337f3af12ddde5014721f6Christian König      /* we at least need to sample from it */
1667236f170e431b18518337f3af12ddde5014721f6Christian König      if (!screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))
1677236f170e431b18518337f3af12ddde5014721f6Christian König         return false;
1687236f170e431b18518337f3af12ddde5014721f6Christian König
1697236f170e431b18518337f3af12ddde5014721f6Christian König      format = vl_video_buffer_surface_format(format);
1707236f170e431b18518337f3af12ddde5014721f6Christian König      if (!screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET))
1717eca76952b6726be9459375dde7478a01789577eChristian König         return false;
1727eca76952b6726be9459375dde7478a01789577eChristian König   }
1737eca76952b6726be9459375dde7478a01789577eChristian König
1747eca76952b6726be9459375dde7478a01789577eChristian König   return true;
1757eca76952b6726be9459375dde7478a01789577eChristian König}
1767eca76952b6726be9459375dde7478a01789577eChristian König
177efc7fda4627919b5355952d955ee4a2c98505e56Christian Königunsigned
178efc7fda4627919b5355952d955ee4a2c98505e56Christian Königvl_video_buffer_max_size(struct pipe_screen *screen)
179efc7fda4627919b5355952d955ee4a2c98505e56Christian König{
180efc7fda4627919b5355952d955ee4a2c98505e56Christian König   uint32_t max_2d_texture_level;
181efc7fda4627919b5355952d955ee4a2c98505e56Christian König
182efc7fda4627919b5355952d955ee4a2c98505e56Christian König   max_2d_texture_level = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
183efc7fda4627919b5355952d955ee4a2c98505e56Christian König
184efc7fda4627919b5355952d955ee4a2c98505e56Christian König   return 1 << (max_2d_texture_level-1);
185efc7fda4627919b5355952d955ee4a2c98505e56Christian König}
186efc7fda4627919b5355952d955ee4a2c98505e56Christian König
1878c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvoid
1888c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvl_video_buffer_set_associated_data(struct pipe_video_buffer *vbuf,
1898c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                    struct pipe_video_decoder *vdec,
1908c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                    void *associated_data,
1918c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                    void (*destroy_associated_data)(void *))
1928c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König{
1938c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vbuf->decoder = vdec;
1948c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1958c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   if (vbuf->associated_data == associated_data)
1968c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      return;
1978c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
1988c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   if (vbuf->associated_data)
1998c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      vbuf->destroy_associated_data(vbuf->associated_data);
2008c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
2018c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vbuf->associated_data = associated_data;
2028c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vbuf->destroy_associated_data = destroy_associated_data;
2038c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König}
2048c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
2058c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvoid *
2068c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvl_video_buffer_get_associated_data(struct pipe_video_buffer *vbuf,
2078c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                    struct pipe_video_decoder *vdec)
2088c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König{
2098c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   if (vbuf->decoder == vdec)
2108c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      return vbuf->associated_data;
2118c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   else
2128c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      return NULL;
2138c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König}
2148c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
21512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königvoid
21612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königvl_vide_buffer_template(struct pipe_resource *templ,
21712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König                        const struct pipe_video_buffer *tmpl,
21812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König                        enum pipe_format resource_format,
21912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König                        unsigned depth, unsigned usage, unsigned plane)
22012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König{
22112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   memset(templ, 0, sizeof(*templ));
22212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->target = depth > 1 ? PIPE_TEXTURE_3D : PIPE_TEXTURE_2D;
22312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->format = resource_format;
22412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->width0 = tmpl->width;
22512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->height0 = tmpl->height;
22612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->depth0 = depth;
22712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->array_size = 1;
22812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
22912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->usage = usage;
23012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
23112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (plane > 0) {
23212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      if (tmpl->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) {
23312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König         templ->width0 /= 2;
23412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König         templ->height0 /= 2;
23512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      } else if (tmpl->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_422) {
23612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König         templ->height0 /= 2;
23712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      }
23812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   }
23912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König}
24012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
241d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstatic void
242d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königvl_video_buffer_destroy(struct pipe_video_buffer *buffer)
243d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König{
244d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
245d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned i;
246d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
247d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   assert(buf);
248d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
2498abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
2503ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL);
2513ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL);
252d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      pipe_resource_reference(&buf->resources[i], NULL);
253d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   }
2549af70c90dba9ed9902778883b675062fa0168b48Christian König
2558abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS * 2; ++i)
2569af70c90dba9ed9902778883b675062fa0168b48Christian König      pipe_surface_reference(&buf->surfaces[i], NULL);
2579af70c90dba9ed9902778883b675062fa0168b48Christian König
2588c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vl_video_buffer_set_associated_data(buffer, NULL, NULL, NULL);
259df5e0b9435c869f88234a69db9bfe97342b027d4Christian König
260df5e0b9435c869f88234a69db9bfe97342b027d4Christian König   FREE(buffer);
261d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König}
262d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
263d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstatic struct pipe_sampler_view **
2643ea7e2713c836f23d59c4034385609e371a94c8dChristian Königvl_video_buffer_sampler_view_planes(struct pipe_video_buffer *buffer)
2653a2b906805985e0a4258bcbaed4cdff758875514Christian König{
266d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
2673a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_sampler_view sv_templ;
2683a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_context *pipe;
2693a2b906805985e0a4258bcbaed4cdff758875514Christian König   unsigned i;
2703a2b906805985e0a4258bcbaed4cdff758875514Christian König
271d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   assert(buf);
2723a2b906805985e0a4258bcbaed4cdff758875514Christian König
2734e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pipe = buf->base.context;
2743a2b906805985e0a4258bcbaed4cdff758875514Christian König
275d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   for (i = 0; i < buf->num_planes; ++i ) {
2763ea7e2713c836f23d59c4034385609e371a94c8dChristian König      if (!buf->sampler_view_planes[i]) {
2773a2b906805985e0a4258bcbaed4cdff758875514Christian König         memset(&sv_templ, 0, sizeof(sv_templ));
278d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König         u_sampler_view_default_template(&sv_templ, buf->resources[i], buf->resources[i]->format);
2793ea7e2713c836f23d59c4034385609e371a94c8dChristian König
2803ea7e2713c836f23d59c4034385609e371a94c8dChristian König         if (util_format_get_nr_components(buf->resources[i]->format) == 1)
2813ea7e2713c836f23d59c4034385609e371a94c8dChristian König            sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = sv_templ.swizzle_a = PIPE_SWIZZLE_RED;
2823ea7e2713c836f23d59c4034385609e371a94c8dChristian König
2833ea7e2713c836f23d59c4034385609e371a94c8dChristian König         buf->sampler_view_planes[i] = pipe->create_sampler_view(pipe, buf->resources[i], &sv_templ);
2843ea7e2713c836f23d59c4034385609e371a94c8dChristian König         if (!buf->sampler_view_planes[i])
2853a2b906805985e0a4258bcbaed4cdff758875514Christian König            goto error;
2863a2b906805985e0a4258bcbaed4cdff758875514Christian König      }
2873a2b906805985e0a4258bcbaed4cdff758875514Christian König   }
2883a2b906805985e0a4258bcbaed4cdff758875514Christian König
2893ea7e2713c836f23d59c4034385609e371a94c8dChristian König   return buf->sampler_view_planes;
2903a2b906805985e0a4258bcbaed4cdff758875514Christian König
2913a2b906805985e0a4258bcbaed4cdff758875514Christian Königerror:
292d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   for (i = 0; i < buf->num_planes; ++i )
2933ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL);
2943ea7e2713c836f23d59c4034385609e371a94c8dChristian König
2953ea7e2713c836f23d59c4034385609e371a94c8dChristian König   return NULL;
2963ea7e2713c836f23d59c4034385609e371a94c8dChristian König}
2973ea7e2713c836f23d59c4034385609e371a94c8dChristian König
2983ea7e2713c836f23d59c4034385609e371a94c8dChristian Königstatic struct pipe_sampler_view **
2993ea7e2713c836f23d59c4034385609e371a94c8dChristian Königvl_video_buffer_sampler_view_components(struct pipe_video_buffer *buffer)
3003ea7e2713c836f23d59c4034385609e371a94c8dChristian König{
3013ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
3023ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_sampler_view sv_templ;
3033ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_context *pipe;
3047236f170e431b18518337f3af12ddde5014721f6Christian König   const enum pipe_format *sampler_format;
3052eabd05b7525f081ec203747a436d597ce33eb3bChristian König   const unsigned *plane_order;
3063ea7e2713c836f23d59c4034385609e371a94c8dChristian König   unsigned i, j, component;
3073ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3083ea7e2713c836f23d59c4034385609e371a94c8dChristian König   assert(buf);
3093ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3104e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pipe = buf->base.context;
3113ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3127236f170e431b18518337f3af12ddde5014721f6Christian König   sampler_format = vl_video_buffer_formats(pipe->screen, buf->base.buffer_format);
3132eabd05b7525f081ec203747a436d597ce33eb3bChristian König   plane_order = vl_video_buffer_plane_order(buf->base.buffer_format);
3142eabd05b7525f081ec203747a436d597ce33eb3bChristian König
3153ea7e2713c836f23d59c4034385609e371a94c8dChristian König   for (component = 0, i = 0; i < buf->num_planes; ++i ) {
3162eabd05b7525f081ec203747a436d597ce33eb3bChristian König      struct pipe_resource *res = buf->resources[plane_order[i]];
3177236f170e431b18518337f3af12ddde5014721f6Christian König      const struct util_format_description *desc = util_format_description(res->format);
3182eabd05b7525f081ec203747a436d597ce33eb3bChristian König      unsigned nr_components = util_format_get_nr_components(res->format);
3197236f170e431b18518337f3af12ddde5014721f6Christian König      if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED)
3207236f170e431b18518337f3af12ddde5014721f6Christian König         nr_components = 3;
3213ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3227236f170e431b18518337f3af12ddde5014721f6Christian König      for (j = 0; j < nr_components && component < VL_NUM_COMPONENTS; ++j, ++component) {
3237236f170e431b18518337f3af12ddde5014721f6Christian König         if (buf->sampler_view_components[component])
3247236f170e431b18518337f3af12ddde5014721f6Christian König            continue;
3253ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3267236f170e431b18518337f3af12ddde5014721f6Christian König         memset(&sv_templ, 0, sizeof(sv_templ));
3277236f170e431b18518337f3af12ddde5014721f6Christian König         u_sampler_view_default_template(&sv_templ, res, sampler_format[plane_order[i]]);
3287236f170e431b18518337f3af12ddde5014721f6Christian König         sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = PIPE_SWIZZLE_RED + j;
3297236f170e431b18518337f3af12ddde5014721f6Christian König         sv_templ.swizzle_a = PIPE_SWIZZLE_ONE;
3307236f170e431b18518337f3af12ddde5014721f6Christian König         buf->sampler_view_components[component] = pipe->create_sampler_view(pipe, res, &sv_templ);
3317236f170e431b18518337f3af12ddde5014721f6Christian König         if (!buf->sampler_view_components[component])
3327236f170e431b18518337f3af12ddde5014721f6Christian König            goto error;
3333ea7e2713c836f23d59c4034385609e371a94c8dChristian König      }
3343ea7e2713c836f23d59c4034385609e371a94c8dChristian König   }
3357236f170e431b18518337f3af12ddde5014721f6Christian König   assert(component == VL_NUM_COMPONENTS);
3363ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3373ea7e2713c836f23d59c4034385609e371a94c8dChristian König   return buf->sampler_view_components;
3383ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3393ea7e2713c836f23d59c4034385609e371a94c8dChristian Königerror:
3408abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i )
3413ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL);
3423a2b906805985e0a4258bcbaed4cdff758875514Christian König
3433a2b906805985e0a4258bcbaed4cdff758875514Christian König   return NULL;
3443a2b906805985e0a4258bcbaed4cdff758875514Christian König}
3453a2b906805985e0a4258bcbaed4cdff758875514Christian König
346d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstatic struct pipe_surface **
347d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königvl_video_buffer_surfaces(struct pipe_video_buffer *buffer)
3483a2b906805985e0a4258bcbaed4cdff758875514Christian König{
349d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
3503a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_surface surf_templ;
3513a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_context *pipe;
3529f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König   unsigned i, j, depth, surf;
3533a2b906805985e0a4258bcbaed4cdff758875514Christian König
354d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   assert(buf);
3553a2b906805985e0a4258bcbaed4cdff758875514Christian König
3564e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pipe = buf->base.context;
3573a2b906805985e0a4258bcbaed4cdff758875514Christian König
3589f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König   depth = buffer->interlaced ? 2 : 1;
3599f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König   for (i = 0, surf = 0; i < depth; ++i ) {
3608abbdb8865890e1a39ebbbfae38422014f80072aChristian König      for (j = 0; j < VL_NUM_COMPONENTS; ++j, ++surf) {
3618abbdb8865890e1a39ebbbfae38422014f80072aChristian König         assert(surf < (VL_NUM_COMPONENTS * 2));
3629af70c90dba9ed9902778883b675062fa0168b48Christian König
3639f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König         if (!buf->resources[j]) {
3649f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            pipe_surface_reference(&buf->surfaces[surf], NULL);
3659f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            continue;
3669f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König         }
3679f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König
3689af70c90dba9ed9902778883b675062fa0168b48Christian König         if (!buf->surfaces[surf]) {
3699af70c90dba9ed9902778883b675062fa0168b48Christian König            memset(&surf_templ, 0, sizeof(surf_templ));
3707236f170e431b18518337f3af12ddde5014721f6Christian König            surf_templ.format = vl_video_buffer_surface_format(buf->resources[j]->format);
3719af70c90dba9ed9902778883b675062fa0168b48Christian König            surf_templ.usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
3729f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = i;
3739f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            buf->surfaces[surf] = pipe->create_surface(pipe, buf->resources[j], &surf_templ);
3749f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            if (!buf->surfaces[surf])
3759af70c90dba9ed9902778883b675062fa0168b48Christian König               goto error;
3769af70c90dba9ed9902778883b675062fa0168b48Christian König         }
3773a2b906805985e0a4258bcbaed4cdff758875514Christian König      }
3783a2b906805985e0a4258bcbaed4cdff758875514Christian König   }
3793a2b906805985e0a4258bcbaed4cdff758875514Christian König
380d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   return buf->surfaces;
3813a2b906805985e0a4258bcbaed4cdff758875514Christian König
3823a2b906805985e0a4258bcbaed4cdff758875514Christian Königerror:
3838abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < (VL_NUM_COMPONENTS * 2); ++i )
384d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      pipe_surface_reference(&buf->surfaces[i], NULL);
3853a2b906805985e0a4258bcbaed4cdff758875514Christian König
3863a2b906805985e0a4258bcbaed4cdff758875514Christian König   return NULL;
3873a2b906805985e0a4258bcbaed4cdff758875514Christian König}
3883a2b906805985e0a4258bcbaed4cdff758875514Christian König
389d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstruct pipe_video_buffer *
3904e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian Königvl_video_buffer_create(struct pipe_context *pipe,
391e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König                       const struct pipe_video_buffer *tmpl)
3924e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König{
3934e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   const enum pipe_format *resource_formats;
3944ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   struct pipe_video_buffer templat, *result;
3954e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   bool pot_buffers;
3964e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
3974e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   assert(pipe);
398e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   assert(tmpl->width > 0 && tmpl->height > 0);
3994e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4004e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pot_buffers = !pipe->screen->get_video_param
4014e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   (
4024e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      pipe->screen,
4034e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      PIPE_VIDEO_PROFILE_UNKNOWN,
4044e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      PIPE_VIDEO_CAP_NPOT_TEXTURES
4054e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   );
4064e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
407e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   resource_formats = vl_video_buffer_formats(pipe->screen, tmpl->buffer_format);
4084e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   if (!resource_formats)
4094e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      return NULL;
4104e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
411e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   templat = *tmpl;
412e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   templat.width = pot_buffers ? util_next_power_of_two(tmpl->width)
41370a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König                 : align(tmpl->width, VL_MACROBLOCK_WIDTH);
414e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   templat.height = pot_buffers ? util_next_power_of_two(tmpl->height)
41570a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König                  : align(tmpl->height, VL_MACROBLOCK_HEIGHT);
4164e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4179af70c90dba9ed9902778883b675062fa0168b48Christian König   if (tmpl->interlaced)
4189af70c90dba9ed9902778883b675062fa0168b48Christian König      templat.height /= 2;
4199af70c90dba9ed9902778883b675062fa0168b48Christian König
4204ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   result = vl_video_buffer_create_ex
4214e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   (
422e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König      pipe, &templat, resource_formats,
4239af70c90dba9ed9902778883b675062fa0168b48Christian König      tmpl->interlaced ? 2 : 1, PIPE_USAGE_STATIC
4244e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   );
4254ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König
4264ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König
4274ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   if (result && tmpl->interlaced)
4284ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König      result->height *= 2;
4294ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König
4304ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   return result;
4314e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König}
4324e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4334e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian Königstruct pipe_video_buffer *
4344e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian Königvl_video_buffer_create_ex(struct pipe_context *pipe,
435e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König                          const struct pipe_video_buffer *tmpl,
4368abbdb8865890e1a39ebbbfae38422014f80072aChristian König                          const enum pipe_format resource_formats[VL_NUM_COMPONENTS],
437e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König                          unsigned depth, unsigned usage)
4383a2b906805985e0a4258bcbaed4cdff758875514Christian König{
439455090c4c42cc7003594a750105980b125e140d4José Fonseca   struct pipe_resource res_tmpl;
4408abbdb8865890e1a39ebbbfae38422014f80072aChristian König   struct pipe_resource *resources[VL_NUM_COMPONENTS];
4413a2b906805985e0a4258bcbaed4cdff758875514Christian König   unsigned i;
4423a2b906805985e0a4258bcbaed4cdff758875514Christian König
4434e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   assert(pipe);
444d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
445455090c4c42cc7003594a750105980b125e140d4José Fonseca   memset(resources, 0, sizeof resources);
446455090c4c42cc7003594a750105980b125e140d4José Fonseca
44712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   vl_vide_buffer_template(&res_tmpl, tmpl, resource_formats[0], depth, usage, 0);
44812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   resources[0] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
44912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (!resources[0])
450d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      goto error;
451d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
4524f3fb1586aebfe248321e935651b5af92b5a8261Christian König   if (resource_formats[1] == PIPE_FORMAT_NONE) {
4534f3fb1586aebfe248321e935651b5af92b5a8261Christian König      assert(resource_formats[2] == PIPE_FORMAT_NONE);
45412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      return vl_video_buffer_create_ex2(pipe, tmpl, resources);
4553a2b906805985e0a4258bcbaed4cdff758875514Christian König   }
456d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
45712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   vl_vide_buffer_template(&res_tmpl, tmpl, resource_formats[1], depth, usage, 1);
45812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   resources[1] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
45912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (!resources[1])
460d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      goto error;
461d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
4624f3fb1586aebfe248321e935651b5af92b5a8261Christian König   if (resource_formats[2] == PIPE_FORMAT_NONE)
46312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      return vl_video_buffer_create_ex2(pipe, tmpl, resources);
464d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
46512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   vl_vide_buffer_template(&res_tmpl, tmpl, resource_formats[2], depth, usage, 2);
46612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   resources[2] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
46712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (!resources[2])
468d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      goto error;
469d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
47012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   return vl_video_buffer_create_ex2(pipe, tmpl, resources);
471d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
472d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königerror:
4738abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i)
47412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      pipe_resource_reference(&resources[i], NULL);
475d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
476d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   return NULL;
4773a2b906805985e0a4258bcbaed4cdff758875514Christian König}
47812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
47912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königstruct pipe_video_buffer *
48012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königvl_video_buffer_create_ex2(struct pipe_context *pipe,
48112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König                           const struct pipe_video_buffer *tmpl,
4828abbdb8865890e1a39ebbbfae38422014f80072aChristian König                           struct pipe_resource *resources[VL_NUM_COMPONENTS])
48312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König{
48412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   struct vl_video_buffer *buffer;
48512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   unsigned i;
48612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
48712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer = CALLOC_STRUCT(vl_video_buffer);
48812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
48912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base = *tmpl;
49012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.context = pipe;
49112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.destroy = vl_video_buffer_destroy;
49212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.get_sampler_view_planes = vl_video_buffer_sampler_view_planes;
49312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.get_sampler_view_components = vl_video_buffer_sampler_view_components;
49412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.get_surfaces = vl_video_buffer_surfaces;
49512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->num_planes = 0;
49612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
4978abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
49812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      buffer->resources[i] = resources[i];
49912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      if (resources[i])
50012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König         buffer->num_planes++;
50112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   }
50212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
50312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   return &buffer->base;
50412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König}
505