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