1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/************************************************************************** 25f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton * 3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton. 4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved. 55f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton * 6fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Permission is hereby granted, free of charge, to any person obtaining a 7fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * copy of this software and associated documentation files (the 8fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * "Software"), to deal in the Software without restriction, including 9fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * without limitation the rights to use, copy, modify, merge, publish, 10fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * distribute, sub license, and/or sell copies of the Software, and to 11fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * permit persons to whom the Software is furnished to do so, subject to 12fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * the following conditions: 135f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton * 14fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * The above copyright notice and this permission notice (including the 15fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * next paragraph) shall be included in all copies or substantial portions 16fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * of the Software. 17b922a0ce12916a91cfc3e56714913fcf63279ff2Christian König * 18fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 255f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton * 26fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton **************************************************************************/ 27fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton 28c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton#include <assert.h> 29b48676672592271597d07e5ece79cf4d3ffbe04bChristian König 302ef8c60e558938686196bf8ff4d22fd57903bf4cCooper Yuan#include <X11/Xlibint.h> 31e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <X11/extensions/XvMClib.h> 32b48676672592271597d07e5ece79cf4d3ffbe04bChristian König 337ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "pipe/p_screen.h" 347ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "pipe/p_video_decoder.h" 357ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "pipe/p_state.h" 36b48676672592271597d07e5ece79cf4d3ffbe04bChristian König 377ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "util/u_memory.h" 387ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "util/u_math.h" 397ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "util/u_format.h" 407ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "util/u_sampler.h" 417ea550621e25f9b2f344b2ed60551ceec91b3fcfKai Wasserbäch#include "util/u_rect.h" 42fc0a5e21d77ae2f082fd19dd2295e84f6fb7bd3bChristian König#include "vl/vl_winsys.h" 43b48676672592271597d07e5ece79cf4d3ffbe04bChristian König 445f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton#include "xvmc_private.h" 455f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 465f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton#define FOURCC_RGB 0x0000003 47c2e2b58a58880c9b9f189fc154205e99144e9502Christian König#define FOURCC_AI44 0x34344941 48c2e2b58a58880c9b9f189fc154205e99144e9502Christian König#define FOURCC_IA44 0x34344149 49c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 505eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Mantonstatic enum pipe_format XvIDToPipe(int xvimage_id) 515eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton{ 525eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton switch (xvimage_id) { 535eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton case FOURCC_RGB: 545eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return PIPE_FORMAT_B8G8R8X8_UNORM; 55a17788ac490744b631fc7dd47e94af3296895701Christian König 56a17788ac490744b631fc7dd47e94af3296895701Christian König case FOURCC_AI44: 578612235bbfbaafbe364f62e9355ffd683128e04bChristian König return PIPE_FORMAT_A4R4_UNORM; 588612235bbfbaafbe364f62e9355ffd683128e04bChristian König 59a17788ac490744b631fc7dd47e94af3296895701Christian König case FOURCC_IA44: 608612235bbfbaafbe364f62e9355ffd683128e04bChristian König return PIPE_FORMAT_R4A4_UNORM; 61a17788ac490744b631fc7dd47e94af3296895701Christian König 625eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton default: 635eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XVMC_MSG(XVMC_ERR, "[XvMC] Unrecognized Xv image ID 0x%08X.\n", xvimage_id); 645eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return PIPE_FORMAT_NONE; 655eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 665eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton} 675eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 68849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian Königstatic unsigned NumPaletteEntries4XvID(int xvimage_id) 69849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König{ 70849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König switch (xvimage_id) { 71849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König case FOURCC_RGB: 72849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return 0; 73849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 74849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König case FOURCC_AI44: 75849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König case FOURCC_IA44: 76849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return 16; 77849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 78849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König default: 79849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König XVMC_MSG(XVMC_ERR, "[XvMC] Unrecognized Xv image ID 0x%08X.\n", xvimage_id); 80849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return 0; 81849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König } 82849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König} 83849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 845eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Mantonstatic int PipeToComponentOrder(enum pipe_format format, char *component_order) 855eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton{ 865eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton assert(component_order); 875eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 885eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton switch (format) { 895eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton case PIPE_FORMAT_B8G8R8X8_UNORM: 905eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return 0; 91849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 928612235bbfbaafbe364f62e9355ffd683128e04bChristian König case PIPE_FORMAT_R4A4_UNORM: 938612235bbfbaafbe364f62e9355ffd683128e04bChristian König case PIPE_FORMAT_A4R4_UNORM: 9476d881b8b086495081c0a3c8fea2278f1480f107Christian König component_order[0] = 'Y'; 9576d881b8b086495081c0a3c8fea2278f1480f107Christian König component_order[1] = 'U'; 9676d881b8b086495081c0a3c8fea2278f1480f107Christian König component_order[2] = 'V'; 9776d881b8b086495081c0a3c8fea2278f1480f107Christian König component_order[3] = 'A'; 98849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return 4; 99849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 1005eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton default: 1015eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XVMC_MSG(XVMC_ERR, "[XvMC] Unrecognized PIPE_FORMAT 0x%08X.\n", format); 1025eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton component_order[0] = 0; 1035eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton component_order[1] = 0; 1045eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton component_order[2] = 0; 1055eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton component_order[3] = 0; 106849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return 0; 1075eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 1085eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton} 1095eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 1105eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Mantonstatic Status Validate(Display *dpy, XvPortID port, int surface_type_id, int xvimage_id) 1115eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton{ 1125eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XvImageFormatValues *subpictures; 1135eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton int num_subpics; 1145eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton unsigned int i; 1155eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 1165eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton subpictures = XvMCListSubpictureTypes(dpy, port, surface_type_id, &num_subpics); 1175eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (num_subpics < 1) { 1185eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (subpictures) 1195eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XFree(subpictures); 1205eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return BadMatch; 1215eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 1225eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (!subpictures) 1235eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return BadAlloc; 1245eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 1255eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton for (i = 0; i < num_subpics; ++i) { 1265eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (subpictures[i].id == xvimage_id) { 1275eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Found requested subpicture format.\n" \ 1285eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] port=%u\n" \ 1295eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] surface id=0x%08X\n" \ 1305eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] image id=0x%08X\n" \ 1315eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] type=%08X\n" \ 1325eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] byte order=%08X\n" \ 1335eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] bits per pixel=%u\n" \ 1345eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] format=%08X\n" \ 1355eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] num planes=%d\n", 1365eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton port, surface_type_id, xvimage_id, subpictures[i].type, subpictures[i].byte_order, 1375eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton subpictures[i].bits_per_pixel, subpictures[i].format, subpictures[i].num_planes); 1385eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (subpictures[i].type == XvRGB) { 1395eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] depth=%d\n" \ 1405eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] red mask=0x%08X\n" \ 1415eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] green mask=0x%08X\n" \ 1425eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] blue mask=0x%08X\n", 143a17788ac490744b631fc7dd47e94af3296895701Christian König subpictures[i].depth, subpictures[i].red_mask, 144a17788ac490744b631fc7dd47e94af3296895701Christian König subpictures[i].green_mask, subpictures[i].blue_mask); 1455eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 1465eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton else if (subpictures[i].type == XvYUV) { 1475eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] y sample bits=0x%08X\n" \ 1485eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] u sample bits=0x%08X\n" \ 1495eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] v sample bits=0x%08X\n" \ 1505eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] horz y period=%u\n" \ 1515eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] horz u period=%u\n" \ 1525eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] horz v period=%u\n" \ 1535eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] vert y period=%u\n" \ 1545eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] vert u period=%u\n" \ 1555eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton "[XvMC] vert v period=%u\n", 1565eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton subpictures[i].y_sample_bits, subpictures[i].u_sample_bits, subpictures[i].v_sample_bits, 1575eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton subpictures[i].horz_y_period, subpictures[i].horz_u_period, subpictures[i].horz_v_period, 1585eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton subpictures[i].vert_y_period, subpictures[i].vert_u_period, subpictures[i].vert_v_period); 1595eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 1605eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton break; 1615eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 1625eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton } 1635eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 1645eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton XFree(subpictures); 1655eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 1665eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return i < num_subpics ? Success : BadMatch; 1675eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton} 1685eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton 16910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian Königstatic void 17010fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian Königupload_sampler(struct pipe_context *pipe, struct pipe_sampler_view *dst, 17110fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König const struct pipe_box *dst_box, const void *src, unsigned src_stride, 17210fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König unsigned src_x, unsigned src_y) 17310fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König{ 17410fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_transfer *transfer; 17510fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König void *map; 17610fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 17710fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König transfer = pipe->get_transfer(pipe, dst->texture, 0, PIPE_TRANSFER_WRITE, dst_box); 17810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König if (!transfer) 17910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König return; 18010fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 18110fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König map = pipe->transfer_map(pipe, transfer); 18210fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König if (map) { 18310fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König util_copy_rect(map, dst->texture->format, transfer->stride, 0, 0, 18410fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König dst_box->width, dst_box->height, 18510fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König src, src_stride, src_x, src_y); 18610fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 18710fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König pipe->transfer_unmap(pipe, transfer); 18810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König } 18910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 19010fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König pipe->transfer_destroy(pipe, transfer); 19110fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König} 19210fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 1933107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 194e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCCreateSubpicture(Display *dpy, XvMCContext *context, XvMCSubpicture *subpicture, 195e44c85637a3298918e292e9ddba812856cf92924Younes Manton unsigned short width, unsigned short height, int xvimage_id) 196c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 1975f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton XvMCContextPrivate *context_priv; 19880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCSubpicturePrivate *subpicture_priv; 19910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_context *pipe; 2004a0b80f00dbc77d333027afd195daae7ef1e651cChristian König struct pipe_resource tex_templ, *tex; 2014a0b80f00dbc77d333027afd195daae7ef1e651cChristian König struct pipe_sampler_view sampler_templ; 2025eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton Status ret; 2035f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 2048580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Creating subpicture %p.\n", subpicture); 2058580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton 206e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 207e44c85637a3298918e292e9ddba812856cf92924Younes Manton 208e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!context) 209e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadContext; 210e44c85637a3298918e292e9ddba812856cf92924Younes Manton 2115f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton context_priv = context->privData; 2121448e829e86981e6144410ba6a3d0f16357fb2b3Christian König pipe = context_priv->pipe; 2135f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 2145f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton if (!subpicture) 2155f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton return XvMCBadSubpicture; 216e44c85637a3298918e292e9ddba812856cf92924Younes Manton 2175eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (width > context_priv->subpicture_max_width || 2185eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton height > context_priv->subpicture_max_height) 2195f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton return BadValue; 2205f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 2215eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton ret = Validate(dpy, context->port, context->surface_type_id, xvimage_id); 2225eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton if (ret != Success) 2235eb822cb6a8fb461ee5b1bd881e0ef1b91c432b5Younes Manton return ret; 224e44c85637a3298918e292e9ddba812856cf92924Younes Manton 22580468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton subpicture_priv = CALLOC(1, sizeof(XvMCSubpicturePrivate)); 2265f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton if (!subpicture_priv) 2275f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton return BadAlloc; 2285f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 2294a0b80f00dbc77d333027afd195daae7ef1e651cChristian König memset(&tex_templ, 0, sizeof(tex_templ)); 2304a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.target = PIPE_TEXTURE_2D; 2314a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.format = XvIDToPipe(xvimage_id); 2324a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.last_level = 0; 233ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König if (pipe->screen->get_video_param(pipe->screen, 234ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König PIPE_VIDEO_PROFILE_UNKNOWN, 235ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König PIPE_VIDEO_CAP_NPOT_TEXTURES)) { 2364a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.width0 = width; 2374a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.height0 = height; 2385f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton } 2395f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton else { 2404a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.width0 = util_next_power_of_two(width); 2414a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.height0 = util_next_power_of_two(height); 2425f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton } 2434a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.depth0 = 1; 2444a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.array_size = 1; 2454a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.usage = PIPE_USAGE_DYNAMIC; 2464a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.bind = PIPE_BIND_SAMPLER_VIEW; 2474a0b80f00dbc77d333027afd195daae7ef1e651cChristian König tex_templ.flags = 0; 2485f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 249ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König tex = pipe->screen->resource_create(pipe->screen, &tex_templ); 250772b25e1f366edc857e77b8c1ccdc5297d82cc41Christian König 2514a0b80f00dbc77d333027afd195daae7ef1e651cChristian König memset(&sampler_templ, 0, sizeof(sampler_templ)); 2523d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König u_sampler_view_default_template(&sampler_templ, tex, tex->format); 2533d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König 25410fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König subpicture_priv->sampler = pipe->create_sampler_view(pipe, tex, &sampler_templ); 255a8ea1dacc63ac567498049e5756c247b9fec6cd9Younes Manton pipe_resource_reference(&tex, NULL); 2564a0b80f00dbc77d333027afd195daae7ef1e651cChristian König if (!subpicture_priv->sampler) { 2575f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton FREE(subpicture_priv); 2585f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton return BadAlloc; 2595f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton } 260e44c85637a3298918e292e9ddba812856cf92924Younes Manton 2614a0b80f00dbc77d333027afd195daae7ef1e651cChristian König subpicture_priv->context = context; 262e44c85637a3298918e292e9ddba812856cf92924Younes Manton subpicture->subpicture_id = XAllocID(dpy); 263e44c85637a3298918e292e9ddba812856cf92924Younes Manton subpicture->context_id = context->context_id; 264e44c85637a3298918e292e9ddba812856cf92924Younes Manton subpicture->xvimage_id = xvimage_id; 265e44c85637a3298918e292e9ddba812856cf92924Younes Manton subpicture->width = width; 266e44c85637a3298918e292e9ddba812856cf92924Younes Manton subpicture->height = height; 267849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König subpicture->num_palette_entries = NumPaletteEntries4XvID(xvimage_id); 2684a0b80f00dbc77d333027afd195daae7ef1e651cChristian König subpicture->entry_bytes = PipeToComponentOrder(tex_templ.format, subpicture->component_order); 2695f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton subpicture->privData = subpicture_priv; 270e44c85637a3298918e292e9ddba812856cf92924Younes Manton 271849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König if (subpicture->num_palette_entries > 0) { 272849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König tex_templ.target = PIPE_TEXTURE_1D; 27341fa51a49a7c5d39d7ab273e44652efd0a5c8153Christian König tex_templ.format = PIPE_FORMAT_R8G8B8X8_UNORM; 274849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König tex_templ.width0 = subpicture->num_palette_entries; 275849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König tex_templ.height0 = 1; 276849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König tex_templ.usage = PIPE_USAGE_STATIC; 277849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 278ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König tex = pipe->screen->resource_create(pipe->screen, &tex_templ); 279849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 280849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König memset(&sampler_templ, 0, sizeof(sampler_templ)); 281849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König u_sampler_view_default_template(&sampler_templ, tex, tex->format); 28276d881b8b086495081c0a3c8fea2278f1480f107Christian König sampler_templ.swizzle_a = PIPE_SWIZZLE_ONE; 28310fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König subpicture_priv->palette = pipe->create_sampler_view(pipe, tex, &sampler_templ); 284849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König pipe_resource_reference(&tex, NULL); 285849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König if (!subpicture_priv->sampler) { 286849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König FREE(subpicture_priv); 287849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return BadAlloc; 288849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König } 289849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König } 290849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 291e44c85637a3298918e292e9ddba812856cf92924Younes Manton SyncHandle(); 292e44c85637a3298918e292e9ddba812856cf92924Younes Manton 2938580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Subpicture %p created.\n", subpicture); 2948580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton 295e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 296c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 297c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 2983107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 299e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCClearSubpicture(Display *dpy, XvMCSubpicture *subpicture, short x, short y, 300e44c85637a3298918e292e9ddba812856cf92924Younes Manton unsigned short width, unsigned short height, unsigned int color) 301c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 30280468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCSubpicturePrivate *subpicture_priv; 3035f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton XvMCContextPrivate *context_priv; 30410fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_context *pipe; 30510fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_sampler_view *dst; 3063d40d4f391e2fc319a03d8f171a2cfb9daf250c8Christian König struct pipe_box dst_box = {x, y, 0, width, height, 1}; 30710fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_transfer *transfer; 30810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König union util_color uc; 30910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König void *map; 31080468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 311e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 312e44c85637a3298918e292e9ddba812856cf92924Younes Manton 313e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 314e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 315b922a0ce12916a91cfc3e56714913fcf63279ff2Christian König 316d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen /* Convert color to float */ 317cd114a92b996c246bb35080bca611fca3f375e94Thomas Balling Sørensen util_format_read_4f(PIPE_FORMAT_B8G8R8A8_UNORM, 31810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König uc.f, 1, &color, 4, 319a17788ac490744b631fc7dd47e94af3296895701Christian König 0, 0, 1, 1); 320e44c85637a3298918e292e9ddba812856cf92924Younes Manton 3215f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton subpicture_priv = subpicture->privData; 3225f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton context_priv = subpicture_priv->context->privData; 3231448e829e86981e6144410ba6a3d0f16357fb2b3Christian König pipe = context_priv->pipe; 32410fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König dst = subpicture_priv->sampler; 325dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König 326e44c85637a3298918e292e9ddba812856cf92924Younes Manton /* TODO: Assert clear rect is within bounds? Or clip? */ 32710fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König transfer = pipe->get_transfer(pipe, dst->texture, 0, PIPE_TRANSFER_WRITE, &dst_box); 32810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König if (!transfer) 32910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König return XvMCBadSubpicture; 33010fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 33110fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König map = pipe->transfer_map(pipe, transfer); 33210fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König if (map) { 33310fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König util_fill_rect(map, dst->texture->format, transfer->stride, 0, 0, 33410fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König dst_box.width, dst_box.height, &uc); 33510fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 33610fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König pipe->transfer_unmap(pipe, transfer); 33710fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König } 33810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König 33910fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König pipe->transfer_destroy(pipe, transfer); 340e44c85637a3298918e292e9ddba812856cf92924Younes Manton 341e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 342c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 343c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 3443107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 345e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCCompositeSubpicture(Display *dpy, XvMCSubpicture *subpicture, XvImage *image, 346e44c85637a3298918e292e9ddba812856cf92924Younes Manton short srcx, short srcy, unsigned short width, unsigned short height, 347e44c85637a3298918e292e9ddba812856cf92924Younes Manton short dstx, short dsty) 348c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 34980468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCSubpicturePrivate *subpicture_priv; 35080468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCContextPrivate *context_priv; 35110fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_context *pipe; 352b9fe9665194899fc0a6336d876ab0596418c7287Younes Manton struct pipe_box dst_box = {dstx, dsty, 0, width, height, 1}; 35376d881b8b086495081c0a3c8fea2278f1480f107Christian König unsigned src_stride; 35480468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 35580468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Compositing subpicture %p.\n", subpicture); 35680468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 357e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 358e44c85637a3298918e292e9ddba812856cf92924Younes Manton 359e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 360e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 361e44c85637a3298918e292e9ddba812856cf92924Younes Manton 362e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(image); 363e44c85637a3298918e292e9ddba812856cf92924Younes Manton 364e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (subpicture->xvimage_id != image->id) 365e44c85637a3298918e292e9ddba812856cf92924Younes Manton return BadMatch; 366e44c85637a3298918e292e9ddba812856cf92924Younes Manton 36780468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton /* No planar support for now */ 36880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton if (image->num_planes != 1) 36980468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton return BadMatch; 37080468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 37180468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton subpicture_priv = subpicture->privData; 37280468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton context_priv = subpicture_priv->context->privData; 3731448e829e86981e6144410ba6a3d0f16357fb2b3Christian König pipe = context_priv->pipe; 37480468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 37576d881b8b086495081c0a3c8fea2278f1480f107Christian König /* clipping should be done by upload_sampler and regardles what the documentation 37676d881b8b086495081c0a3c8fea2278f1480f107Christian König says image->pitches[0] doesn't seems to be in bytes, so don't use it */ 37776d881b8b086495081c0a3c8fea2278f1480f107Christian König src_stride = image->width * util_format_get_blocksize(subpicture_priv->sampler->texture->format); 37810fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König upload_sampler(pipe, subpicture_priv->sampler, &dst_box, image->data, src_stride, srcx, srcy); 379e44c85637a3298918e292e9ddba812856cf92924Younes Manton 38080468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Subpicture %p composited.\n", subpicture); 38180468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 382e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 383c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 384c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 3853107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 386e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCDestroySubpicture(Display *dpy, XvMCSubpicture *subpicture) 387c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 38880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCSubpicturePrivate *subpicture_priv; 3895f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 3908580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Destroying subpicture %p.\n", subpicture); 3918580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton 392e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 393e44c85637a3298918e292e9ddba812856cf92924Younes Manton 394e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 395e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 396e44c85637a3298918e292e9ddba812856cf92924Younes Manton 3975f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton subpicture_priv = subpicture->privData; 3984a0b80f00dbc77d333027afd195daae7ef1e651cChristian König pipe_sampler_view_reference(&subpicture_priv->sampler, NULL); 399849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König pipe_sampler_view_reference(&subpicture_priv->palette, NULL); 4005f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton FREE(subpicture_priv); 4015f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton 4028580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Subpicture %p destroyed.\n", subpicture); 4038580b7a0eeed3fc29320b2c0a184084e4267661aYounes Manton 4045f730690f8166c94ee010605b6437a6fb2a7771dYounes Manton return Success; 405c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 406c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 4073107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 408e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCSetSubpicturePalette(Display *dpy, XvMCSubpicture *subpicture, unsigned char *palette) 409c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 410849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König XvMCSubpicturePrivate *subpicture_priv; 411849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König XvMCContextPrivate *context_priv; 41210fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König struct pipe_context *pipe; 413849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König struct pipe_box dst_box = {0, 0, 0, 0, 1, 1}; 414849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 415e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 416849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König assert(palette); 417e44c85637a3298918e292e9ddba812856cf92924Younes Manton 418e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 419e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 420e44c85637a3298918e292e9ddba812856cf92924Younes Manton 421849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König subpicture_priv = subpicture->privData; 422849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König context_priv = subpicture_priv->context->privData; 4231448e829e86981e6144410ba6a3d0f16357fb2b3Christian König pipe = context_priv->pipe; 424e44c85637a3298918e292e9ddba812856cf92924Younes Manton 425849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König dst_box.width = subpicture->num_palette_entries; 426849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 42710fd45114d4a7bbac4093755305ea5e4ba3ab6a5Christian König upload_sampler(pipe, subpicture_priv->palette, &dst_box, palette, 0, 0, 0); 428849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 429849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König XVMC_MSG(XVMC_TRACE, "[XvMC] Palette of Subpicture %p set.\n", subpicture); 430849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König 431849a0b0a821ecc59a50fe53498a6354cfd0b24a4Christian König return Success; 432c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 433c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 4343107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 435e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCBlendSubpicture(Display *dpy, XvMCSurface *target_surface, XvMCSubpicture *subpicture, 436e44c85637a3298918e292e9ddba812856cf92924Younes Manton short subx, short suby, unsigned short subw, unsigned short subh, 437e44c85637a3298918e292e9ddba812856cf92924Younes Manton short surfx, short surfy, unsigned short surfw, unsigned short surfh) 438c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 439d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König struct u_rect src_rect = {subx, subx + subw, suby, suby + subh}; 440d645dc65b6c5e7d46538e98208a703f0f7a5d20bChristian König struct u_rect dst_rect = {surfx, surfx + surfw, surfy, surfy + surfh}; 441efaf024f8c7c1000af06e54a85378818d55c5160Christian König 44280468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCSurfacePrivate *surface_priv; 44380468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XvMCSubpicturePrivate *subpicture_priv; 44480468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 44580468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton XVMC_MSG(XVMC_TRACE, "[XvMC] Associating subpicture %p with surface %p.\n", subpicture, target_surface); 44680468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 447e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 448e44c85637a3298918e292e9ddba812856cf92924Younes Manton 449e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!target_surface) 450e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSurface; 451e44c85637a3298918e292e9ddba812856cf92924Younes Manton 452e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 453e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 454e44c85637a3298918e292e9ddba812856cf92924Younes Manton 455e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (target_surface->context_id != subpicture->context_id) 456e44c85637a3298918e292e9ddba812856cf92924Younes Manton return BadMatch; 457e44c85637a3298918e292e9ddba812856cf92924Younes Manton 45880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton /* TODO: Verify against subpicture independent scaling */ 45980468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 46080468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton surface_priv = target_surface->privData; 46180468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton subpicture_priv = subpicture->privData; 46280468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 463e44c85637a3298918e292e9ddba812856cf92924Younes Manton /* TODO: Assert rects are within bounds? Or clip? */ 464efaf024f8c7c1000af06e54a85378818d55c5160Christian König subpicture_priv->src_rect = src_rect; 465efaf024f8c7c1000af06e54a85378818d55c5160Christian König subpicture_priv->dst_rect = dst_rect; 46680468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 46780468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton surface_priv->subpicture = subpicture; 46880468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton subpicture_priv->surface = target_surface; 46980468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 470e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 471c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 472c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 4733107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 474e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCBlendSubpicture2(Display *dpy, XvMCSurface *source_surface, XvMCSurface *target_surface, 475e44c85637a3298918e292e9ddba812856cf92924Younes Manton XvMCSubpicture *subpicture, short subx, short suby, unsigned short subw, unsigned short subh, 476e44c85637a3298918e292e9ddba812856cf92924Younes Manton short surfx, short surfy, unsigned short surfw, unsigned short surfh) 477c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 478e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 479e44c85637a3298918e292e9ddba812856cf92924Younes Manton 480e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!source_surface || !target_surface) 481e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSurface; 482e44c85637a3298918e292e9ddba812856cf92924Younes Manton 483e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 484e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 485e44c85637a3298918e292e9ddba812856cf92924Younes Manton 486e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (source_surface->context_id != subpicture->context_id) 487e44c85637a3298918e292e9ddba812856cf92924Younes Manton return BadMatch; 488e44c85637a3298918e292e9ddba812856cf92924Younes Manton 489e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (source_surface->context_id != subpicture->context_id) 490e44c85637a3298918e292e9ddba812856cf92924Younes Manton return BadMatch; 491e44c85637a3298918e292e9ddba812856cf92924Younes Manton 492e44c85637a3298918e292e9ddba812856cf92924Younes Manton /* TODO: Assert rects are within bounds? Or clip? */ 49380468464897682b8e10aeab310f20fdd7ddc6cb4Younes Manton 494e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 495c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 496c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 4973107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 498e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCSyncSubpicture(Display *dpy, XvMCSubpicture *subpicture) 499c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 500e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 501e44c85637a3298918e292e9ddba812856cf92924Younes Manton 502e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 503e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 504e44c85637a3298918e292e9ddba812856cf92924Younes Manton 505e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 506c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 507c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 5083107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 509e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCFlushSubpicture(Display *dpy, XvMCSubpicture *subpicture) 510c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 511e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 512e44c85637a3298918e292e9ddba812856cf92924Younes Manton 513e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 514e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 515e44c85637a3298918e292e9ddba812856cf92924Younes Manton 516e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 517c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton} 518c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 5193107b54b011c7ceef2b314632bdcf0b87c5e4d36Younes MantonPUBLIC 520e44c85637a3298918e292e9ddba812856cf92924Younes MantonStatus XvMCGetSubpictureStatus(Display *dpy, XvMCSubpicture *subpicture, int *status) 521c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton{ 522e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(dpy); 523c11a7ec821d41b91a3825c5abfb4687c98b5bf98Younes Manton 524e44c85637a3298918e292e9ddba812856cf92924Younes Manton if (!subpicture) 525e44c85637a3298918e292e9ddba812856cf92924Younes Manton return XvMCBadSubpicture; 526e44c85637a3298918e292e9ddba812856cf92924Younes Manton 527e44c85637a3298918e292e9ddba812856cf92924Younes Manton assert(status); 528e44c85637a3298918e292e9ddba812856cf92924Younes Manton 529e44c85637a3298918e292e9ddba812856cf92924Younes Manton /* TODO */ 530e44c85637a3298918e292e9ddba812856cf92924Younes Manton *status = 0; 531e44c85637a3298918e292e9ddba812856cf92924Younes Manton 532e44c85637a3298918e292e9ddba812856cf92924Younes Manton return Success; 533e44c85637a3298918e292e9ddba812856cf92924Younes Manton} 534