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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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
6542a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorceconst enum pipe_format const_resource_formats_YUVX[3] = {
6642a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   PIPE_FORMAT_R8G8B8X8_UNORM,
6742a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   PIPE_FORMAT_NONE,
6842a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   PIPE_FORMAT_NONE
6942a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce};
7042a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce
7142a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorceconst enum pipe_format const_resource_formats_VUYX[3] = {
7242a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   PIPE_FORMAT_B8G8R8X8_UNORM,
7342a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   PIPE_FORMAT_NONE,
7442a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   PIPE_FORMAT_NONE
7542a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce};
7642a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce
777236f170e431b18518337f3af12ddde5014721f6Christian Königconst enum pipe_format const_resource_formats_YUYV[3] = {
787236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_R8G8_R8B8_UNORM,
797236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE,
807236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE
817236f170e431b18518337f3af12ddde5014721f6Christian König};
827236f170e431b18518337f3af12ddde5014721f6Christian König
837236f170e431b18518337f3af12ddde5014721f6Christian Königconst enum pipe_format const_resource_formats_UYVY[3] = {
847236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_G8R8_B8R8_UNORM,
857236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE,
867236f170e431b18518337f3af12ddde5014721f6Christian König   PIPE_FORMAT_NONE
877236f170e431b18518337f3af12ddde5014721f6Christian König};
887236f170e431b18518337f3af12ddde5014721f6Christian König
892eabd05b7525f081ec203747a436d597ce33eb3bChristian Königconst unsigned const_resource_plane_order_YUV[3] = {
902eabd05b7525f081ec203747a436d597ce33eb3bChristian König   0,
912eabd05b7525f081ec203747a436d597ce33eb3bChristian König   1,
922eabd05b7525f081ec203747a436d597ce33eb3bChristian König   2
932eabd05b7525f081ec203747a436d597ce33eb3bChristian König};
942eabd05b7525f081ec203747a436d597ce33eb3bChristian König
952eabd05b7525f081ec203747a436d597ce33eb3bChristian Königconst unsigned const_resource_plane_order_YVU[3] = {
962eabd05b7525f081ec203747a436d597ce33eb3bChristian König   0,
972eabd05b7525f081ec203747a436d597ce33eb3bChristian König   2,
982eabd05b7525f081ec203747a436d597ce33eb3bChristian König   1
992eabd05b7525f081ec203747a436d597ce33eb3bChristian König};
1002eabd05b7525f081ec203747a436d597ce33eb3bChristian König
10100b4e48560f4d576b7b1924257322f5167e58c8dChristian Königconst enum pipe_format *
1027eca76952b6726be9459375dde7478a01789577eChristian Königvl_video_buffer_formats(struct pipe_screen *screen, enum pipe_format format)
10300b4e48560f4d576b7b1924257322f5167e58c8dChristian König{
10400b4e48560f4d576b7b1924257322f5167e58c8dChristian König   switch(format) {
10500b4e48560f4d576b7b1924257322f5167e58c8dChristian König   case PIPE_FORMAT_YV12:
10600b4e48560f4d576b7b1924257322f5167e58c8dChristian König      return const_resource_formats_YV12;
10700b4e48560f4d576b7b1924257322f5167e58c8dChristian König
10800b4e48560f4d576b7b1924257322f5167e58c8dChristian König   case PIPE_FORMAT_NV12:
10900b4e48560f4d576b7b1924257322f5167e58c8dChristian König      return const_resource_formats_NV12;
11000b4e48560f4d576b7b1924257322f5167e58c8dChristian König
111ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_R8G8B8A8_UNORM:
112ac1dd440b8295289486d48902a052ebda892174dChristian König      return const_resource_formats_YUVA;
113ac1dd440b8295289486d48902a052ebda892174dChristian König
114ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_B8G8R8A8_UNORM:
115ac1dd440b8295289486d48902a052ebda892174dChristian König      return const_resource_formats_VUYA;
116ac1dd440b8295289486d48902a052ebda892174dChristian König
11742a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   case PIPE_FORMAT_R8G8B8X8_UNORM:
11810c14919c82b0fd209500d3ecd5a8bbb2653a5a1Julien Isorce      return const_resource_formats_YUVX;
11942a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce
12042a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce   case PIPE_FORMAT_B8G8R8X8_UNORM:
12142a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce      return const_resource_formats_VUYX;
12242a5e143a8d58a0ad15dd5747449eb4b57c87177Julien Isorce
1237236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_YUYV:
1247236f170e431b18518337f3af12ddde5014721f6Christian König      return const_resource_formats_YUYV;
1257236f170e431b18518337f3af12ddde5014721f6Christian König
1267236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_UYVY:
1277236f170e431b18518337f3af12ddde5014721f6Christian König      return const_resource_formats_UYVY;
1287236f170e431b18518337f3af12ddde5014721f6Christian König
12900b4e48560f4d576b7b1924257322f5167e58c8dChristian König   default:
13000b4e48560f4d576b7b1924257322f5167e58c8dChristian König      return NULL;
13100b4e48560f4d576b7b1924257322f5167e58c8dChristian König   }
13200b4e48560f4d576b7b1924257322f5167e58c8dChristian König}
13300b4e48560f4d576b7b1924257322f5167e58c8dChristian König
1342eabd05b7525f081ec203747a436d597ce33eb3bChristian Königconst unsigned *
1352eabd05b7525f081ec203747a436d597ce33eb3bChristian Königvl_video_buffer_plane_order(enum pipe_format format)
1362eabd05b7525f081ec203747a436d597ce33eb3bChristian König{
1377236f170e431b18518337f3af12ddde5014721f6Christian König   switch(format) {
1382eabd05b7525f081ec203747a436d597ce33eb3bChristian König   case PIPE_FORMAT_YV12:
1392eabd05b7525f081ec203747a436d597ce33eb3bChristian König      return const_resource_plane_order_YVU;
1402eabd05b7525f081ec203747a436d597ce33eb3bChristian König
1412eabd05b7525f081ec203747a436d597ce33eb3bChristian König   case PIPE_FORMAT_NV12:
142ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_R8G8B8A8_UNORM:
143ac1dd440b8295289486d48902a052ebda892174dChristian König   case PIPE_FORMAT_B8G8R8A8_UNORM:
1447236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_YUYV:
1457236f170e431b18518337f3af12ddde5014721f6Christian König   case PIPE_FORMAT_UYVY:
1462eabd05b7525f081ec203747a436d597ce33eb3bChristian König      return const_resource_plane_order_YUV;
1472eabd05b7525f081ec203747a436d597ce33eb3bChristian König
1482eabd05b7525f081ec203747a436d597ce33eb3bChristian König   default:
1492eabd05b7525f081ec203747a436d597ce33eb3bChristian König      return NULL;
1502eabd05b7525f081ec203747a436d597ce33eb3bChristian König   }
1512eabd05b7525f081ec203747a436d597ce33eb3bChristian König}
1522eabd05b7525f081ec203747a436d597ce33eb3bChristian König
1537236f170e431b18518337f3af12ddde5014721f6Christian Königstatic enum pipe_format
1547236f170e431b18518337f3af12ddde5014721f6Christian Königvl_video_buffer_surface_format(enum pipe_format format)
1557236f170e431b18518337f3af12ddde5014721f6Christian König{
1567236f170e431b18518337f3af12ddde5014721f6Christian König   const struct util_format_description *desc = util_format_description(format);
1577236f170e431b18518337f3af12ddde5014721f6Christian König
1587236f170e431b18518337f3af12ddde5014721f6Christian König   /* a subsampled formats can't work as surface use RGBA instead */
1597236f170e431b18518337f3af12ddde5014721f6Christian König   if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED)
1607236f170e431b18518337f3af12ddde5014721f6Christian König      return PIPE_FORMAT_R8G8B8A8_UNORM;
1617236f170e431b18518337f3af12ddde5014721f6Christian König
1627236f170e431b18518337f3af12ddde5014721f6Christian König   return format;
1637236f170e431b18518337f3af12ddde5014721f6Christian König}
1647236f170e431b18518337f3af12ddde5014721f6Christian König
1657eca76952b6726be9459375dde7478a01789577eChristian Königboolean
1667eca76952b6726be9459375dde7478a01789577eChristian Königvl_video_buffer_is_format_supported(struct pipe_screen *screen,
1677eca76952b6726be9459375dde7478a01789577eChristian König                                    enum pipe_format format,
1685ddd840f5aacb7cc6e62b712aa737c683bd91f55Christian König                                    enum pipe_video_profile profile,
1695ddd840f5aacb7cc6e62b712aa737c683bd91f55Christian König                                    enum pipe_video_entrypoint entrypoint)
1707eca76952b6726be9459375dde7478a01789577eChristian König{
1717eca76952b6726be9459375dde7478a01789577eChristian König   const enum pipe_format *resource_formats;
1727eca76952b6726be9459375dde7478a01789577eChristian König   unsigned i;
1737eca76952b6726be9459375dde7478a01789577eChristian König
1747eca76952b6726be9459375dde7478a01789577eChristian König   resource_formats = vl_video_buffer_formats(screen, format);
1757eca76952b6726be9459375dde7478a01789577eChristian König   if (!resource_formats)
1767eca76952b6726be9459375dde7478a01789577eChristian König      return false;
1777eca76952b6726be9459375dde7478a01789577eChristian König
1788abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
1797236f170e431b18518337f3af12ddde5014721f6Christian König      enum pipe_format format = resource_formats[i];
1807236f170e431b18518337f3af12ddde5014721f6Christian König
1817236f170e431b18518337f3af12ddde5014721f6Christian König      if (format == PIPE_FORMAT_NONE)
1827eca76952b6726be9459375dde7478a01789577eChristian König         continue;
1837eca76952b6726be9459375dde7478a01789577eChristian König
1847236f170e431b18518337f3af12ddde5014721f6Christian König      /* we at least need to sample from it */
1857236f170e431b18518337f3af12ddde5014721f6Christian König      if (!screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))
1867236f170e431b18518337f3af12ddde5014721f6Christian König         return false;
1877236f170e431b18518337f3af12ddde5014721f6Christian König
1887236f170e431b18518337f3af12ddde5014721f6Christian König      format = vl_video_buffer_surface_format(format);
1897236f170e431b18518337f3af12ddde5014721f6Christian König      if (!screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET))
1907eca76952b6726be9459375dde7478a01789577eChristian König         return false;
1917eca76952b6726be9459375dde7478a01789577eChristian König   }
1927eca76952b6726be9459375dde7478a01789577eChristian König
1937eca76952b6726be9459375dde7478a01789577eChristian König   return true;
1947eca76952b6726be9459375dde7478a01789577eChristian König}
1957eca76952b6726be9459375dde7478a01789577eChristian König
196efc7fda4627919b5355952d955ee4a2c98505e56Christian Königunsigned
197efc7fda4627919b5355952d955ee4a2c98505e56Christian Königvl_video_buffer_max_size(struct pipe_screen *screen)
198efc7fda4627919b5355952d955ee4a2c98505e56Christian König{
199efc7fda4627919b5355952d955ee4a2c98505e56Christian König   uint32_t max_2d_texture_level;
200efc7fda4627919b5355952d955ee4a2c98505e56Christian König
201efc7fda4627919b5355952d955ee4a2c98505e56Christian König   max_2d_texture_level = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
202efc7fda4627919b5355952d955ee4a2c98505e56Christian König
203efc7fda4627919b5355952d955ee4a2c98505e56Christian König   return 1 << (max_2d_texture_level-1);
204efc7fda4627919b5355952d955ee4a2c98505e56Christian König}
205efc7fda4627919b5355952d955ee4a2c98505e56Christian König
2068c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvoid
2078c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvl_video_buffer_set_associated_data(struct pipe_video_buffer *vbuf,
208f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König                                    struct pipe_video_codec *vcodec,
2098c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                    void *associated_data,
2108c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König                                    void (*destroy_associated_data)(void *))
2118c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König{
212f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   vbuf->codec = vcodec;
2138c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
2148c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   if (vbuf->associated_data == associated_data)
2158c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      return;
2168c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
2178c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   if (vbuf->associated_data)
2188c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      vbuf->destroy_associated_data(vbuf->associated_data);
2198c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
2208c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vbuf->associated_data = associated_data;
2218c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vbuf->destroy_associated_data = destroy_associated_data;
2228c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König}
2238c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
2248c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvoid *
2258c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian Königvl_video_buffer_get_associated_data(struct pipe_video_buffer *vbuf,
226f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König                                    struct pipe_video_codec *vcodec)
2278c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König{
228f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   if (vbuf->codec == vcodec)
2298c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      return vbuf->associated_data;
2308c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   else
2318c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      return NULL;
2328c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König}
2338c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König
23412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königvoid
235379753869d75078649870f02eba5aafbdbbb30d2Christian Königvl_video_buffer_template(struct pipe_resource *templ,
236379753869d75078649870f02eba5aafbdbbb30d2Christian König                         const struct pipe_video_buffer *tmpl,
237379753869d75078649870f02eba5aafbdbbb30d2Christian König                         enum pipe_format resource_format,
23885b0880a17a2cffb4b1116267656b33e79e1518fChristian König                         unsigned depth, unsigned array_size,
23985b0880a17a2cffb4b1116267656b33e79e1518fChristian König                         unsigned usage, unsigned plane)
24012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König{
24112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   memset(templ, 0, sizeof(*templ));
24285b0880a17a2cffb4b1116267656b33e79e1518fChristian König   if (depth > 1)
24385b0880a17a2cffb4b1116267656b33e79e1518fChristian König      templ->target = PIPE_TEXTURE_3D;
24485b0880a17a2cffb4b1116267656b33e79e1518fChristian König   else if (array_size > 1)
24585b0880a17a2cffb4b1116267656b33e79e1518fChristian König      templ->target = PIPE_TEXTURE_2D_ARRAY;
24685b0880a17a2cffb4b1116267656b33e79e1518fChristian König   else
24785b0880a17a2cffb4b1116267656b33e79e1518fChristian König      templ->target = PIPE_TEXTURE_2D;
24812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->format = resource_format;
24912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->width0 = tmpl->width;
25012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->height0 = tmpl->height;
25185b0880a17a2cffb4b1116267656b33e79e1518fChristian König   templ->depth0 = depth;
2527d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König   templ->array_size = array_size;
2531cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce   templ->bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET | tmpl->bind;
25412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   templ->usage = usage;
25512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
25652ca9a9b8bf9c3991a82d7039d7a35955ad774b8Christian König   vl_video_buffer_adjust_size(&templ->width0, &templ->height0, plane,
25752ca9a9b8bf9c3991a82d7039d7a35955ad774b8Christian König                               tmpl->chroma_format, false);
25812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König}
25912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
260d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstatic void
261d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königvl_video_buffer_destroy(struct pipe_video_buffer *buffer)
262d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König{
263d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
264d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   unsigned i;
265d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
266d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   assert(buf);
267d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
2688abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
2693ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL);
2703ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL);
271d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      pipe_resource_reference(&buf->resources[i], NULL);
272d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   }
2739af70c90dba9ed9902778883b675062fa0168b48Christian König
274b9d1173f2cc2be7694eacaf19db3632be638a66dEmil Velikov   for (i = 0; i < VL_MAX_SURFACES; ++i)
2759af70c90dba9ed9902778883b675062fa0168b48Christian König      pipe_surface_reference(&buf->surfaces[i], NULL);
2769af70c90dba9ed9902778883b675062fa0168b48Christian König
2778c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König   vl_video_buffer_set_associated_data(buffer, NULL, NULL, NULL);
278df5e0b9435c869f88234a69db9bfe97342b027d4Christian König
279df5e0b9435c869f88234a69db9bfe97342b027d4Christian König   FREE(buffer);
280d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König}
281d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
282d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstatic struct pipe_sampler_view **
2833ea7e2713c836f23d59c4034385609e371a94c8dChristian Königvl_video_buffer_sampler_view_planes(struct pipe_video_buffer *buffer)
2843a2b906805985e0a4258bcbaed4cdff758875514Christian König{
285d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
2863a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_sampler_view sv_templ;
2873a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_context *pipe;
2883a2b906805985e0a4258bcbaed4cdff758875514Christian König   unsigned i;
2893a2b906805985e0a4258bcbaed4cdff758875514Christian König
290d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   assert(buf);
2913a2b906805985e0a4258bcbaed4cdff758875514Christian König
2924e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pipe = buf->base.context;
2933a2b906805985e0a4258bcbaed4cdff758875514Christian König
294d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   for (i = 0; i < buf->num_planes; ++i ) {
2953ea7e2713c836f23d59c4034385609e371a94c8dChristian König      if (!buf->sampler_view_planes[i]) {
2963a2b906805985e0a4258bcbaed4cdff758875514Christian König         memset(&sv_templ, 0, sizeof(sv_templ));
297d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König         u_sampler_view_default_template(&sv_templ, buf->resources[i], buf->resources[i]->format);
2983ea7e2713c836f23d59c4034385609e371a94c8dChristian König
2993ea7e2713c836f23d59c4034385609e371a94c8dChristian König         if (util_format_get_nr_components(buf->resources[i]->format) == 1)
300fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák            sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = sv_templ.swizzle_a = PIPE_SWIZZLE_X;
3013ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3023ea7e2713c836f23d59c4034385609e371a94c8dChristian König         buf->sampler_view_planes[i] = pipe->create_sampler_view(pipe, buf->resources[i], &sv_templ);
3033ea7e2713c836f23d59c4034385609e371a94c8dChristian König         if (!buf->sampler_view_planes[i])
3043a2b906805985e0a4258bcbaed4cdff758875514Christian König            goto error;
3053a2b906805985e0a4258bcbaed4cdff758875514Christian König      }
3063a2b906805985e0a4258bcbaed4cdff758875514Christian König   }
3073a2b906805985e0a4258bcbaed4cdff758875514Christian König
3083ea7e2713c836f23d59c4034385609e371a94c8dChristian König   return buf->sampler_view_planes;
3093a2b906805985e0a4258bcbaed4cdff758875514Christian König
3103a2b906805985e0a4258bcbaed4cdff758875514Christian Königerror:
311d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   for (i = 0; i < buf->num_planes; ++i )
3123ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL);
3133ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3143ea7e2713c836f23d59c4034385609e371a94c8dChristian König   return NULL;
3153ea7e2713c836f23d59c4034385609e371a94c8dChristian König}
3163ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3173ea7e2713c836f23d59c4034385609e371a94c8dChristian Königstatic struct pipe_sampler_view **
3183ea7e2713c836f23d59c4034385609e371a94c8dChristian Königvl_video_buffer_sampler_view_components(struct pipe_video_buffer *buffer)
3193ea7e2713c836f23d59c4034385609e371a94c8dChristian König{
3203ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
3213ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_sampler_view sv_templ;
3223ea7e2713c836f23d59c4034385609e371a94c8dChristian König   struct pipe_context *pipe;
3237236f170e431b18518337f3af12ddde5014721f6Christian König   const enum pipe_format *sampler_format;
3242eabd05b7525f081ec203747a436d597ce33eb3bChristian König   const unsigned *plane_order;
3253ea7e2713c836f23d59c4034385609e371a94c8dChristian König   unsigned i, j, component;
3263ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3273ea7e2713c836f23d59c4034385609e371a94c8dChristian König   assert(buf);
3283ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3294e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pipe = buf->base.context;
3303ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3317236f170e431b18518337f3af12ddde5014721f6Christian König   sampler_format = vl_video_buffer_formats(pipe->screen, buf->base.buffer_format);
3322eabd05b7525f081ec203747a436d597ce33eb3bChristian König   plane_order = vl_video_buffer_plane_order(buf->base.buffer_format);
3332eabd05b7525f081ec203747a436d597ce33eb3bChristian König
3343ea7e2713c836f23d59c4034385609e371a94c8dChristian König   for (component = 0, i = 0; i < buf->num_planes; ++i ) {
3352eabd05b7525f081ec203747a436d597ce33eb3bChristian König      struct pipe_resource *res = buf->resources[plane_order[i]];
3367236f170e431b18518337f3af12ddde5014721f6Christian König      const struct util_format_description *desc = util_format_description(res->format);
3372eabd05b7525f081ec203747a436d597ce33eb3bChristian König      unsigned nr_components = util_format_get_nr_components(res->format);
3387236f170e431b18518337f3af12ddde5014721f6Christian König      if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED)
3397236f170e431b18518337f3af12ddde5014721f6Christian König         nr_components = 3;
3403ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3417236f170e431b18518337f3af12ddde5014721f6Christian König      for (j = 0; j < nr_components && component < VL_NUM_COMPONENTS; ++j, ++component) {
3427236f170e431b18518337f3af12ddde5014721f6Christian König         if (buf->sampler_view_components[component])
3437236f170e431b18518337f3af12ddde5014721f6Christian König            continue;
3443ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3457236f170e431b18518337f3af12ddde5014721f6Christian König         memset(&sv_templ, 0, sizeof(sv_templ));
3467236f170e431b18518337f3af12ddde5014721f6Christian König         u_sampler_view_default_template(&sv_templ, res, sampler_format[plane_order[i]]);
347fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák         sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = PIPE_SWIZZLE_X + j;
348fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák         sv_templ.swizzle_a = PIPE_SWIZZLE_1;
3497236f170e431b18518337f3af12ddde5014721f6Christian König         buf->sampler_view_components[component] = pipe->create_sampler_view(pipe, res, &sv_templ);
3507236f170e431b18518337f3af12ddde5014721f6Christian König         if (!buf->sampler_view_components[component])
3517236f170e431b18518337f3af12ddde5014721f6Christian König            goto error;
3523ea7e2713c836f23d59c4034385609e371a94c8dChristian König      }
3533ea7e2713c836f23d59c4034385609e371a94c8dChristian König   }
3547236f170e431b18518337f3af12ddde5014721f6Christian König   assert(component == VL_NUM_COMPONENTS);
3553ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3563ea7e2713c836f23d59c4034385609e371a94c8dChristian König   return buf->sampler_view_components;
3573ea7e2713c836f23d59c4034385609e371a94c8dChristian König
3583ea7e2713c836f23d59c4034385609e371a94c8dChristian Königerror:
3598abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i )
3603ea7e2713c836f23d59c4034385609e371a94c8dChristian König      pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL);
3613a2b906805985e0a4258bcbaed4cdff758875514Christian König
3623a2b906805985e0a4258bcbaed4cdff758875514Christian König   return NULL;
3633a2b906805985e0a4258bcbaed4cdff758875514Christian König}
3643a2b906805985e0a4258bcbaed4cdff758875514Christian König
365d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstatic struct pipe_surface **
366d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königvl_video_buffer_surfaces(struct pipe_video_buffer *buffer)
3673a2b906805985e0a4258bcbaed4cdff758875514Christian König{
368d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer;
3693a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_surface surf_templ;
3703a2b906805985e0a4258bcbaed4cdff758875514Christian König   struct pipe_context *pipe;
3717d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König   unsigned i, j, array_size, surf;
3723a2b906805985e0a4258bcbaed4cdff758875514Christian König
373d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   assert(buf);
3743a2b906805985e0a4258bcbaed4cdff758875514Christian König
3754e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pipe = buf->base.context;
3763a2b906805985e0a4258bcbaed4cdff758875514Christian König
3777d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König   array_size = buffer->interlaced ? 2 : 1;
3784b8af72f96825cba8519b2c381ccde42decb69d3Maarten Lankhorst   for (i = 0, surf = 0; i < VL_NUM_COMPONENTS; ++i) {
3797d2f2a0c890b1993532a45c8c392c28950ddc06eChristian König      for (j = 0; j < array_size; ++j, ++surf) {
380b9d1173f2cc2be7694eacaf19db3632be638a66dEmil Velikov         assert(surf < VL_MAX_SURFACES);
3819af70c90dba9ed9902778883b675062fa0168b48Christian König
3824b8af72f96825cba8519b2c381ccde42decb69d3Maarten Lankhorst         if (!buf->resources[i]) {
3839f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            pipe_surface_reference(&buf->surfaces[surf], NULL);
3849f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            continue;
3859f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König         }
3869f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König
3879af70c90dba9ed9902778883b675062fa0168b48Christian König         if (!buf->surfaces[surf]) {
3889af70c90dba9ed9902778883b675062fa0168b48Christian König            memset(&surf_templ, 0, sizeof(surf_templ));
3894b8af72f96825cba8519b2c381ccde42decb69d3Maarten Lankhorst            surf_templ.format = vl_video_buffer_surface_format(buf->resources[i]->format);
3904b8af72f96825cba8519b2c381ccde42decb69d3Maarten Lankhorst            surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = j;
3914b8af72f96825cba8519b2c381ccde42decb69d3Maarten Lankhorst            buf->surfaces[surf] = pipe->create_surface(pipe, buf->resources[i], &surf_templ);
3929f9628c72bb16d7d64c9b38671dff8eabd2e7681Christian König            if (!buf->surfaces[surf])
3939af70c90dba9ed9902778883b675062fa0168b48Christian König               goto error;
3949af70c90dba9ed9902778883b675062fa0168b48Christian König         }
3953a2b906805985e0a4258bcbaed4cdff758875514Christian König      }
3963a2b906805985e0a4258bcbaed4cdff758875514Christian König   }
3973a2b906805985e0a4258bcbaed4cdff758875514Christian König
398d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   return buf->surfaces;
3993a2b906805985e0a4258bcbaed4cdff758875514Christian König
4003a2b906805985e0a4258bcbaed4cdff758875514Christian Königerror:
401b9d1173f2cc2be7694eacaf19db3632be638a66dEmil Velikov   for (i = 0; i < VL_MAX_SURFACES; ++i )
402d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      pipe_surface_reference(&buf->surfaces[i], NULL);
4033a2b906805985e0a4258bcbaed4cdff758875514Christian König
4043a2b906805985e0a4258bcbaed4cdff758875514Christian König   return NULL;
4053a2b906805985e0a4258bcbaed4cdff758875514Christian König}
4063a2b906805985e0a4258bcbaed4cdff758875514Christian König
407d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königstruct pipe_video_buffer *
4084e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian Königvl_video_buffer_create(struct pipe_context *pipe,
409e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König                       const struct pipe_video_buffer *tmpl)
4104e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König{
4114e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   const enum pipe_format *resource_formats;
4124ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   struct pipe_video_buffer templat, *result;
4134e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   bool pot_buffers;
4144e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4154e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   assert(pipe);
416e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   assert(tmpl->width > 0 && tmpl->height > 0);
4174e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4184e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   pot_buffers = !pipe->screen->get_video_param
4194e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   (
4204e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      pipe->screen,
4214e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      PIPE_VIDEO_PROFILE_UNKNOWN,
422a15cbabb8b546fa063cfb6f528dd67ee0037079bChristian König      PIPE_VIDEO_ENTRYPOINT_UNKNOWN,
4234e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      PIPE_VIDEO_CAP_NPOT_TEXTURES
4244e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   );
4254e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
426e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   resource_formats = vl_video_buffer_formats(pipe->screen, tmpl->buffer_format);
4274e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   if (!resource_formats)
4284e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König      return NULL;
4294e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
430e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   templat = *tmpl;
431e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   templat.width = pot_buffers ? util_next_power_of_two(tmpl->width)
43270a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König                 : align(tmpl->width, VL_MACROBLOCK_WIDTH);
433e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König   templat.height = pot_buffers ? util_next_power_of_two(tmpl->height)
43470a7695b4d1bd3f609eb9f98dd6872f1a5b89762Christian König                  : align(tmpl->height, VL_MACROBLOCK_HEIGHT);
4354e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4369af70c90dba9ed9902778883b675062fa0168b48Christian König   if (tmpl->interlaced)
4379af70c90dba9ed9902778883b675062fa0168b48Christian König      templat.height /= 2;
4389af70c90dba9ed9902778883b675062fa0168b48Christian König
4394ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   result = vl_video_buffer_create_ex
4404e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   (
441e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König      pipe, &templat, resource_formats,
442c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák      1, tmpl->interlaced ? 2 : 1, PIPE_USAGE_DEFAULT
4434e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   );
4444ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König
4454ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König
4464ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   if (result && tmpl->interlaced)
4474ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König      result->height *= 2;
4484ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König
4494ccae0dfaaee5f773fb356d052e6605ea0d99c2cChristian König   return result;
4504e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König}
4514e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König
4524e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian Königstruct pipe_video_buffer *
4534e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian Königvl_video_buffer_create_ex(struct pipe_context *pipe,
454e027759336bf49e3f568bd73b9e5f26d56ef6f83Christian König                          const struct pipe_video_buffer *tmpl,
4558abbdb8865890e1a39ebbbfae38422014f80072aChristian König                          const enum pipe_format resource_formats[VL_NUM_COMPONENTS],
45685b0880a17a2cffb4b1116267656b33e79e1518fChristian König                          unsigned depth, unsigned array_size, unsigned usage)
4573a2b906805985e0a4258bcbaed4cdff758875514Christian König{
458455090c4c42cc7003594a750105980b125e140d4José Fonseca   struct pipe_resource res_tmpl;
4598abbdb8865890e1a39ebbbfae38422014f80072aChristian König   struct pipe_resource *resources[VL_NUM_COMPONENTS];
4603a2b906805985e0a4258bcbaed4cdff758875514Christian König   unsigned i;
4613a2b906805985e0a4258bcbaed4cdff758875514Christian König
4624e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König   assert(pipe);
463d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
464455090c4c42cc7003594a750105980b125e140d4José Fonseca   memset(resources, 0, sizeof resources);
465455090c4c42cc7003594a750105980b125e140d4José Fonseca
46685b0880a17a2cffb4b1116267656b33e79e1518fChristian König   vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[0], depth, array_size, usage, 0);
46712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   resources[0] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
46812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (!resources[0])
469d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      goto error;
470d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
4714f3fb1586aebfe248321e935651b5af92b5a8261Christian König   if (resource_formats[1] == PIPE_FORMAT_NONE) {
4724f3fb1586aebfe248321e935651b5af92b5a8261Christian König      assert(resource_formats[2] == PIPE_FORMAT_NONE);
47312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      return vl_video_buffer_create_ex2(pipe, tmpl, resources);
4743a2b906805985e0a4258bcbaed4cdff758875514Christian König   }
475d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
47685b0880a17a2cffb4b1116267656b33e79e1518fChristian König   vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[1], depth, array_size, usage, 1);
47712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   resources[1] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
47812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (!resources[1])
479d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      goto error;
480d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
4814f3fb1586aebfe248321e935651b5af92b5a8261Christian König   if (resource_formats[2] == PIPE_FORMAT_NONE)
48212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      return vl_video_buffer_create_ex2(pipe, tmpl, resources);
483d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
48485b0880a17a2cffb4b1116267656b33e79e1518fChristian König   vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[2], depth, array_size, usage, 2);
48512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   resources[2] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
48612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   if (!resources[2])
487d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König      goto error;
488d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
48912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   return vl_video_buffer_create_ex2(pipe, tmpl, resources);
490d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
491d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königerror:
4928abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i)
49312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      pipe_resource_reference(&resources[i], NULL);
494d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König
495d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König   return NULL;
4963a2b906805985e0a4258bcbaed4cdff758875514Christian König}
49712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
49812b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königstruct pipe_video_buffer *
49912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian Königvl_video_buffer_create_ex2(struct pipe_context *pipe,
50012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König                           const struct pipe_video_buffer *tmpl,
5018abbdb8865890e1a39ebbbfae38422014f80072aChristian König                           struct pipe_resource *resources[VL_NUM_COMPONENTS])
50212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König{
50312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   struct vl_video_buffer *buffer;
50412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   unsigned i;
50512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
50612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer = CALLOC_STRUCT(vl_video_buffer);
5075354d2e76a929a2bb898005ef4a19a68580bd922Emil Velikov   if (!buffer)
5085354d2e76a929a2bb898005ef4a19a68580bd922Emil Velikov      return NULL;
50912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
51012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base = *tmpl;
51112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.context = pipe;
51212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.destroy = vl_video_buffer_destroy;
51312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.get_sampler_view_planes = vl_video_buffer_sampler_view_planes;
51412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.get_sampler_view_components = vl_video_buffer_sampler_view_components;
51512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->base.get_surfaces = vl_video_buffer_surfaces;
51612b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   buffer->num_planes = 0;
51712b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
5188abbdb8865890e1a39ebbbfae38422014f80072aChristian König   for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
51912b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      buffer->resources[i] = resources[i];
52012b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König      if (resources[i])
52112b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König         buffer->num_planes++;
52212b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   }
52312b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König
52412b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König   return &buffer->base;
52512b49ca2dfab832ff9dce50c846aee7f3efc3084Christian König}
526