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.
216ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen * IN NO EVENT SHALL TUNGSTEN GRAPHICS 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
28ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König#include <stdio.h>
296ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include <vdpau/vdpau.h>
305aa26412432dbdb3b1677d6d2f74bba010f443aeChristian König
3128f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_debug.h"
3228f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_memory.h"
336ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
345aa26412432dbdb3b1677d6d2f74bba010f443aeChristian König#include "vdpau_private.h"
356ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpPresentationQueue.
38fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
396ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueCreate(VdpDevice device,
4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                             VdpPresentationQueueTarget presentation_queue_target,
4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                             VdpPresentationQueue *presentation_queue)
436ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
4449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpPresentationQueue *pq = NULL;
456710e690f6ccd2c917d6a39be7d55a037470fccbChristian König   VdpStatus ret;
466710e690f6ccd2c917d6a39be7d55a037470fccbChristian König
4749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!presentation_queue)
4849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
4949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
5065fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   vlVdpDevice *dev = vlGetDataHTAB(device);
5165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   if (!dev)
5265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
5365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
5465fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   vlVdpPresentationQueueTarget *pqt = vlGetDataHTAB(presentation_queue_target);
5565fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   if (!pqt)
5649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
5749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
5849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (dev != pqt->device)
5949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
6065fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
6165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   pq = CALLOC(1, sizeof(vlVdpPresentationQueue));
6265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   if (!pq)
6365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen      return VDP_STATUS_RESOURCES;
6449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
656710e690f6ccd2c917d6a39be7d55a037470fccbChristian König   pq->device = dev;
66cae77aa80b3629a147ce3ae4526646014efae595Christian König   pq->drawable = pqt->drawable;
67e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
6805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(dev->mutex);
6932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   if (!vl_compositor_init_state(&pq->cstate, dev->context)) {
7005579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(dev->mutex);
716710e690f6ccd2c917d6a39be7d55a037470fccbChristian König      ret = VDP_STATUS_ERROR;
726710e690f6ccd2c917d6a39be7d55a037470fccbChristian König      goto no_compositor;
736710e690f6ccd2c917d6a39be7d55a037470fccbChristian König   }
7405579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(dev->mutex);
756710e690f6ccd2c917d6a39be7d55a037470fccbChristian König
7649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   *presentation_queue = vlAddDataHTAB(pq);
7765fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   if (*presentation_queue == 0) {
7865fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
7965fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen      goto no_handle;
8065fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen   }
8165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
8249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
83c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
8449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian Königno_handle:
856710e690f6ccd2c917d6a39be7d55a037470fccbChristian Königno_compositor:
8649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(pq);
8749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return ret;
886ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
896ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
90fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
91fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpPresentationQueue.
92fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
936ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
9449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueDestroy(VdpPresentationQueue presentation_queue)
956ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
9667d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König   vlVdpPresentationQueue *pq;
9767d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König
9867d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König   pq = vlGetDataHTAB(presentation_queue);
9967d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König   if (!pq)
10067d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König      return VDP_STATUS_INVALID_HANDLE;
10167d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König
10205579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(pq->device->mutex);
10332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   vl_compositor_cleanup_state(&pq->cstate);
10405579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(pq->device->mutex);
10567d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König
10667d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König   vlRemoveDataHTAB(presentation_queue);
10767d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König   FREE(pq);
10867d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König
10967d93ea940a9cac1645ce4d6bdc78c5aad812cb6Christian König   return VDP_STATUS_OK;
1106ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
1116ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
112fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
113fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Configure the background color setting.
114fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
1156ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
11649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueSetBackgroundColor(VdpPresentationQueue presentation_queue,
11749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                         VdpColor *const background_color)
1186ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
119cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König   vlVdpPresentationQueue *pq;
1206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   union pipe_color_union color;
121cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König
12249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!background_color)
12349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
12449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
125cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König   pq = vlGetDataHTAB(presentation_queue);
126cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König   if (!pq)
127cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König      return VDP_STATUS_INVALID_HANDLE;
128cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König
1296dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   color.f[0] = background_color->red;
1306dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   color.f[1] = background_color->green;
1316dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   color.f[2] = background_color->blue;
1326dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   color.f[3] = background_color->alpha;
1336dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie
13405579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(pq->device->mutex);
13532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   vl_compositor_set_clear_color(&pq->cstate, &color);
13605579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(pq->device->mutex);
137cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König
138cd13ec253ab8befed6ee9ece20ceebed9f73050fChristian König   return VDP_STATUS_OK;
1396ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
1406ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
141fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
142fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the current background color setting.
143fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
1446ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
14549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueGetBackgroundColor(VdpPresentationQueue presentation_queue,
14649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                         VdpColor *const background_color)
1476ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
14885534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange   vlVdpPresentationQueue *pq;
1496dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   union pipe_color_union color;
15085534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange
15149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!background_color)
15249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
15349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
15485534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange   pq = vlGetDataHTAB(presentation_queue);
15585534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange   if (!pq)
15685534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange      return VDP_STATUS_INVALID_HANDLE;
15785534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange
15805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(pq->device->mutex);
15932c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   vl_compositor_get_clear_color(&pq->cstate, &color);
16005579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(pq->device->mutex);
1616dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie
1626dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   background_color->red = color.f[0];
1636dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   background_color->green = color.f[1];
1646dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   background_color->blue = color.f[2];
1656dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie   background_color->alpha = color.f[3];
16685534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange
16785534e6f48c1ad6ff8dee77e0407c6c3dedb4b84Emeric Grange   return VDP_STATUS_OK;
1686ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
1696ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
170fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
171fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the presentation queue's "current" time.
172fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
1736ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
17449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueGetTime(VdpPresentationQueue presentation_queue,
17549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                              VdpTime *current_time)
1766ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
177e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   vlVdpPresentationQueue *pq;
178e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
17949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!current_time)
18049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
18149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
182e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   pq = vlGetDataHTAB(presentation_queue);
183e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (!pq)
184e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      return VDP_STATUS_INVALID_HANDLE;
185e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
18605579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(pq->device->mutex);
1871d0c357a9733238985cbe029b174173ef927ac70Christian König   *current_time = vl_screen_get_timestamp(pq->device->vscreen, pq->drawable);
18805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(pq->device->mutex);
189e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
190e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   return VDP_STATUS_OK;
1916ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
1926ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
193fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
194fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Enter a surface into the presentation queue.
195fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
1966ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
19749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue,
19849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                              VdpOutputSurface surface,
19949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                              uint32_t clip_width,
20049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                              uint32_t clip_height,
20149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                              VdpTime  earliest_presentation_time)
2026ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
203ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König   static int dump_window = -1;
204ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König
205cae77aa80b3629a147ce3ae4526646014efae595Christian König   vlVdpPresentationQueue *pq;
206cae77aa80b3629a147ce3ae4526646014efae595Christian König   vlVdpOutputSurface *surf;
207e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
208e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   struct pipe_context *pipe;
2091448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   struct pipe_resource *tex;
2101448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   struct pipe_surface surf_templ, *surf_draw;
211d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   struct u_rect src_rect, dst_clip, *dirty_area;
212cae77aa80b3629a147ce3ae4526646014efae595Christian König
21332c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   struct vl_compositor *compositor;
214f8ac7e034803a1c873bf156c012fede6d2640097Christian König   struct vl_compositor_state *cstate;
21532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König
216cae77aa80b3629a147ce3ae4526646014efae595Christian König   pq = vlGetDataHTAB(presentation_queue);
217cae77aa80b3629a147ce3ae4526646014efae595Christian König   if (!pq)
218cae77aa80b3629a147ce3ae4526646014efae595Christian König      return VDP_STATUS_INVALID_HANDLE;
219cae77aa80b3629a147ce3ae4526646014efae595Christian König
22005579339c0da442669ea75749651e8cf4f9ec39bChristian König   surf = vlGetDataHTAB(surface);
22105579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (!surf)
22205579339c0da442669ea75749651e8cf4f9ec39bChristian König      return VDP_STATUS_INVALID_HANDLE;
223f8ac7e034803a1c873bf156c012fede6d2640097Christian König
2241448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   pipe = pq->device->context;
22532c4381d4a0479b3d9bfe305ce701be6b5ac8e18Christian König   compositor = &pq->device->compositor;
226f8ac7e034803a1c873bf156c012fede6d2640097Christian König   cstate = &pq->cstate;
2271448e829e86981e6144410ba6a3d0f16357fb2b3Christian König
22805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(pq->device->mutex);
2291448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   tex = vl_screen_texture_from_drawable(pq->device->vscreen, pq->drawable);
23005579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (!tex) {
23105579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(pq->device->mutex);
232cae77aa80b3629a147ce3ae4526646014efae595Christian König      return VDP_STATUS_INVALID_HANDLE;
23305579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
234cae77aa80b3629a147ce3ae4526646014efae595Christian König
235c14c84f383309ee0fdf007c0d3e968c38f3af86eChristian König   dirty_area = vl_screen_get_dirty_area(pq->device->vscreen);
236c14c84f383309ee0fdf007c0d3e968c38f3af86eChristian König
2371448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   memset(&surf_templ, 0, sizeof(surf_templ));
2381448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   surf_templ.format = tex->format;
2391448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   surf_templ.usage = PIPE_BIND_RENDER_TARGET;
2401448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   surf_draw = pipe->create_surface(pipe, tex, &surf_templ);
2411448e829e86981e6144410ba6a3d0f16357fb2b3Christian König
242e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   surf->timestamp = (vlVdpTime)earliest_presentation_time;
243e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
244d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   dst_clip.x0 = 0;
245d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   dst_clip.y0 = 0;
246d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   dst_clip.x1 = clip_width ? clip_width : surf_draw->width;
247d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König   dst_clip.y1 = clip_height ? clip_height : surf_draw->height;
2486cf0581159a33f3dc10be38cdc7ab94d9cbacc1eEmeric Grange
249f8ac7e034803a1c873bf156c012fede6d2640097Christian König   if (pq->device->delayed_rendering.surface == surface &&
250f8ac7e034803a1c873bf156c012fede6d2640097Christian König       dst_clip.x1 == surf_draw->width && dst_clip.y1 == surf_draw->height) {
251f8ac7e034803a1c873bf156c012fede6d2640097Christian König
252f8ac7e034803a1c873bf156c012fede6d2640097Christian König      // TODO: we correctly support the clipping here, but not the pq background color in the clipped area....
253f8ac7e034803a1c873bf156c012fede6d2640097Christian König      cstate = pq->device->delayed_rendering.cstate;
254f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vl_compositor_set_dst_clip(cstate, &dst_clip);
255f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vlVdpResolveDelayedRendering(pq->device, surf_draw, dirty_area);
256f8ac7e034803a1c873bf156c012fede6d2640097Christian König
257f8ac7e034803a1c873bf156c012fede6d2640097Christian König   } else {
258f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vlVdpResolveDelayedRendering(pq->device, NULL, NULL);
259f8ac7e034803a1c873bf156c012fede6d2640097Christian König
260f8ac7e034803a1c873bf156c012fede6d2640097Christian König      src_rect.x0 = 0;
261f8ac7e034803a1c873bf156c012fede6d2640097Christian König      src_rect.y0 = 0;
262f8ac7e034803a1c873bf156c012fede6d2640097Christian König      src_rect.x1 = surf_draw->width;
263f8ac7e034803a1c873bf156c012fede6d2640097Christian König      src_rect.y1 = surf_draw->height;
264f8ac7e034803a1c873bf156c012fede6d2640097Christian König
265f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vl_compositor_clear_layers(cstate);
266f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vl_compositor_set_rgba_layer(cstate, compositor, 0, surf->sampler_view, &src_rect, NULL, NULL);
267f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vl_compositor_set_dst_clip(cstate, &dst_clip);
268f8ac7e034803a1c873bf156c012fede6d2640097Christian König      vl_compositor_render(cstate, compositor, surf_draw, dirty_area);
269f8ac7e034803a1c873bf156c012fede6d2640097Christian König   }
270e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
2711d0c357a9733238985cbe029b174173ef927ac70Christian König   vl_screen_set_next_timestamp(pq->device->vscreen, earliest_presentation_time);
272e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   pipe->screen->flush_frontbuffer
273cae77aa80b3629a147ce3ae4526646014efae595Christian König   (
2741448e829e86981e6144410ba6a3d0f16357fb2b3Christian König      pipe->screen, tex, 0, 0,
2751448e829e86981e6144410ba6a3d0f16357fb2b3Christian König      vl_screen_get_private(pq->device->vscreen)
276cae77aa80b3629a147ce3ae4526646014efae595Christian König   );
277cae77aa80b3629a147ce3ae4526646014efae595Christian König
278e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   pipe->screen->fence_reference(pipe->screen, &surf->fence, NULL);
279e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   pipe->flush(pipe, &surf->fence);
280e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
281c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange   if (dump_window == -1) {
282ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König      dump_window = debug_get_num_option("VDPAU_DUMP", 0);
283ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König   }
284ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König
285c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange   if (dump_window) {
286ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König      static unsigned int framenum = 0;
287ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König      char cmd[256];
288ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König
289f23a2cb5d2f8087cbf0537aa46e353955ae3a6a8Christian König      if (framenum) {
290f23a2cb5d2f8087cbf0537aa46e353955ae3a6a8Christian König         sprintf(cmd, "xwd -id %d -silent -out vdpau_frame_%08d.xwd", (int)pq->drawable, framenum);
291f23a2cb5d2f8087cbf0537aa46e353955ae3a6a8Christian König         if (system(cmd) != 0)
292f23a2cb5d2f8087cbf0537aa46e353955ae3a6a8Christian König            VDPAU_MSG(VDPAU_ERR, "[VDPAU] Dumping surface %d failed.\n", surface);
293f23a2cb5d2f8087cbf0537aa46e353955ae3a6a8Christian König      }
294f23a2cb5d2f8087cbf0537aa46e353955ae3a6a8Christian König      framenum++;
295ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König   }
296c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
2971448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   pipe_resource_reference(&tex, NULL);
2981448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   pipe_surface_reference(&surf_draw, NULL);
29905579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(pq->device->mutex);
300ffcf287aa227cfd1c0f928a3310d98554caf16cdChristian König
301cae77aa80b3629a147ce3ae4526646014efae595Christian König   return VDP_STATUS_OK;
3026ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
3036ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
304fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
305fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Wait for a surface to finish being displayed.
306fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
3076ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
30849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueBlockUntilSurfaceIdle(VdpPresentationQueue presentation_queue,
30949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                            VdpOutputSurface surface,
31049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                            VdpTime *first_presentation_time)
3116ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
312e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   vlVdpPresentationQueue *pq;
313e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   vlVdpOutputSurface *surf;
314e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   struct pipe_screen *screen;
315e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
31649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!first_presentation_time)
31749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
31849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
319e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   pq = vlGetDataHTAB(presentation_queue);
320e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (!pq)
321e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      return VDP_STATUS_INVALID_HANDLE;
322e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
323e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   surf = vlGetDataHTAB(surface);
324e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (!surf)
325e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      return VDP_STATUS_INVALID_HANDLE;
326e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
32705579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(pq->device->mutex);
328e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (surf->fence) {
3291448e829e86981e6144410ba6a3d0f16357fb2b3Christian König      screen = pq->device->vscreen->pscreen;
330e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      screen->fence_finish(screen, surf->fence, 0);
331e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   }
33205579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(pq->device->mutex);
333e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
3341d0c357a9733238985cbe029b174173ef927ac70Christian König   return vlVdpPresentationQueueGetTime(presentation_queue, first_presentation_time);
3356ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen}
3366ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
337fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
338fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Poll the current queue status of a surface.
339fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
3406ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenVdpStatus
34149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpPresentationQueueQuerySurfaceStatus(VdpPresentationQueue presentation_queue,
34249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                         VdpOutputSurface surface,
34349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                         VdpPresentationQueueStatus *status,
34449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                                         VdpTime *first_presentation_time)
3456ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen{
346e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   vlVdpPresentationQueue *pq;
347e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   vlVdpOutputSurface *surf;
348e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   struct pipe_screen *screen;
349e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
35049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(status && first_presentation_time))
35149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
35249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
353e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   pq = vlGetDataHTAB(presentation_queue);
354e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (!pq)
355e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      return VDP_STATUS_INVALID_HANDLE;
356e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
357e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   surf = vlGetDataHTAB(surface);
358e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (!surf)
359e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      return VDP_STATUS_INVALID_HANDLE;
360e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
361e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   *first_presentation_time = 0;
362e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
363e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   if (!surf->fence) {
364e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      *status = VDP_PRESENTATION_QUEUE_STATUS_IDLE;
365e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   } else {
36605579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_lock(pq->device->mutex);
3671448e829e86981e6144410ba6a3d0f16357fb2b3Christian König      screen = pq->device->vscreen->pscreen;
368e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      if (screen->fence_signalled(screen, surf->fence)) {
369e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange         screen->fence_reference(screen, &surf->fence, NULL);
370e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange         *status = VDP_PRESENTATION_QUEUE_STATUS_VISIBLE;
37124ca588ce66233a92e95dc70deb983c97dc24e55Christian König         pipe_mutex_unlock(pq->device->mutex);
372e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
373e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange         // We actually need to query the timestamp of the last VSYNC event from the hardware
374e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange         vlVdpPresentationQueueGetTime(presentation_queue, first_presentation_time);
375e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange         *first_presentation_time += 1;
376e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      } else {
377e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange         *status = VDP_PRESENTATION_QUEUE_STATUS_QUEUED;
37824ca588ce66233a92e95dc70deb983c97dc24e55Christian König         pipe_mutex_unlock(pq->device->mutex);
379e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange      }
380e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   }
381e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange
382e911dbb56374edf9f3b7c4cec0cf9a22738bb198Emeric Grange   return VDP_STATUS_OK;
38349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König}
384