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