1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Thomas Balling Sørensen. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christian König. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <vdpau/vdpau.h> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl/vl_csc.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vdpau_private.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a VdpOutputSurface. 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfaceCreate(VdpDevice device, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRGBAFormat rgba_format, 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t width, uint32_t height, 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpOutputSurface *surface) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource res_tmpl, *res; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view sv_templ; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface surf_templ; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface = NULL; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(width && height)) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_SIZE; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpDevice *dev = vlGetDataHTAB(device); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dev) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe = dev->context; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pipe) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = CALLOC(1, sizeof(vlVdpOutputSurface)); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_RESOURCES; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface->device = dev; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&res_tmpl, 0, sizeof(res_tmpl)); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.target = PIPE_TEXTURE_2D; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.format = FormatRGBAToPipe(rgba_format); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.width0 = width; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.height0 = height; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.depth0 = 1; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.array_size = 1; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.usage = PIPE_USAGE_STATIC; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(dev->mutex); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = pipe->screen->resource_create(pipe->screen, &res_tmpl); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!res) { 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dev->mutex); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dev); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_ERROR; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpDefaultSamplerViewTemplate(&sv_templ, res); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface->sampler_view) { 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&res, NULL); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dev->mutex); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dev); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_ERROR; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&surf_templ, 0, sizeof(surf_templ)); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_templ.format = res->format; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_templ.usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface->surface = pipe->create_surface(pipe, res, &surf_templ); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface->surface) { 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&res, NULL); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dev->mutex); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dev); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_ERROR; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *surface = vlAddDataHTAB(vlsurface); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*surface == 0) { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&res, NULL); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dev->mutex); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(dev); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_ERROR; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&res, NULL); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_init_state(&vlsurface->cstate, pipe); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_reset_dirty_area(&vlsurface->dirty_area); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dev->mutex); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy a VdpOutputSurface. 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfaceDestroy(VdpOutputSurface surface) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = vlGetDataHTAB(surface); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe = vlsurface->device->context; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(vlsurface->device->mutex); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&vlsurface->surface, NULL); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&vlsurface->sampler_view, NULL); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen->fence_reference(pipe->screen, &vlsurface->fence, NULL); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_cleanup_state(&vlsurface->cstate); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlRemoveDataHTAB(surface); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(vlsurface); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Retrieve the parameters used to create a VdpOutputSurface. 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfaceGetParameters(VdpOutputSurface surface, 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRGBAFormat *rgba_format, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *width, uint32_t *height) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = vlGetDataHTAB(surface); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rgba_format = PipeToFormatRGBA(vlsurface->sampler_view->texture->format); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = vlsurface->sampler_view->texture->width0; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = vlsurface->sampler_view->texture->height0; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy image data from a VdpOutputSurface to application memory in the 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * surface's native format. 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfaceGetBitsNative(VdpOutputSurface surface, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *source_rect, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *const *destination_data, 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t const *destination_pitches) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *map; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = vlGetDataHTAB(surface); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe = vlsurface->device->context; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pipe) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(vlsurface->device->mutex); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = vlsurface->sampler_view->texture; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box = RectToPipeBox(source_rect, res); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer = pipe->get_transfer(pipe, res, 0, PIPE_TRANSFER_READ, &box); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer == NULL) { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_RESOURCES; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe_transfer_map(pipe, transfer); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (map == NULL) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_destroy(pipe, transfer); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_RESOURCES; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_rect(*destination_data, res->format, *destination_pitches, 0, 0, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.width, box.height, map, transfer->stride, 0, 0); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_unmap(pipe, transfer); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer_destroy(pipe, transfer); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy image data from application memory in the surface's native format to 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a VdpOutputSurface. 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfacePutBitsNative(VdpOutputSurface surface, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void const *const *source_data, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t const *source_pitches, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *destination_rect) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box dst_box; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = vlGetDataHTAB(surface); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe = vlsurface->device->context; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pipe) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(vlsurface->device->mutex); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_inline_write(pipe, vlsurface->sampler_view->texture, 0, 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE, &dst_box, *source_data, 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *source_pitches, 0); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy image data from application memory in a specific indexed format to 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a VdpOutputSurface. 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfacePutBitsIndexed(VdpOutputSurface surface, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpIndexedFormat source_indexed_format, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void const *const *source_data, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t const *source_pitch, 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *destination_rect, 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpColorTableFormat color_table_format, 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void const *color_table) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *context; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *compositor; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor_state *cstate; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format index_format; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format colortbl_format; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res, res_tmpl; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view sv_tmpl; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *sv_idx = NULL, *sv_tbl = NULL; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect dst_rect; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = vlGetDataHTAB(surface); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context = vlsurface->device->context; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compositor = &vlsurface->device->compositor; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cstate = &vlsurface->cstate; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_format = FormatIndexedToPipe(source_indexed_format); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_format == PIPE_FORMAT_NONE) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_INDEXED_FORMAT; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!source_data || !source_pitch) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_POINTER; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colortbl_format = FormatColorTableToPipe(color_table_format); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (colortbl_format == PIPE_FORMAT_NONE) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_COLOR_TABLE_FORMAT; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!color_table) 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_POINTER; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&res_tmpl, 0, sizeof(res_tmpl)); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.target = PIPE_TEXTURE_2D; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.format = index_format; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (destination_rect) { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.width0 = abs(destination_rect->x0-destination_rect->x1); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.height0 = abs(destination_rect->y0-destination_rect->y1); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.width0 = vlsurface->surface->texture->width0; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.height0 = vlsurface->surface->texture->height0; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.depth0 = 1; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.array_size = 1; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.usage = PIPE_USAGE_STAGING; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(vlsurface->device->mutex); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = context->screen->resource_create(context->screen, &res_tmpl); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!res) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error_resource; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.x = box.y = box.z = 0; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.width = res->width0; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.height = res->height0; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.depth = res->depth0; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context->transfer_inline_write(context, res, 0, PIPE_TRANSFER_WRITE, &box, 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source_data[0], source_pitch[0], 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source_pitch[0] * res->height0); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sv_tmpl, 0, sizeof(sv_tmpl)); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&sv_tmpl, res, res->format); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sv_idx = context->create_sampler_view(context, res, &sv_tmpl); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&res, NULL); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sv_idx) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error_resource; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&res_tmpl, 0, sizeof(res_tmpl)); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.target = PIPE_TEXTURE_1D; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.format = colortbl_format; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.width0 = 1 << util_format_get_component_bits( 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_format, UTIL_FORMAT_COLORSPACE_RGB, 0); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.height0 = 1; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.depth0 = 1; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.array_size = 1; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.usage = PIPE_USAGE_STAGING; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = context->screen->resource_create(context->screen, &res_tmpl); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!res) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error_resource; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.x = box.y = box.z = 0; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.width = res->width0; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.height = res->height0; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.depth = res->depth0; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context->transfer_inline_write(context, res, 0, PIPE_TRANSFER_WRITE, &box, color_table, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_get_stride(colortbl_format, res->width0), 0); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sv_tmpl, 0, sizeof(sv_tmpl)); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&sv_tmpl, res, res->format); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sv_tbl = context->create_sampler_view(context, res, &sv_tmpl); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&res, NULL); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sv_tbl) 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error_resource; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_clear_layers(cstate); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_palette_layer(cstate, compositor, 0, sv_idx, sv_tbl, NULL, NULL, false); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_render(cstate, compositor, vlsurface->surface, NULL); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&sv_idx, NULL); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&sv_tbl, NULL); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror_resource: 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&sv_idx, NULL); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&sv_tbl, NULL); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_RESOURCES; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy image data from application memory in a specific YCbCr format to 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a VdpOutputSurface. 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfacePutBitsYCbCr(VdpOutputSurface surface, 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpYCbCrFormat source_ycbcr_format, 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void const *const *source_data, 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t const *source_pitches, 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *destination_rect, 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpCSCMatrix const *csc_matrix) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *vlsurface; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *compositor; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor_state *cstate; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_video_buffer vtmpl, *vbuffer; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect dst_rect; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **sampler_views; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlsurface = vlGetDataHTAB(surface); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vlsurface) 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe = vlsurface->device->context; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compositor = &vlsurface->device->compositor; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cstate = &vlsurface->cstate; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = FormatYCBCRToPipe(source_ycbcr_format); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == PIPE_FORMAT_NONE) 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_Y_CB_CR_FORMAT; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!source_data || !source_pitches) 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_POINTER; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(vlsurface->device->mutex); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&vtmpl, 0, sizeof(vtmpl)); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtmpl.buffer_format = format; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtmpl.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (destination_rect) { 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtmpl.width = abs(destination_rect->x0-destination_rect->x1); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtmpl.height = abs(destination_rect->y0-destination_rect->y1); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtmpl.width = vlsurface->surface->texture->width0; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtmpl.height = vlsurface->surface->texture->height0; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vbuffer = pipe->create_video_buffer(pipe, &vtmpl); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vbuffer) { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_RESOURCES; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler_views = vbuffer->get_sampler_view_planes(vbuffer); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sampler_views) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vbuffer->destroy(vbuffer); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_RESOURCES; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; ++i) { 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *sv = sampler_views[i]; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sv) continue; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box dst_box = { 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 0, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sv->texture->width0, sv->texture->height0, 1 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_inline_write(pipe, sv->texture, 0, PIPE_TRANSFER_WRITE, &dst_box, 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org source_data[i], source_pitches[i], 0); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!csc_matrix) { 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_csc_matrix csc; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, 1, &csc); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_csc_matrix(cstate, (const vl_csc_matrix*)&csc); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_csc_matrix(cstate, csc_matrix); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_clear_layers(cstate); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_buffer_layer(cstate, compositor, 0, vbuffer, NULL, NULL, VL_COMPOSITOR_WEAVE); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_render(cstate, compositor, vlsurface->surface, NULL); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vbuffer->destroy(vbuffer); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(vlsurface->device->mutex); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBlendFactorToPipe(VdpOutputSurfaceRenderBlendFactor factor) 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (factor) { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ZERO: 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_ZERO; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE: 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_ONE; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_COLOR: 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_SRC_COLOR; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_COLOR: 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_INV_SRC_COLOR; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_ALPHA: 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_SRC_ALPHA; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA: 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_INV_SRC_ALPHA; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_DST_ALPHA: 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_DST_ALPHA; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_DST_ALPHA: 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_INV_DST_ALPHA; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_DST_COLOR: 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_DST_COLOR; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_DST_COLOR: 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_INV_DST_COLOR; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_ALPHA_SATURATE: 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_CONSTANT_COLOR: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_CONST_COLOR; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR: 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_INV_CONST_COLOR; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_CONSTANT_ALPHA: 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_CONST_ALPHA; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA: 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_INV_CONST_ALPHA; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLENDFACTOR_ONE; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBlendEquationToPipe(VdpOutputSurfaceRenderBlendEquation equation) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (equation) { 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_SUBTRACT: 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLEND_SUBTRACT; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_REVERSE_SUBTRACT: 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLEND_REVERSE_SUBTRACT; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD: 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLEND_ADD; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_MIN: 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLEND_MIN; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_MAX: 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLEND_MAX; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_BLEND_ADD; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBlenderToPipe(struct pipe_context *context, 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpOutputSurfaceRenderBlendState const *blend_state) 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof blend); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.independent_blend_enable = 0; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend_state) { 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 1; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = BlendFactorToPipe(blend_state->blend_factor_source_color); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = BlendFactorToPipe(blend_state->blend_factor_destination_color); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = BlendFactorToPipe(blend_state->blend_factor_source_alpha); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = BlendFactorToPipe(blend_state->blend_factor_destination_alpha); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_func = BlendEquationToPipe(blend_state->blend_equation_color); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_func = BlendEquationToPipe(blend_state->blend_equation_alpha); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 0; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.logicop_enable = 0; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.logicop_func = PIPE_LOGICOP_CLEAR; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask = PIPE_MASK_RGBA; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.dither = 0; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return context->create_blend_state(context, &blend); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vertex4f * 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgColorsToPipe(VdpColor const *colors, uint32_t flags, struct vertex4f result[4]) 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex4f *dst = result; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!colors) 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; ++i) { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->x = colors->red; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->y = colors->green; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->z = colors->blue; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->w = colors->alpha; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++dst; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags & VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX) 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++colors; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return result; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Composite a sub-rectangle of a VdpOutputSurface into a sub-rectangle of 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * another VdpOutputSurface; Output Surface object VdpOutputSurface. 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfaceRenderOutputSurface(VdpOutputSurface destination_surface, 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *destination_rect, 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpOutputSurface source_surface, 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *source_rect, 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpColor const *colors, 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpOutputSurfaceRenderBlendState const *blend_state, 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t flags) 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *dst_vlsurface; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *src_vlsurface; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *context; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *compositor; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor_state *cstate; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect src_rect, dst_rect; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex4f vlcolors[4]; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *blend; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_vlsurface = vlGetDataHTAB(destination_surface); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst_vlsurface) 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_vlsurface = vlGetDataHTAB(source_surface); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!src_vlsurface) 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst_vlsurface->device != src_vlsurface->device) 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(dst_vlsurface->device->mutex); 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(dst_vlsurface->device, NULL, NULL); 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context = dst_vlsurface->device->context; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compositor = &dst_vlsurface->device->compositor; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cstate = &dst_vlsurface->cstate; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend = BlenderToPipe(context, blend_state); 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_clear_layers(cstate); 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_layer_blend(cstate, 0, blend, false); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_rgba_layer(cstate, compositor, 0, src_vlsurface->sampler_view, 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RectToPipe(source_rect, &src_rect), NULL, 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ColorsToPipe(colors, flags, vlcolors)); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_render(cstate, compositor, dst_vlsurface->surface, NULL); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context->delete_blend_state(context, blend); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dst_vlsurface->device->mutex); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Composite a sub-rectangle of a VdpBitmapSurface into a sub-rectangle of 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a VdpOutputSurface; Output Surface object VdpOutputSurface. 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVdpStatus 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvlVdpOutputSurfaceRenderBitmapSurface(VdpOutputSurface destination_surface, 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *destination_rect, 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpBitmapSurface source_surface, 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpRect const *source_rect, 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpColor const *colors, 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VdpOutputSurfaceRenderBlendState const *blend_state, 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t flags) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpOutputSurface *dst_vlsurface; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpBitmapSurface *src_vlsurface; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *context; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor *compositor; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vl_compositor_state *cstate; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect src_rect, dst_rect; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex4f vlcolors[4]; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *blend; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_vlsurface = vlGetDataHTAB(destination_surface); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst_vlsurface) 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_vlsurface = vlGetDataHTAB(source_surface); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!src_vlsurface) 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_INVALID_HANDLE; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst_vlsurface->device != src_vlsurface->device) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context = dst_vlsurface->device->context; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compositor = &dst_vlsurface->device->compositor; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cstate = &dst_vlsurface->cstate; 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(dst_vlsurface->device->mutex); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vlVdpResolveDelayedRendering(dst_vlsurface->device, NULL, NULL); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend = BlenderToPipe(context, blend_state); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_clear_layers(cstate); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_layer_blend(cstate, 0, blend, false); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_rgba_layer(cstate, compositor, 0, src_vlsurface->sampler_view, 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RectToPipe(source_rect, &src_rect), NULL, 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ColorsToPipe(colors, flags, vlcolors)); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect)); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_compositor_render(cstate, compositor, dst_vlsurface->surface, NULL); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context->delete_blend_state(context, blend); 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(dst_vlsurface->device->mutex); 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return VDP_STATUS_OK; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 735