1228aa45fcbb65205937f74853801643d676db675Zack Rusin#include "xorg_tracker.h" 2228aa45fcbb65205937f74853801643d676db675Zack Rusin 3228aa45fcbb65205937f74853801643d676db675Zack Rusin#include <xf86xv.h> 4228aa45fcbb65205937f74853801643d676db675Zack Rusin#include <X11/extensions/Xv.h> 5228aa45fcbb65205937f74853801643d676db675Zack Rusin#include <fourcc.h> 6228aa45fcbb65205937f74853801643d676db675Zack Rusin 7319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "xorg_exa.h" 8319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "xorg_renderer.h" 9a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin#include "xorg_exa_tgsi.h" 10a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 11a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin#include "cso_cache/cso_context.h" 12ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger#include "util/u_sampler.h" 13319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 14319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "pipe/p_screen.h" 15319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 16228aa45fcbb65205937f74853801643d676db675Zack Rusin/*XXX get these from pipe's texture limits */ 17228aa45fcbb65205937f74853801643d676db675Zack Rusin#define IMAGE_MAX_WIDTH 2048 18228aa45fcbb65205937f74853801643d676db675Zack Rusin#define IMAGE_MAX_HEIGHT 2048 19228aa45fcbb65205937f74853801643d676db675Zack Rusin 20319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#define RES_720P_X 1280 21319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#define RES_720P_Y 720 22319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 23319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 24319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin/* The ITU-R BT.601 conversion matrix for SDTV. */ 252947d1420270476730711892909c3683bb6c5bffZack Rusin/* original, matrix, but we transpose it to 262947d1420270476730711892909c3683bb6c5bffZack Rusin * make the shader easier 27319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic const float bt_601[] = { 282947d1420270476730711892909c3683bb6c5bffZack Rusin 1.0, 0.0, 1.4075, , 296b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin 1.0, -0.3455, -0.7169, 0, 306b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin 1.0, 1.7790, 0., 0, 312947d1420270476730711892909c3683bb6c5bffZack Rusin};*/ 322947d1420270476730711892909c3683bb6c5bffZack Rusinstatic const float bt_601[] = { 332947d1420270476730711892909c3683bb6c5bffZack Rusin 1.0, 1.0, 1.0, 0.5, 342947d1420270476730711892909c3683bb6c5bffZack Rusin 0.0, -0.3455, 1.7790, 0, 352947d1420270476730711892909c3683bb6c5bffZack Rusin 1.4075, -0.7169, 0., 0, 36319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}; 37319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 38319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin/* The ITU-R BT.709 conversion matrix for HDTV. */ 392947d1420270476730711892909c3683bb6c5bffZack Rusin/* original, but we transpose to make the conversion 402947d1420270476730711892909c3683bb6c5bffZack Rusin * in the shader easier 41319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic const float bt_709[] = { 426b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin 1.0, 0.0, 1.581, 0, 436b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin 1.0, -0.1881, -0.47, 0, 446b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin 1.0, 1.8629, 0., 0, 452947d1420270476730711892909c3683bb6c5bffZack Rusin};*/ 462947d1420270476730711892909c3683bb6c5bffZack Rusinstatic const float bt_709[] = { 472947d1420270476730711892909c3683bb6c5bffZack Rusin 1.0, 1.0, 1.0, 0.5, 482947d1420270476730711892909c3683bb6c5bffZack Rusin 0.0, -0.1881, 1.8629, 0, 492947d1420270476730711892909c3683bb6c5bffZack Rusin 1.581,-0.47 , 0.0, 0, 50319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin}; 51319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 52228aa45fcbb65205937f74853801643d676db675Zack Rusin#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 53228aa45fcbb65205937f74853801643d676db675Zack Rusin 54228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic Atom xvBrightness, xvContrast; 55228aa45fcbb65205937f74853801643d676db675Zack Rusin 56228aa45fcbb65205937f74853801643d676db675Zack Rusin#define NUM_TEXTURED_ATTRIBUTES 2 57228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic XF86AttributeRec TexturedAttributes[NUM_TEXTURED_ATTRIBUTES] = { 58228aa45fcbb65205937f74853801643d676db675Zack Rusin {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"}, 59228aa45fcbb65205937f74853801643d676db675Zack Rusin {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"} 60228aa45fcbb65205937f74853801643d676db675Zack Rusin}; 61228aa45fcbb65205937f74853801643d676db675Zack Rusin 62228aa45fcbb65205937f74853801643d676db675Zack Rusin#define NUM_FORMATS 3 63228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic XF86VideoFormatRec Formats[NUM_FORMATS] = { 64228aa45fcbb65205937f74853801643d676db675Zack Rusin {15, TrueColor}, {16, TrueColor}, {24, TrueColor} 65228aa45fcbb65205937f74853801643d676db675Zack Rusin}; 66228aa45fcbb65205937f74853801643d676db675Zack Rusin 67228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic XF86VideoEncodingRec DummyEncoding[1] = { 68228aa45fcbb65205937f74853801643d676db675Zack Rusin { 69228aa45fcbb65205937f74853801643d676db675Zack Rusin 0, 70228aa45fcbb65205937f74853801643d676db675Zack Rusin "XV_IMAGE", 71228aa45fcbb65205937f74853801643d676db675Zack Rusin IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT, 72228aa45fcbb65205937f74853801643d676db675Zack Rusin {1, 1} 73228aa45fcbb65205937f74853801643d676db675Zack Rusin } 74228aa45fcbb65205937f74853801643d676db675Zack Rusin}; 75228aa45fcbb65205937f74853801643d676db675Zack Rusin 76fafc016e1f298cfea332124e9d64e8e010ee9c45Zack Rusin#define NUM_IMAGES 3 77228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic XF86ImageRec Images[NUM_IMAGES] = { 78228aa45fcbb65205937f74853801643d676db675Zack Rusin XVIMAGE_UYVY, 79228aa45fcbb65205937f74853801643d676db675Zack Rusin XVIMAGE_YUY2, 80fafc016e1f298cfea332124e9d64e8e010ee9c45Zack Rusin XVIMAGE_YV12, 81228aa45fcbb65205937f74853801643d676db675Zack Rusin}; 82228aa45fcbb65205937f74853801643d676db675Zack Rusin 83228aa45fcbb65205937f74853801643d676db675Zack Rusinstruct xorg_xv_port_priv { 84319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct xorg_renderer *r; 85319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 86228aa45fcbb65205937f74853801643d676db675Zack Rusin RegionRec clip; 874969d014e5d55985119874c8db7cb98154185802Zack Rusin 884969d014e5d55985119874c8db7cb98154185802Zack Rusin int brightness; 894969d014e5d55985119874c8db7cb98154185802Zack Rusin int contrast; 90319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 91319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int current_set; 92319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin /* juggle two sets of seperate Y, U and V 93319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin * textures */ 94287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *yuv[2][3]; 95ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view *yuv_views[2][3]; 96228aa45fcbb65205937f74853801643d676db675Zack Rusin}; 97228aa45fcbb65205937f74853801643d676db675Zack Rusin 98228aa45fcbb65205937f74853801643d676db675Zack Rusin 99228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic void 100228aa45fcbb65205937f74853801643d676db675Zack Rusinstop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown) 101228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 1024969d014e5d55985119874c8db7cb98154185802Zack Rusin struct xorg_xv_port_priv *priv = (struct xorg_xv_port_priv *)data; 1034969d014e5d55985119874c8db7cb98154185802Zack Rusin 1044969d014e5d55985119874c8db7cb98154185802Zack Rusin REGION_EMPTY(pScrn->pScreen, &priv->clip); 105228aa45fcbb65205937f74853801643d676db675Zack Rusin} 106228aa45fcbb65205937f74853801643d676db675Zack Rusin 107228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic int 108228aa45fcbb65205937f74853801643d676db675Zack Rusinset_port_attribute(ScrnInfoPtr pScrn, 109228aa45fcbb65205937f74853801643d676db675Zack Rusin Atom attribute, INT32 value, pointer data) 110228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 1114969d014e5d55985119874c8db7cb98154185802Zack Rusin struct xorg_xv_port_priv *priv = (struct xorg_xv_port_priv *)data; 1124969d014e5d55985119874c8db7cb98154185802Zack Rusin 1134969d014e5d55985119874c8db7cb98154185802Zack Rusin if (attribute == xvBrightness) { 1144969d014e5d55985119874c8db7cb98154185802Zack Rusin if ((value < -128) || (value > 127)) 1154969d014e5d55985119874c8db7cb98154185802Zack Rusin return BadValue; 1164969d014e5d55985119874c8db7cb98154185802Zack Rusin priv->brightness = value; 1174969d014e5d55985119874c8db7cb98154185802Zack Rusin } else if (attribute == xvContrast) { 1184969d014e5d55985119874c8db7cb98154185802Zack Rusin if ((value < 0) || (value > 255)) 1194969d014e5d55985119874c8db7cb98154185802Zack Rusin return BadValue; 1204969d014e5d55985119874c8db7cb98154185802Zack Rusin priv->contrast = value; 1214969d014e5d55985119874c8db7cb98154185802Zack Rusin } else 1224969d014e5d55985119874c8db7cb98154185802Zack Rusin return BadMatch; 1234969d014e5d55985119874c8db7cb98154185802Zack Rusin 1244969d014e5d55985119874c8db7cb98154185802Zack Rusin return Success; 125228aa45fcbb65205937f74853801643d676db675Zack Rusin} 126228aa45fcbb65205937f74853801643d676db675Zack Rusin 127228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic int 128228aa45fcbb65205937f74853801643d676db675Zack Rusinget_port_attribute(ScrnInfoPtr pScrn, 129228aa45fcbb65205937f74853801643d676db675Zack Rusin Atom attribute, INT32 * value, pointer data) 130228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 1314969d014e5d55985119874c8db7cb98154185802Zack Rusin struct xorg_xv_port_priv *priv = (struct xorg_xv_port_priv *)data; 1324969d014e5d55985119874c8db7cb98154185802Zack Rusin 1334969d014e5d55985119874c8db7cb98154185802Zack Rusin if (attribute == xvBrightness) 1344969d014e5d55985119874c8db7cb98154185802Zack Rusin *value = priv->brightness; 1354969d014e5d55985119874c8db7cb98154185802Zack Rusin else if (attribute == xvContrast) 1364969d014e5d55985119874c8db7cb98154185802Zack Rusin *value = priv->contrast; 1374969d014e5d55985119874c8db7cb98154185802Zack Rusin else 1384969d014e5d55985119874c8db7cb98154185802Zack Rusin return BadMatch; 1394969d014e5d55985119874c8db7cb98154185802Zack Rusin 1404969d014e5d55985119874c8db7cb98154185802Zack Rusin return Success; 141228aa45fcbb65205937f74853801643d676db675Zack Rusin} 142228aa45fcbb65205937f74853801643d676db675Zack Rusin 143228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic void 144228aa45fcbb65205937f74853801643d676db675Zack Rusinquery_best_size(ScrnInfoPtr pScrn, 145228aa45fcbb65205937f74853801643d676db675Zack Rusin Bool motion, 146228aa45fcbb65205937f74853801643d676db675Zack Rusin short vid_w, short vid_h, 147228aa45fcbb65205937f74853801643d676db675Zack Rusin short drw_w, short drw_h, 148228aa45fcbb65205937f74853801643d676db675Zack Rusin unsigned int *p_w, unsigned int *p_h, pointer data) 149228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 1504969d014e5d55985119874c8db7cb98154185802Zack Rusin if (vid_w > (drw_w << 1)) 1514969d014e5d55985119874c8db7cb98154185802Zack Rusin drw_w = vid_w >> 1; 1524969d014e5d55985119874c8db7cb98154185802Zack Rusin if (vid_h > (drw_h << 1)) 1534969d014e5d55985119874c8db7cb98154185802Zack Rusin drw_h = vid_h >> 1; 1544969d014e5d55985119874c8db7cb98154185802Zack Rusin 1554969d014e5d55985119874c8db7cb98154185802Zack Rusin *p_w = drw_w; 1564969d014e5d55985119874c8db7cb98154185802Zack Rusin *p_h = drw_h; 157228aa45fcbb65205937f74853801643d676db675Zack Rusin} 158228aa45fcbb65205937f74853801643d676db675Zack Rusin 159287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic INLINE struct pipe_resource * 160319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusincreate_component_texture(struct pipe_context *pipe, 161319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int width, int height) 162319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 163319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct pipe_screen *screen = pipe->screen; 164287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = 0; 165287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 166319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 167319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin memset(&templ, 0, sizeof(templ)); 168319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin templ.target = PIPE_TEXTURE_2D; 169319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin templ.format = PIPE_FORMAT_L8_UNORM; 170319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin templ.last_level = 0; 171d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger templ.width0 = width; 172d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger templ.height0 = height; 173d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger templ.depth0 = 1; 1744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger templ.array_size = 1; 175287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 176319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 177287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex = screen->resource_create(screen, &templ); 178319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 179319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return tex; 180319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 181319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 182319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic int 183319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusincheck_yuv_textures(struct xorg_xv_port_priv *priv, int width, int height) 184319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 185287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **dst = priv->yuv[priv->current_set]; 186ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view **dst_view = priv->yuv_views[priv->current_set]; 187ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view view_templ; 188ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_context *pipe = priv->r->pipe; 189ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger 190319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!dst[0] || 191d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[0]->width0 != width || 192d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[0]->height0 != height) { 193287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dst[0], NULL); 194ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&dst_view[0], NULL); 195319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 196319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!dst[1] || 197d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[1]->width0 != width || 198d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[1]->height0 != height) { 199287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dst[1], NULL); 200ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&dst_view[1], NULL); 201319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 202319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!dst[2] || 203d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[2]->width0 != width || 204d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[2]->height0 != height) { 205287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dst[2], NULL); 206ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&dst_view[2], NULL); 207319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 208319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 209ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[0]) { 210319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dst[0] = create_component_texture(priv->r->pipe, width, height); 211ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (dst[0]) { 212ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger u_sampler_view_default_template(&view_templ, 213ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[0], 214ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[0]->format); 215ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst_view[0] = pipe->create_sampler_view(pipe, dst[0], &view_templ); 216ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 217ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 218319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 219ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[1]) { 220319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dst[1] = create_component_texture(priv->r->pipe, width, height); 221ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (dst[1]) { 222ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger u_sampler_view_default_template(&view_templ, 223ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[1], 224ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[1]->format); 225ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst_view[1] = pipe->create_sampler_view(pipe, dst[1], &view_templ); 226ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 227ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 228319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 229ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[2]) { 230319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dst[2] = create_component_texture(priv->r->pipe, width, height); 231ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (dst[2]) { 232ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger u_sampler_view_default_template(&view_templ, 233ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[2], 234ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[2]->format); 235ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst_view[2] = pipe->create_sampler_view(pipe, dst[2], &view_templ); 236ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 237ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 238319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 239ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[0] || !dst[1] || !dst[2] || !dst_view[0] || !dst_view[1] || !dst_view[2] ) 240319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return BadAlloc; 241319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 242319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return Success; 243319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 244319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 245967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusinstatic int 246967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusinquery_image_attributes(ScrnInfoPtr pScrn, 247967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int id, 248967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin unsigned short *w, unsigned short *h, 249967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int *pitches, int *offsets) 250967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin{ 251967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int size, tmp; 252967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 253967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (*w > IMAGE_MAX_WIDTH) 254967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *w = IMAGE_MAX_WIDTH; 255967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (*h > IMAGE_MAX_HEIGHT) 256967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *h = IMAGE_MAX_HEIGHT; 257967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 258967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *w = (*w + 1) & ~1; 259967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (offsets) 260967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin offsets[0] = 0; 261967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 262967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin switch (id) { 263967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin case FOURCC_YV12: 264967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *h = (*h + 1) & ~1; 265967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size = (*w + 3) & ~3; 266967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (pitches) { 267967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin pitches[0] = size; 268967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 269967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size *= *h; 270967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (offsets) { 271967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin offsets[1] = size; 272967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 273967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin tmp = ((*w >> 1) + 3) & ~3; 274967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (pitches) { 275967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin pitches[1] = pitches[2] = tmp; 276967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 277967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin tmp *= (*h >> 1); 278967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size += tmp; 279967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (offsets) { 280967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin offsets[2] = size; 281967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 282967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size += tmp; 283967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin break; 284967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin case FOURCC_UYVY: 285967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin case FOURCC_YUY2: 286967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin default: 287967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size = *w << 1; 288967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (pitches) 289967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin pitches[0] = size; 290967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size *= *h; 291967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin break; 292967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 293967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 294967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin return size; 295967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin} 296967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 297319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void 298319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusincopy_packed_data(ScrnInfoPtr pScrn, 299319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct xorg_xv_port_priv *port, 300319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int id, 301319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin unsigned char *buf, 302319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int left, 303319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int top, 304967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin unsigned short w, unsigned short h) 305319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 306319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int i, j; 307287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **dst = port->yuv[port->current_set]; 308319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct pipe_transfer *ytrans, *utrans, *vtrans; 309475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell struct pipe_context *pipe = port->r->pipe; 310319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin char *ymap, *vmap, *umap; 311319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin unsigned char y1, y2, u, v; 312319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int yidx, uidx, vidx; 3130b069d648b787636cc57149f47a06fb16f7629abZack Rusin int y_array_size = w * h; 314319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 315287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ytrans = pipe_get_transfer(pipe, dst[0], 3164c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, 3174c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_WRITE, 3184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger left, top, w, h); 319287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell utrans = pipe_get_transfer(pipe, dst[1], 3204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, 3214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_WRITE, 3224c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger left, top, w, h); 323287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell vtrans = pipe_get_transfer(pipe, dst[2], 3244c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, 3254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_WRITE, 3264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger left, top, w, h); 327475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell 328475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell ymap = (char*)pipe->transfer_map(pipe, ytrans); 329475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell umap = (char*)pipe->transfer_map(pipe, utrans); 330475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell vmap = (char*)pipe->transfer_map(pipe, vtrans); 331319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 332b5fb60041edfa62c16e918829df22c4a52c09da9Zack Rusin yidx = uidx = vidx = 0; 333b5fb60041edfa62c16e918829df22c4a52c09da9Zack Rusin 334319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin switch (id) { 335319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin case FOURCC_YV12: { 336967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int pitches[3], offsets[3]; 337967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin unsigned char *y, *u, *v; 338967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin query_image_attributes(pScrn, FOURCC_YV12, 339967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin &w, &h, pitches, offsets); 340967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 341967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin y = buf + offsets[0]; 342967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin v = buf + offsets[1]; 343967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin u = buf + offsets[2]; 344967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin for (i = 0; i < h; ++i) { 345967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin for (j = 0; j < w; ++j) { 346967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int yoffset = (w*i+j); 347967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int ii = (i|1), jj = (j|1); 348967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int vuoffset = (w/2)*(ii/2) + (jj/2); 349967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin ymap[yidx++] = y[yoffset]; 350967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin umap[uidx++] = u[vuoffset]; 351967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin vmap[vidx++] = v[vuoffset]; 352319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 353319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 354319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 355319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin break; 3560b069d648b787636cc57149f47a06fb16f7629abZack Rusin case FOURCC_UYVY: 3570b069d648b787636cc57149f47a06fb16f7629abZack Rusin for (i = 0; i < y_array_size; i +=2 ) { 3580b069d648b787636cc57149f47a06fb16f7629abZack Rusin /* extracting two pixels */ 3590b069d648b787636cc57149f47a06fb16f7629abZack Rusin u = buf[0]; 3600b069d648b787636cc57149f47a06fb16f7629abZack Rusin y1 = buf[1]; 3610b069d648b787636cc57149f47a06fb16f7629abZack Rusin v = buf[2]; 3620b069d648b787636cc57149f47a06fb16f7629abZack Rusin y2 = buf[3]; 3630b069d648b787636cc57149f47a06fb16f7629abZack Rusin buf += 4; 3640b069d648b787636cc57149f47a06fb16f7629abZack Rusin 3650b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y1; 3660b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y2; 3670b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3680b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3690b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 3700b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 3710b069d648b787636cc57149f47a06fb16f7629abZack Rusin } 3720b069d648b787636cc57149f47a06fb16f7629abZack Rusin break; 373319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin case FOURCC_YUY2: 3740b069d648b787636cc57149f47a06fb16f7629abZack Rusin for (i = 0; i < y_array_size; i +=2 ) { 3750b069d648b787636cc57149f47a06fb16f7629abZack Rusin /* extracting two pixels */ 3760b069d648b787636cc57149f47a06fb16f7629abZack Rusin y1 = buf[0]; 3770b069d648b787636cc57149f47a06fb16f7629abZack Rusin u = buf[1]; 3780b069d648b787636cc57149f47a06fb16f7629abZack Rusin y2 = buf[2]; 3790b069d648b787636cc57149f47a06fb16f7629abZack Rusin v = buf[3]; 3800b069d648b787636cc57149f47a06fb16f7629abZack Rusin 3810b069d648b787636cc57149f47a06fb16f7629abZack Rusin buf += 4; 3820b069d648b787636cc57149f47a06fb16f7629abZack Rusin 3830b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y1; 3840b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y2; 3850b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3860b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3870b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 3880b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 389319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 390319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin break; 391319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin default: 392319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(!"Unsupported yuv format!"); 393319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin break; 394319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 395319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 396475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell pipe->transfer_unmap(pipe, ytrans); 397475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell pipe->transfer_unmap(pipe, utrans); 398475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell pipe->transfer_unmap(pipe, vtrans); 399287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, ytrans); 400287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, utrans); 401287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, vtrans); 402319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 403319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 404a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 405a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 406a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinsetup_fs_video_constants(struct xorg_renderer *r, boolean hdtv) 407319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 4086b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin const int param_bytes = 12 * sizeof(float); 409a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin const float *video_constants = (hdtv) ? bt_709 : bt_601; 410a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 411a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin renderer_set_constants(r, PIPE_SHADER_FRAGMENT, 412a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin video_constants, param_bytes); 413a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 414a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 415a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 416a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusindraw_yuv(struct xorg_xv_port_priv *port, 4177356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float src_x, float src_y, float src_w, float src_h, 418a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin int dst_x, int dst_y, int dst_w, int dst_h) 419a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 420287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **textures = port->yuv[port->current_set]; 421a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 422f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin /*debug_printf(" draw_yuv([%d, %d, %d ,%d], [%d, %d, %d, %d])\n", 423f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin src_x, src_y, src_w, src_h, 424f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin dst_x, dst_y, dst_w, dst_h);*/ 425a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin renderer_draw_yuv(port->r, 426a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin src_x, src_y, src_w, src_h, 427a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin dst_x, dst_y, dst_w, dst_h, 428a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin textures); 429a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 430a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 431a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 432a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinbind_blend_state(struct xorg_xv_port_priv *port) 433a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 434a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct pipe_blend_state blend; 435a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 436a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin memset(&blend, 0, sizeof(struct pipe_blend_state)); 437dbc0e24ab866ce8bdd974b52e050dd022620b146Roland Scheidegger blend.rt[0].blend_enable = 0; 43892676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 439a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 440a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin /* porter&duff src */ 44192676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 44292676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 44392676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 44492676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 445a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 446a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_blend(port->r->cso, &blend); 447a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 448a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 449a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 450a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 451a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinbind_shaders(struct xorg_xv_port_priv *port) 452a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 453a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin unsigned vs_traits = 0, fs_traits = 0; 454a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct xorg_shader shader; 455319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 456a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin vs_traits |= VS_YUV; 457a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin fs_traits |= FS_YUV; 458319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 459a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin shader = xorg_shaders_get(port->r->shaders, vs_traits, fs_traits); 460a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_vertex_shader_handle(port->r->cso, shader.vs); 461a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_fragment_shader_handle(port->r->cso, shader.fs); 462a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 463319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 464a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 465a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinbind_samplers(struct xorg_xv_port_priv *port) 466a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 467a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 468a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct pipe_sampler_state sampler; 469ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view **dst_views = port->yuv_views[port->current_set]; 470a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 471a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin memset(&sampler, 0, sizeof(struct pipe_sampler_state)); 472a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 473a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.wrap_s = PIPE_TEX_WRAP_CLAMP; 474a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.wrap_t = PIPE_TEX_WRAP_CLAMP; 475a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; 476a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; 477a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST; 478a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.normalized_coords = 1; 479a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 480a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin samplers[0] = &sampler; 481a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin samplers[1] = &sampler; 482a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin samplers[2] = &sampler; 483a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 484a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 485c61d3fe8bddcbcf750c5f057a45b262fea92ca5eBrian Paul cso_set_samplers(port->r->cso, PIPE_SHADER_FRAGMENT, 3, 486a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin (const struct pipe_sampler_state **)samplers); 487c61d3fe8bddcbcf750c5f057a45b262fea92ca5eBrian Paul cso_set_sampler_views(port->r->cso, PIPE_SHADER_FRAGMENT, 3, dst_views); 488319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 489319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 490319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic int 491319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusindisplay_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, 492319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin RegionPtr dstRegion, 493a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin int src_x, int src_y, int src_w, int src_h, 494a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin int dstX, int dstY, int dst_w, int dst_h, 495319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin PixmapPtr pPixmap) 496319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 497a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 498319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin BoxPtr pbox; 499319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int nbox; 500319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int dxo, dyo; 501319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin Bool hdtv; 502a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin int x, y, w, h; 503d880b64423d9eab7e6cbe3ad93dfefd6a9613cceZack Rusin struct exa_pixmap_priv *dst; 5043447d545d99c450c6a13d8a37e9cb9f5463a40ebZack Rusin struct pipe_surface *dst_surf = NULL; 505a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 506d880b64423d9eab7e6cbe3ad93dfefd6a9613cceZack Rusin exaMoveInPixmap(pPixmap); 507d880b64423d9eab7e6cbe3ad93dfefd6a9613cceZack Rusin dst = exaGetPixmapDriverPrivate(pPixmap); 508a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 509f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin /*debug_printf("display_video([%d, %d, %d, %d], [%d, %d, %d, %d])\n", 510f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin src_x, src_y, src_w, src_h, dstX, dstY, dst_w, dst_h);*/ 511f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin 51288aab56a26dd33a2d3177a41420f00473d7270afVinson Lee if (dst && !dst->tex) { 51310c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer xorg_exa_set_shared_usage(pPixmap); 51410c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer pScrn->pScreen->ModifyPixmapHeader(pPixmap, 0, 0, 0, 0, 0, NULL); 51510c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer } 51610c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer 517a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin if (!dst || !dst->tex) 518a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin XORG_FALLBACK("Xv destination %s", !dst ? "!dst" : "!dst->tex"); 519319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 5204c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dst_surf = xorg_gpu_surface(pPriv->r->pipe, dst); 521319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin hdtv = ((src_w >= RES_720P_X) && (src_h >= RES_720P_Y)); 522319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 5230301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom#ifdef COMPOSITE 524319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin REGION_TRANSLATE(pScrn->pScreen, dstRegion, -pPixmap->screen_x, 525319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin -pPixmap->screen_y); 5260301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom#endif 527319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 528319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dxo = dstRegion->extents.x1; 529319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dyo = dstRegion->extents.y1; 530319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 531319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pbox = REGION_RECTS(dstRegion); 532319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin nbox = REGION_NUM_RECTS(dstRegion); 533319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 5344236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell renderer_bind_destination(pPriv->r, dst_surf, 5354236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell dst_surf->width, dst_surf->height); 5364236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 537a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin bind_blend_state(pPriv); 538a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin bind_shaders(pPriv); 539a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin bind_samplers(pPriv); 540a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin setup_fs_video_constants(pPriv->r, hdtv); 541a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 54210c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer DamageDamageRegion(&pPixmap->drawable, dstRegion); 54310c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer 544319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin while (nbox--) { 545319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_x1 = pbox->x1; 546319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_y1 = pbox->y1; 547319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_x2 = pbox->x2; 548319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_y2 = pbox->y2; 549a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin float diff_x = (float)src_w / (float)dst_w; 550a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin float diff_y = (float)src_h / (float)dst_h; 5510301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom float offset_x = box_x1 - dstX; 5520301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom float offset_y = box_y1 - dstY; 5537356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float offset_w; 5547356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float offset_h; 555319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 5560301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom#ifdef COMPOSITE 5570301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom offset_x += pPixmap->screen_x; 5580301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom offset_y += pPixmap->screen_y; 5590301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom#endif 5600301c9ac6207f21bae9e35c7f0bc18ea12491162Thomas Hellstrom 561319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin x = box_x1; 562319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin y = box_y1; 563319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin w = box_x2 - box_x1; 564319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin h = box_y2 - box_y1; 565319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 566a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin offset_w = dst_w - w; 567a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin offset_h = dst_h - h; 568a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin 569f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin draw_yuv(pPriv, 5707356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom (float) src_x + offset_x*diff_x, (float) src_y + offset_y*diff_y, 5717356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom (float) src_w - offset_w*diff_x, (float) src_h - offset_h*diff_y, 572a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin x, y, w, h); 573a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 574319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pbox++; 575319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 57610c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer DamageRegionProcessPending(&pPixmap->drawable); 577a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 578ecfe1352ccce802c9299c76d600c4d2f33352701Keith Whitwell pipe_surface_reference(&dst_surf, NULL); 579ecfe1352ccce802c9299c76d600c4d2f33352701Keith Whitwell 580319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return TRUE; 581319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 582319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 583228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic int 584228aa45fcbb65205937f74853801643d676db675Zack Rusinput_image(ScrnInfoPtr pScrn, 585228aa45fcbb65205937f74853801643d676db675Zack Rusin short src_x, short src_y, 586228aa45fcbb65205937f74853801643d676db675Zack Rusin short drw_x, short drw_y, 587228aa45fcbb65205937f74853801643d676db675Zack Rusin short src_w, short src_h, 588228aa45fcbb65205937f74853801643d676db675Zack Rusin short drw_w, short drw_h, 589228aa45fcbb65205937f74853801643d676db675Zack Rusin int id, unsigned char *buf, 590228aa45fcbb65205937f74853801643d676db675Zack Rusin short width, short height, 591228aa45fcbb65205937f74853801643d676db675Zack Rusin Bool sync, RegionPtr clipBoxes, pointer data, 592228aa45fcbb65205937f74853801643d676db675Zack Rusin DrawablePtr pDraw) 593228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 594319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct xorg_xv_port_priv *pPriv = (struct xorg_xv_port_priv *) data; 5952bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 596319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin PixmapPtr pPixmap; 597319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin INT32 x1, x2, y1, y2; 598319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin BoxRec dstBox; 599319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int ret; 600319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 601319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin /* Clip */ 602319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin x1 = src_x; 603319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin x2 = src_x + src_w; 604319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin y1 = src_y; 605319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin y2 = src_y + src_h; 606319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 607319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.x1 = drw_x; 608319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.x2 = drw_x + drw_w; 609319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.y1 = drw_y; 610319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.y2 = drw_y + drw_h; 611319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 612319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2, clipBoxes, 613319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin width, height)) 614319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return Success; 615319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 616319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin ret = check_yuv_textures(pPriv, width, height); 617319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 618319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (ret) 619319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return ret; 620319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 621967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin copy_packed_data(pScrn, pPriv, id, buf, 622319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin src_x, src_y, width, height); 623319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 624319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (pDraw->type == DRAWABLE_WINDOW) { 625319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pPixmap = (*pScreen->GetWindowPixmap)((WindowPtr)pDraw); 626319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } else { 627319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pPixmap = (PixmapPtr)pDraw; 628319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 629319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 630a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin display_video(pScrn, pPriv, id, clipBoxes, 631a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin src_x, src_y, src_w, src_h, 632a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin drw_x, drw_y, 633a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin drw_w, drw_h, pPixmap); 634319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 635319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pPriv->current_set = (pPriv->current_set + 1) & 1; 636319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return Success; 637228aa45fcbb65205937f74853801643d676db675Zack Rusin} 638228aa45fcbb65205937f74853801643d676db675Zack Rusin 639228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic struct xorg_xv_port_priv * 640319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinport_priv_create(struct xorg_renderer *r) 641228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 642228aa45fcbb65205937f74853801643d676db675Zack Rusin struct xorg_xv_port_priv *priv = NULL; 643228aa45fcbb65205937f74853801643d676db675Zack Rusin 644228aa45fcbb65205937f74853801643d676db675Zack Rusin priv = calloc(1, sizeof(struct xorg_xv_port_priv)); 645228aa45fcbb65205937f74853801643d676db675Zack Rusin 646228aa45fcbb65205937f74853801643d676db675Zack Rusin if (!priv) 647228aa45fcbb65205937f74853801643d676db675Zack Rusin return NULL; 648228aa45fcbb65205937f74853801643d676db675Zack Rusin 649319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin priv->r = r; 650319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 6514969d014e5d55985119874c8db7cb98154185802Zack Rusin REGION_NULL(pScreen, &priv->clip); 652228aa45fcbb65205937f74853801643d676db675Zack Rusin 653319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(priv && priv->r); 654319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 655228aa45fcbb65205937f74853801643d676db675Zack Rusin return priv; 656228aa45fcbb65205937f74853801643d676db675Zack Rusin} 657228aa45fcbb65205937f74853801643d676db675Zack Rusin 658228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic XF86VideoAdaptorPtr 659228aa45fcbb65205937f74853801643d676db675Zack Rusinxorg_setup_textured_adapter(ScreenPtr pScreen) 660228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 6612bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 662319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 663228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86VideoAdaptorPtr adapt; 664228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86AttributePtr attrs; 665228aa45fcbb65205937f74853801643d676db675Zack Rusin DevUnion *dev_unions; 666228aa45fcbb65205937f74853801643d676db675Zack Rusin int nports = 16, i; 667228aa45fcbb65205937f74853801643d676db675Zack Rusin int nattributes; 668228aa45fcbb65205937f74853801643d676db675Zack Rusin 669228aa45fcbb65205937f74853801643d676db675Zack Rusin nattributes = NUM_TEXTURED_ATTRIBUTES; 670228aa45fcbb65205937f74853801643d676db675Zack Rusin 671319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(ms->exa); 672319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(ms->exa->renderer); 673319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 674228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt = calloc(1, sizeof(XF86VideoAdaptorRec)); 675228aa45fcbb65205937f74853801643d676db675Zack Rusin dev_unions = calloc(nports, sizeof(DevUnion)); 676228aa45fcbb65205937f74853801643d676db675Zack Rusin attrs = calloc(nattributes, sizeof(XF86AttributeRec)); 677228aa45fcbb65205937f74853801643d676db675Zack Rusin if (adapt == NULL || dev_unions == NULL || attrs == NULL) { 678228aa45fcbb65205937f74853801643d676db675Zack Rusin free(adapt); 679228aa45fcbb65205937f74853801643d676db675Zack Rusin free(dev_unions); 680228aa45fcbb65205937f74853801643d676db675Zack Rusin free(attrs); 681228aa45fcbb65205937f74853801643d676db675Zack Rusin return NULL; 682228aa45fcbb65205937f74853801643d676db675Zack Rusin } 683228aa45fcbb65205937f74853801643d676db675Zack Rusin 684228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->type = XvWindowMask | XvInputMask | XvImageMask; 685228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->flags = 0; 686228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->name = "Gallium3D Textured Video"; 687228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nEncodings = 1; 688228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pEncodings = DummyEncoding; 689228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nFormats = NUM_FORMATS; 690228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pFormats = Formats; 691228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nPorts = 0; 692228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pPortPrivates = dev_unions; 693228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nAttributes = nattributes; 694228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pAttributes = attrs; 695228aa45fcbb65205937f74853801643d676db675Zack Rusin memcpy(attrs, TexturedAttributes, nattributes * sizeof(XF86AttributeRec)); 696228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nImages = NUM_IMAGES; 697228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pImages = Images; 698228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->PutVideo = NULL; 699228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->PutStill = NULL; 700228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->GetVideo = NULL; 701228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->GetStill = NULL; 702228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->StopVideo = stop_video; 703228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->SetPortAttribute = set_port_attribute; 704228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->GetPortAttribute = get_port_attribute; 705228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->QueryBestSize = query_best_size; 706228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->PutImage = put_image; 707228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->QueryImageAttributes = query_image_attributes; 708228aa45fcbb65205937f74853801643d676db675Zack Rusin 709228aa45fcbb65205937f74853801643d676db675Zack Rusin for (i = 0; i < nports; i++) { 710228aa45fcbb65205937f74853801643d676db675Zack Rusin struct xorg_xv_port_priv *priv = 711319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin port_priv_create(ms->exa->renderer); 712228aa45fcbb65205937f74853801643d676db675Zack Rusin 713228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pPortPrivates[i].ptr = (pointer) (priv); 714228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nPorts++; 715228aa45fcbb65205937f74853801643d676db675Zack Rusin } 716228aa45fcbb65205937f74853801643d676db675Zack Rusin 717228aa45fcbb65205937f74853801643d676db675Zack Rusin return adapt; 718228aa45fcbb65205937f74853801643d676db675Zack Rusin} 719228aa45fcbb65205937f74853801643d676db675Zack Rusin 720228aa45fcbb65205937f74853801643d676db675Zack Rusinvoid 72126f9eeddf4cf783d7e5d5ac030a7ac5c1e67e60cJakob Bornecrantzxorg_xv_init(ScreenPtr pScreen) 722228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 7232bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 724228aa45fcbb65205937f74853801643d676db675Zack Rusin /*modesettingPtr ms = modesettingPTR(pScrn);*/ 725228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86VideoAdaptorPtr *adaptors, *new_adaptors = NULL; 726228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86VideoAdaptorPtr textured_adapter; 727228aa45fcbb65205937f74853801643d676db675Zack Rusin int num_adaptors; 728228aa45fcbb65205937f74853801643d676db675Zack Rusin 729228aa45fcbb65205937f74853801643d676db675Zack Rusin num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); 730228aa45fcbb65205937f74853801643d676db675Zack Rusin new_adaptors = malloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr *)); 731228aa45fcbb65205937f74853801643d676db675Zack Rusin if (new_adaptors == NULL) 732228aa45fcbb65205937f74853801643d676db675Zack Rusin return; 733228aa45fcbb65205937f74853801643d676db675Zack Rusin 734228aa45fcbb65205937f74853801643d676db675Zack Rusin memcpy(new_adaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); 735228aa45fcbb65205937f74853801643d676db675Zack Rusin adaptors = new_adaptors; 736228aa45fcbb65205937f74853801643d676db675Zack Rusin 737228aa45fcbb65205937f74853801643d676db675Zack Rusin /* Add the adaptors supported by our hardware. First, set up the atoms 738228aa45fcbb65205937f74853801643d676db675Zack Rusin * that will be used by both output adaptors. 739228aa45fcbb65205937f74853801643d676db675Zack Rusin */ 740228aa45fcbb65205937f74853801643d676db675Zack Rusin xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); 741228aa45fcbb65205937f74853801643d676db675Zack Rusin xvContrast = MAKE_ATOM("XV_CONTRAST"); 742228aa45fcbb65205937f74853801643d676db675Zack Rusin 743228aa45fcbb65205937f74853801643d676db675Zack Rusin textured_adapter = xorg_setup_textured_adapter(pScreen); 744228aa45fcbb65205937f74853801643d676db675Zack Rusin 745228aa45fcbb65205937f74853801643d676db675Zack Rusin debug_assert(textured_adapter); 746228aa45fcbb65205937f74853801643d676db675Zack Rusin 747228aa45fcbb65205937f74853801643d676db675Zack Rusin if (textured_adapter) { 748228aa45fcbb65205937f74853801643d676db675Zack Rusin adaptors[num_adaptors++] = textured_adapter; 749228aa45fcbb65205937f74853801643d676db675Zack Rusin } 750228aa45fcbb65205937f74853801643d676db675Zack Rusin 751228aa45fcbb65205937f74853801643d676db675Zack Rusin if (num_adaptors) { 752228aa45fcbb65205937f74853801643d676db675Zack Rusin xf86XVScreenInit(pScreen, adaptors, num_adaptors); 7538f26b59f53d6d80bf7d3c39a4dd3c438a2c305a4Maarten Lankhorst if (textured_adapter) 7548f26b59f53d6d80bf7d3c39a4dd3c438a2c305a4Maarten Lankhorst xorg_xvmc_init(pScreen, textured_adapter->name); 755228aa45fcbb65205937f74853801643d676db675Zack Rusin } else { 756228aa45fcbb65205937f74853801643d676db675Zack Rusin xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 757228aa45fcbb65205937f74853801643d676db675Zack Rusin "Disabling Xv because no adaptors could be initialized.\n"); 758228aa45fcbb65205937f74853801643d676db675Zack Rusin } 759228aa45fcbb65205937f74853801643d676db675Zack Rusin 760228aa45fcbb65205937f74853801643d676db675Zack Rusin free(adaptors); 761228aa45fcbb65205937f74853801643d676db675Zack Rusin} 762