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