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