16ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen/************************************************************************** 26ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * 36ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * Copyright 2010 Thomas Balling Sørensen. 46ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * All Rights Reserved. 56ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * 66ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * Permission is hereby granted, free of charge, to any person obtaining a 76ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * copy of this software and associated documentation files (the 86ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * "Software"), to deal in the Software without restriction, including 96ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * without limitation the rights to use, copy, modify, merge, publish, 106ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * distribute, sub license, and/or sell copies of the Software, and to 116ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * permit persons to whom the Software is furnished to do so, subject to 126ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * the following conditions: 136ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * 146ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * The above copyright notice and this permission notice (including the 156ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * next paragraph) shall be included in all copies or substantial portions 166ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * of the Software. 176ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * 186ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 196ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 206ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 226ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 236ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 246ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 256ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * 266ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen **************************************************************************/ 276ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen 286ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include <vdpau/vdpau.h> 2908f3a7cf7e9133f50adf33f800aa3696c909347fChristian König 303aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König#include "util/u_memory.h" 313aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König#include "util/u_sampler.h" 323aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 336ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include "vdpau_private.h" 346ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen 35fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpBitmapSurface. 37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 386ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus 3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpBitmapSurfaceCreate(VdpDevice device, 4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpRGBAFormat rgba_format, 4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t width, uint32_t height, 4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBool frequently_accessed, 4349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBitmapSurface *surface) 446ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{ 453aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König struct pipe_context *pipe; 463aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König struct pipe_resource res_tmpl, *res; 473aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König struct pipe_sampler_view sv_templ; 48813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin VdpStatus ret; 493aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 503aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlVdpBitmapSurface *vlsurface = NULL; 513aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 523aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!(width && height)) 533aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_INVALID_SIZE; 543aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 553aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlVdpDevice *dev = vlGetDataHTAB(device); 563aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!dev) 573aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_INVALID_HANDLE; 583aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 593aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König pipe = dev->context; 603aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!pipe) 613aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_INVALID_HANDLE; 623aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 6349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!surface) 6449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 656ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen 663aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlsurface = CALLOC(1, sizeof(vlVdpBitmapSurface)); 673aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!vlsurface) 683aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_RESOURCES; 693aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 706fb42ee7a632e181160ac4be234b30e50a1b91d5Christian König DeviceReference(&vlsurface->device, dev); 713aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 723aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König memset(&res_tmpl, 0, sizeof(res_tmpl)); 733aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res_tmpl.target = PIPE_TEXTURE_2D; 740042aa508e19bb920d0ab385894cd3e03b9eafdeChristian König res_tmpl.format = VdpFormatRGBAToPipe(rgba_format); 753aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res_tmpl.width0 = width; 763aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res_tmpl.height0 = height; 773aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res_tmpl.depth0 = 1; 783aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res_tmpl.array_size = 1; 793aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 80c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák res_tmpl.usage = frequently_accessed ? PIPE_USAGE_DYNAMIC : PIPE_USAGE_DEFAULT; 8105579339c0da442669ea75749651e8cf4f9ec39bChristian König 8205579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(dev->mutex); 83f5788e042afbb93e693885e90609d552674f9bd2Ilia Mirkin 84f5788e042afbb93e693885e90609d552674f9bd2Ilia Mirkin if (!CheckSurfaceParams(pipe->screen, &res_tmpl)) { 85f5788e042afbb93e693885e90609d552674f9bd2Ilia Mirkin ret = VDP_STATUS_RESOURCES; 86f5788e042afbb93e693885e90609d552674f9bd2Ilia Mirkin goto err_unlock; 87f5788e042afbb93e693885e90609d552674f9bd2Ilia Mirkin } 88f5788e042afbb93e693885e90609d552674f9bd2Ilia Mirkin 893aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König res = pipe->screen->resource_create(pipe->screen, &res_tmpl); 903aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!res) { 91813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin ret = VDP_STATUS_RESOURCES; 92813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin goto err_unlock; 933aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König } 943aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 95379f46c8ac50b9b76455b1e62d6d541182339e96Christian König vlVdpDefaultSamplerViewTemplate(&sv_templ, res); 963aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ); 9705579339c0da442669ea75749651e8cf4f9ec39bChristian König 9805579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_resource_reference(&res, NULL); 9905579339c0da442669ea75749651e8cf4f9ec39bChristian König 1003aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!vlsurface->sampler_view) { 101813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin ret = VDP_STATUS_RESOURCES; 102813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin goto err_unlock; 1033aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König } 1043aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 105813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin pipe_mutex_unlock(dev->mutex); 106813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin 1073aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König *surface = vlAddDataHTAB(vlsurface); 1083aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (*surface == 0) { 109813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin pipe_mutex_lock(dev->mutex); 110813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin ret = VDP_STATUS_ERROR; 111813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin goto err_sampler; 1123aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König } 1133aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 1143aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_OK; 115813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin 116813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkinerr_sampler: 117813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin pipe_sampler_view_reference(&vlsurface->sampler_view, NULL); 118813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkinerr_unlock: 119813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin pipe_mutex_unlock(dev->mutex); 1206fb42ee7a632e181160ac4be234b30e50a1b91d5Christian König DeviceReference(&vlsurface->device, NULL); 121813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin FREE(vlsurface); 122813ce219c87bd40ebee1cd170b792e11971cb01dIlia Mirkin return ret; 1236ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen} 1246ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen 125fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 126fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpBitmapSurface. 127fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 1286ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus 12949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpBitmapSurfaceDestroy(VdpBitmapSurface surface) 1306ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{ 1313aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlVdpBitmapSurface *vlsurface; 1323aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 1333aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlsurface = vlGetDataHTAB(surface); 1343aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König if (!vlsurface) 1353aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_INVALID_HANDLE; 1363aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 13705579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(vlsurface->device->mutex); 1383aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König pipe_sampler_view_reference(&vlsurface->sampler_view, NULL); 13905579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurface->device->mutex); 1403aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 1413aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König vlRemoveDataHTAB(surface); 1426fb42ee7a632e181160ac4be234b30e50a1b91d5Christian König DeviceReference(&vlsurface->device, NULL); 1433aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König FREE(vlsurface); 1443aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König 1453aa087fa048dfda37ab247e2dbe4a809c2fac948Christian König return VDP_STATUS_OK; 1466ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen} 1476ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen 148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface. 150fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 1516ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus 15249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpBitmapSurfaceGetParameters(VdpBitmapSurface surface, 15349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpRGBAFormat *rgba_format, 15449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t *width, uint32_t *height, 15549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBool *frequently_accessed) 1566ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{ 1572ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König vlVdpBitmapSurface *vlsurface; 1582ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König struct pipe_resource *res; 1592ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König 1602ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König vlsurface = vlGetDataHTAB(surface); 1612ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König if (!vlsurface) 1622ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König return VDP_STATUS_INVALID_HANDLE; 1632ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König 16449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(rgba_format && width && height && frequently_accessed)) 16549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 16649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 1672ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König res = vlsurface->sampler_view->texture; 1682ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König *rgba_format = PipeToFormatRGBA(res->format); 1692ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König *width = res->width0; 1702ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König *height = res->height0; 1712ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König *frequently_accessed = res->usage == PIPE_USAGE_DYNAMIC; 1722ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König 1732ec6af0c638da5ebd196e8071630f09a5472b9e4Christian König return VDP_STATUS_OK; 1746ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen} 1756ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen 176fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 177fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Copy image data from application memory in the surface's native format to 178fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * a VdpBitmapSurface. 179fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 1806ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus 18149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpBitmapSurfacePutBitsNative(VdpBitmapSurface surface, 18249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König void const *const *source_data, 18349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t const *source_pitches, 184c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange VdpRect const *destination_rect) 1856ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{ 186e44731265dbfde75f955283f2f720a1917da120bChristian König vlVdpBitmapSurface *vlsurface; 187e44731265dbfde75f955283f2f720a1917da120bChristian König struct pipe_box dst_box; 188e44731265dbfde75f955283f2f720a1917da120bChristian König struct pipe_context *pipe; 189e44731265dbfde75f955283f2f720a1917da120bChristian König 190e44731265dbfde75f955283f2f720a1917da120bChristian König vlsurface = vlGetDataHTAB(surface); 191e44731265dbfde75f955283f2f720a1917da120bChristian König if (!vlsurface) 192e44731265dbfde75f955283f2f720a1917da120bChristian König return VDP_STATUS_INVALID_HANDLE; 193e44731265dbfde75f955283f2f720a1917da120bChristian König 194e44731265dbfde75f955283f2f720a1917da120bChristian König if (!(source_data && source_pitches)) 195c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange return VDP_STATUS_INVALID_POINTER; 19649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 197e44731265dbfde75f955283f2f720a1917da120bChristian König pipe = vlsurface->device->context; 198e44731265dbfde75f955283f2f720a1917da120bChristian König 19905579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(vlsurface->device->mutex); 20005579339c0da442669ea75749651e8cf4f9ec39bChristian König 201494e0025d995fb2cab04474d13880ee438b0c868Christian König dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture); 2021ffe77e7bb2486ea74cda077ed2a9622b758395cMarek Olšák pipe->texture_subdata(pipe, vlsurface->sampler_view->texture, 0, 2031ffe77e7bb2486ea74cda077ed2a9622b758395cMarek Olšák PIPE_TRANSFER_WRITE, &dst_box, *source_data, 2041ffe77e7bb2486ea74cda077ed2a9622b758395cMarek Olšák *source_pitches, 0); 20505579339c0da442669ea75749651e8cf4f9ec39bChristian König 20605579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurface->device->mutex); 20705579339c0da442669ea75749651e8cf4f9ec39bChristian König 208e44731265dbfde75f955283f2f720a1917da120bChristian König return VDP_STATUS_OK; 20949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König} 210