xorg_xv.c revision 7356d1c140f2989df9e8645cf4b85962f27d0fca
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; 174287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 175319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 176287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell tex = screen->resource_create(screen, &templ); 177319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 178319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return tex; 179319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 180319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 181319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic int 182319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusincheck_yuv_textures(struct xorg_xv_port_priv *priv, int width, int height) 183319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 184287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **dst = priv->yuv[priv->current_set]; 185ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view **dst_view = priv->yuv_views[priv->current_set]; 186ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view view_templ; 187ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_context *pipe = priv->r->pipe; 188ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger 189319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!dst[0] || 190d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[0]->width0 != width || 191d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[0]->height0 != height) { 192287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dst[0], NULL); 193ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&dst_view[0], NULL); 194319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 195319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!dst[1] || 196d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[1]->width0 != width || 197d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[1]->height0 != height) { 198287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dst[1], NULL); 199ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&dst_view[1], NULL); 200319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 201319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!dst[2] || 202d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[2]->width0 != width || 203d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger dst[2]->height0 != height) { 204287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&dst[2], NULL); 205ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&dst_view[2], NULL); 206319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 207319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 208ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[0]) { 209319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dst[0] = create_component_texture(priv->r->pipe, width, height); 210ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (dst[0]) { 211ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger u_sampler_view_default_template(&view_templ, 212ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[0], 213ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[0]->format); 214ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst_view[0] = pipe->create_sampler_view(pipe, dst[0], &view_templ); 215ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 216ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 217319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 218ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[1]) { 219319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dst[1] = create_component_texture(priv->r->pipe, width, height); 220ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (dst[1]) { 221ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger u_sampler_view_default_template(&view_templ, 222ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[1], 223ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[1]->format); 224ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst_view[1] = pipe->create_sampler_view(pipe, dst[1], &view_templ); 225ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 226ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 227319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 228ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[2]) { 229319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dst[2] = create_component_texture(priv->r->pipe, width, height); 230ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (dst[2]) { 231ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger u_sampler_view_default_template(&view_templ, 232ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[2], 233ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst[2]->format); 234ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger dst_view[2] = pipe->create_sampler_view(pipe, dst[2], &view_templ); 235ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 236ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger } 237319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 238ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger if (!dst[0] || !dst[1] || !dst[2] || !dst_view[0] || !dst_view[1] || !dst_view[2] ) 239319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return BadAlloc; 240319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 241319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return Success; 242319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 243319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 244967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusinstatic int 245967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusinquery_image_attributes(ScrnInfoPtr pScrn, 246967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int id, 247967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin unsigned short *w, unsigned short *h, 248967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int *pitches, int *offsets) 249967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin{ 250967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int size, tmp; 251967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 252967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (*w > IMAGE_MAX_WIDTH) 253967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *w = IMAGE_MAX_WIDTH; 254967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (*h > IMAGE_MAX_HEIGHT) 255967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *h = IMAGE_MAX_HEIGHT; 256967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 257967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *w = (*w + 1) & ~1; 258967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (offsets) 259967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin offsets[0] = 0; 260967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 261967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin switch (id) { 262967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin case FOURCC_YV12: 263967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin *h = (*h + 1) & ~1; 264967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size = (*w + 3) & ~3; 265967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (pitches) { 266967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin pitches[0] = size; 267967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 268967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size *= *h; 269967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (offsets) { 270967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin offsets[1] = size; 271967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 272967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin tmp = ((*w >> 1) + 3) & ~3; 273967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (pitches) { 274967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin pitches[1] = pitches[2] = tmp; 275967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 276967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin tmp *= (*h >> 1); 277967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size += tmp; 278967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (offsets) { 279967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin offsets[2] = size; 280967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 281967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size += tmp; 282967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin break; 283967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin case FOURCC_UYVY: 284967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin case FOURCC_YUY2: 285967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin default: 286967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size = *w << 1; 287967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin if (pitches) 288967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin pitches[0] = size; 289967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin size *= *h; 290967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin break; 291967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin } 292967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 293967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin return size; 294967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin} 295967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 296319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic void 297319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusincopy_packed_data(ScrnInfoPtr pScrn, 298319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct xorg_xv_port_priv *port, 299319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int id, 300319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin unsigned char *buf, 301319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int left, 302319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int top, 303967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin unsigned short w, unsigned short h) 304319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 305319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int i, j; 306287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **dst = port->yuv[port->current_set]; 307319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct pipe_transfer *ytrans, *utrans, *vtrans; 308475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell struct pipe_context *pipe = port->r->pipe; 309319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin char *ymap, *vmap, *umap; 310319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin unsigned char y1, y2, u, v; 311319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int yidx, uidx, vidx; 3120b069d648b787636cc57149f47a06fb16f7629abZack Rusin int y_array_size = w * h; 313319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 314287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ytrans = pipe_get_transfer(pipe, dst[0], 315475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell 0, 0, 0, 316475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell PIPE_TRANSFER_WRITE, 317475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell left, top, w, h); 318287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell utrans = pipe_get_transfer(pipe, dst[1], 319475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell 0, 0, 0, 320475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell PIPE_TRANSFER_WRITE, 321475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell left, top, w, h); 322287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell vtrans = pipe_get_transfer(pipe, dst[2], 323475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell 0, 0, 0, 324475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell PIPE_TRANSFER_WRITE, 325475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell left, top, w, h); 326475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell 327475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell ymap = (char*)pipe->transfer_map(pipe, ytrans); 328475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell umap = (char*)pipe->transfer_map(pipe, utrans); 329475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell vmap = (char*)pipe->transfer_map(pipe, vtrans); 330319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 331b5fb60041edfa62c16e918829df22c4a52c09da9Zack Rusin yidx = uidx = vidx = 0; 332b5fb60041edfa62c16e918829df22c4a52c09da9Zack Rusin 333319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin switch (id) { 334319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin case FOURCC_YV12: { 335967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int pitches[3], offsets[3]; 336967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin unsigned char *y, *u, *v; 337967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin query_image_attributes(pScrn, FOURCC_YV12, 338967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin &w, &h, pitches, offsets); 339967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin 340967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin y = buf + offsets[0]; 341967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin v = buf + offsets[1]; 342967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin u = buf + offsets[2]; 343967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin for (i = 0; i < h; ++i) { 344967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin for (j = 0; j < w; ++j) { 345967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int yoffset = (w*i+j); 346967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int ii = (i|1), jj = (j|1); 347967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin int vuoffset = (w/2)*(ii/2) + (jj/2); 348967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin ymap[yidx++] = y[yoffset]; 349967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin umap[uidx++] = u[vuoffset]; 350967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin vmap[vidx++] = v[vuoffset]; 351319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 352319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 353319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 354319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin break; 3550b069d648b787636cc57149f47a06fb16f7629abZack Rusin case FOURCC_UYVY: 3560b069d648b787636cc57149f47a06fb16f7629abZack Rusin for (i = 0; i < y_array_size; i +=2 ) { 3570b069d648b787636cc57149f47a06fb16f7629abZack Rusin /* extracting two pixels */ 3580b069d648b787636cc57149f47a06fb16f7629abZack Rusin u = buf[0]; 3590b069d648b787636cc57149f47a06fb16f7629abZack Rusin y1 = buf[1]; 3600b069d648b787636cc57149f47a06fb16f7629abZack Rusin v = buf[2]; 3610b069d648b787636cc57149f47a06fb16f7629abZack Rusin y2 = buf[3]; 3620b069d648b787636cc57149f47a06fb16f7629abZack Rusin buf += 4; 3630b069d648b787636cc57149f47a06fb16f7629abZack Rusin 3640b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y1; 3650b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y2; 3660b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3670b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3680b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 3690b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 3700b069d648b787636cc57149f47a06fb16f7629abZack Rusin } 3710b069d648b787636cc57149f47a06fb16f7629abZack Rusin break; 372319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin case FOURCC_YUY2: 3730b069d648b787636cc57149f47a06fb16f7629abZack Rusin for (i = 0; i < y_array_size; i +=2 ) { 3740b069d648b787636cc57149f47a06fb16f7629abZack Rusin /* extracting two pixels */ 3750b069d648b787636cc57149f47a06fb16f7629abZack Rusin y1 = buf[0]; 3760b069d648b787636cc57149f47a06fb16f7629abZack Rusin u = buf[1]; 3770b069d648b787636cc57149f47a06fb16f7629abZack Rusin y2 = buf[2]; 3780b069d648b787636cc57149f47a06fb16f7629abZack Rusin v = buf[3]; 3790b069d648b787636cc57149f47a06fb16f7629abZack Rusin 3800b069d648b787636cc57149f47a06fb16f7629abZack Rusin buf += 4; 3810b069d648b787636cc57149f47a06fb16f7629abZack Rusin 3820b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y1; 3830b069d648b787636cc57149f47a06fb16f7629abZack Rusin ymap[yidx++] = y2; 3840b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3850b069d648b787636cc57149f47a06fb16f7629abZack Rusin umap[uidx++] = u; 3860b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 3870b069d648b787636cc57149f47a06fb16f7629abZack Rusin vmap[vidx++] = v; 388319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 389319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin break; 390319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin default: 391319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(!"Unsupported yuv format!"); 392319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin break; 393319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 394319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 395475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell pipe->transfer_unmap(pipe, ytrans); 396475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell pipe->transfer_unmap(pipe, utrans); 397475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell pipe->transfer_unmap(pipe, vtrans); 398287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, ytrans); 399287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, utrans); 400287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, vtrans); 401319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 402319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 403a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 404a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 405a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinsetup_fs_video_constants(struct xorg_renderer *r, boolean hdtv) 406319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 4076b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin const int param_bytes = 12 * sizeof(float); 408a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin const float *video_constants = (hdtv) ? bt_709 : bt_601; 409a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 410a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin renderer_set_constants(r, PIPE_SHADER_FRAGMENT, 411a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin video_constants, param_bytes); 412a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 413a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 414a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 415a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusindraw_yuv(struct xorg_xv_port_priv *port, 4167356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float src_x, float src_y, float src_w, float src_h, 417a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin int dst_x, int dst_y, int dst_w, int dst_h) 418a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 419287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **textures = port->yuv[port->current_set]; 420a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 421f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin /*debug_printf(" draw_yuv([%d, %d, %d ,%d], [%d, %d, %d, %d])\n", 422f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin src_x, src_y, src_w, src_h, 423f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin dst_x, dst_y, dst_w, dst_h);*/ 424a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin renderer_draw_yuv(port->r, 425a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin src_x, src_y, src_w, src_h, 426a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin dst_x, dst_y, dst_w, dst_h, 427a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin textures); 428a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 429a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 430a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 431a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinbind_blend_state(struct xorg_xv_port_priv *port) 432a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 433a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct pipe_blend_state blend; 434a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 435a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin memset(&blend, 0, sizeof(struct pipe_blend_state)); 436dbc0e24ab866ce8bdd974b52e050dd022620b146Roland Scheidegger blend.rt[0].blend_enable = 0; 43792676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].colormask = PIPE_MASK_RGBA; 438a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 439a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin /* porter&duff src */ 44092676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 44192676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 44292676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 44392676b9fe6356a8974830c47c0191d1ca57a0741Roland Scheidegger blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 444a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 445a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_blend(port->r->cso, &blend); 446a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 447a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 448a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 449a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 450a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinbind_shaders(struct xorg_xv_port_priv *port) 451a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 452a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin unsigned vs_traits = 0, fs_traits = 0; 453a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct xorg_shader shader; 454319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 455a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin vs_traits |= VS_YUV; 456a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin fs_traits |= FS_YUV; 457319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 458a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin shader = xorg_shaders_get(port->r->shaders, vs_traits, fs_traits); 459a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_vertex_shader_handle(port->r->cso, shader.vs); 460a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_fragment_shader_handle(port->r->cso, shader.fs); 461a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 462319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 463a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic INLINE void 464287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellconditional_flush(struct pipe_context *pipe, struct pipe_resource **tex, 465a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin int num) 466a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 467a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin int i; 468a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin for (i = 0; i < num; ++i) { 469287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (tex[i] && pipe->is_resource_referenced(pipe, tex[i], 0, 0) & 470a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin PIPE_REFERENCED_FOR_WRITE) { 471a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL); 472a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin return; 473a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin } 474319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 475a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin} 476a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 477a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinstatic void 478a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusinbind_samplers(struct xorg_xv_port_priv *port) 479a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin{ 480a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 481a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin struct pipe_sampler_state sampler; 482287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **dst = port->yuv[port->current_set]; 483ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger struct pipe_sampler_view **dst_views = port->yuv_views[port->current_set]; 484a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 485a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin memset(&sampler, 0, sizeof(struct pipe_sampler_state)); 486a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 487a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin conditional_flush(port->r->pipe, dst, 3); 488a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 489a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.wrap_s = PIPE_TEX_WRAP_CLAMP; 490a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.wrap_t = PIPE_TEX_WRAP_CLAMP; 491a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; 492a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; 493a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST; 494a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin sampler.normalized_coords = 1; 495a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 496a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin samplers[0] = &sampler; 497a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin samplers[1] = &sampler; 498a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin samplers[2] = &sampler; 499a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 500a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 501a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin cso_set_samplers(port->r->cso, 3, 502a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin (const struct pipe_sampler_state **)samplers); 503ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger cso_set_fragment_sampler_views(port->r->cso, 3, dst_views); 504319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 505319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 506319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstatic int 507319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusindisplay_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, 508319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin RegionPtr dstRegion, 509a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin int src_x, int src_y, int src_w, int src_h, 510a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin int dstX, int dstY, int dst_w, int dst_h, 511319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin PixmapPtr pPixmap) 512319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin{ 513a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 514319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin BoxPtr pbox; 515319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int nbox; 516319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int dxo, dyo; 517319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin Bool hdtv; 518a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin int x, y, w, h; 519d880b64423d9eab7e6cbe3ad93dfefd6a9613cceZack Rusin struct exa_pixmap_priv *dst; 5203447d545d99c450c6a13d8a37e9cb9f5463a40ebZack Rusin struct pipe_surface *dst_surf = NULL; 521a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 522d880b64423d9eab7e6cbe3ad93dfefd6a9613cceZack Rusin exaMoveInPixmap(pPixmap); 523d880b64423d9eab7e6cbe3ad93dfefd6a9613cceZack Rusin dst = exaGetPixmapDriverPrivate(pPixmap); 524a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 525f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin /*debug_printf("display_video([%d, %d, %d, %d], [%d, %d, %d, %d])\n", 526f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin src_x, src_y, src_w, src_h, dstX, dstY, dst_w, dst_h);*/ 527f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin 52888aab56a26dd33a2d3177a41420f00473d7270afVinson Lee if (dst && !dst->tex) { 52910c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer xorg_exa_set_shared_usage(pPixmap); 53010c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer pScrn->pScreen->ModifyPixmapHeader(pPixmap, 0, 0, 0, 0, 0, NULL); 53110c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer } 53210c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer 533a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin if (!dst || !dst->tex) 534a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin XORG_FALLBACK("Xv destination %s", !dst ? "!dst" : "!dst->tex"); 535319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 5363447d545d99c450c6a13d8a37e9cb9f5463a40ebZack Rusin dst_surf = xorg_gpu_surface(pPriv->r->pipe->screen, dst); 537319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin hdtv = ((src_w >= RES_720P_X) && (src_h >= RES_720P_Y)); 538319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 539319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin REGION_TRANSLATE(pScrn->pScreen, dstRegion, -pPixmap->screen_x, 540319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin -pPixmap->screen_y); 541319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 542319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dxo = dstRegion->extents.x1; 543319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dyo = dstRegion->extents.y1; 544319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 545319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pbox = REGION_RECTS(dstRegion); 546319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin nbox = REGION_NUM_RECTS(dstRegion); 547319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 5484236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell renderer_bind_destination(pPriv->r, dst_surf, 5494236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell dst_surf->width, dst_surf->height); 5504236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 551a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin bind_blend_state(pPriv); 552a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin bind_shaders(pPriv); 553a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin bind_samplers(pPriv); 554a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin setup_fs_video_constants(pPriv->r, hdtv); 555a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 55610c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer DamageDamageRegion(&pPixmap->drawable, dstRegion); 55710c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer 558319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin while (nbox--) { 559319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_x1 = pbox->x1; 560319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_y1 = pbox->y1; 561319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_x2 = pbox->x2; 562319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int box_y2 = pbox->y2; 563a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin float diff_x = (float)src_w / (float)dst_w; 564a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin float diff_y = (float)src_h / (float)dst_h; 5657356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float offset_x = box_x1 - dstX + pPixmap->screen_x; 5667356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float offset_y = box_y1 - dstY + pPixmap->screen_y; 5677356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float offset_w; 5687356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom float offset_h; 569319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 570319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin x = box_x1; 571319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin y = box_y1; 572319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin w = box_x2 - box_x1; 573319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin h = box_y2 - box_y1; 574319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 575a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin offset_w = dst_w - w; 576a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin offset_h = dst_h - h; 577a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin 578f88b43e8d09bf359e7d5770b133cb433b25f9848Zack Rusin draw_yuv(pPriv, 5797356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom (float) src_x + offset_x*diff_x, (float) src_y + offset_y*diff_y, 5807356d1c140f2989df9e8645cf4b85962f27d0fcaThomas Hellstrom (float) src_w - offset_w*diff_x, (float) src_h - offset_h*diff_y, 581a7fa56a64b8963e74e93f3bac8ac80813f4a9778Zack Rusin x, y, w, h); 582a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 583319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pbox++; 584319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 58510c67f938194a3b99ce2717318c77d86abc54933Michel Dänzer DamageRegionProcessPending(&pPixmap->drawable); 586a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin 587ecfe1352ccce802c9299c76d600c4d2f33352701Keith Whitwell pipe_surface_reference(&dst_surf, NULL); 588ecfe1352ccce802c9299c76d600c4d2f33352701Keith Whitwell 589319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return TRUE; 590319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin} 591319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 592228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic int 593228aa45fcbb65205937f74853801643d676db675Zack Rusinput_image(ScrnInfoPtr pScrn, 594228aa45fcbb65205937f74853801643d676db675Zack Rusin short src_x, short src_y, 595228aa45fcbb65205937f74853801643d676db675Zack Rusin short drw_x, short drw_y, 596228aa45fcbb65205937f74853801643d676db675Zack Rusin short src_w, short src_h, 597228aa45fcbb65205937f74853801643d676db675Zack Rusin short drw_w, short drw_h, 598228aa45fcbb65205937f74853801643d676db675Zack Rusin int id, unsigned char *buf, 599228aa45fcbb65205937f74853801643d676db675Zack Rusin short width, short height, 600228aa45fcbb65205937f74853801643d676db675Zack Rusin Bool sync, RegionPtr clipBoxes, pointer data, 601228aa45fcbb65205937f74853801643d676db675Zack Rusin DrawablePtr pDraw) 602228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 603319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin struct xorg_xv_port_priv *pPriv = (struct xorg_xv_port_priv *) data; 604319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; 605319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin PixmapPtr pPixmap; 606319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin INT32 x1, x2, y1, y2; 607319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin BoxRec dstBox; 608319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin int ret; 609319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 610319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin /* Clip */ 611319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin x1 = src_x; 612319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin x2 = src_x + src_w; 613319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin y1 = src_y; 614319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin y2 = src_y + src_h; 615319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 616319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.x1 = drw_x; 617319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.x2 = drw_x + drw_w; 618319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.y1 = drw_y; 619319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin dstBox.y2 = drw_y + drw_h; 620319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 621319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2, clipBoxes, 622319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin width, height)) 623319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return Success; 624319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 625319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin ret = check_yuv_textures(pPriv, width, height); 626319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 627319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (ret) 628319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return ret; 629319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 630967e6e20099ebd3a7f68f49233e6cf3c99ce3317Zack Rusin copy_packed_data(pScrn, pPriv, id, buf, 631319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin src_x, src_y, width, height); 632319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 633319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin if (pDraw->type == DRAWABLE_WINDOW) { 634319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pPixmap = (*pScreen->GetWindowPixmap)((WindowPtr)pDraw); 635319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } else { 636319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pPixmap = (PixmapPtr)pDraw; 637319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin } 638319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 639a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin display_video(pScrn, pPriv, id, clipBoxes, 640a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin src_x, src_y, src_w, src_h, 641a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin drw_x, drw_y, 642a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin drw_w, drw_h, pPixmap); 643319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 644319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin pPriv->current_set = (pPriv->current_set + 1) & 1; 645319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return Success; 646228aa45fcbb65205937f74853801643d676db675Zack Rusin} 647228aa45fcbb65205937f74853801643d676db675Zack Rusin 648228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic struct xorg_xv_port_priv * 649319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinport_priv_create(struct xorg_renderer *r) 650228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 651228aa45fcbb65205937f74853801643d676db675Zack Rusin struct xorg_xv_port_priv *priv = NULL; 652228aa45fcbb65205937f74853801643d676db675Zack Rusin 653228aa45fcbb65205937f74853801643d676db675Zack Rusin priv = calloc(1, sizeof(struct xorg_xv_port_priv)); 654228aa45fcbb65205937f74853801643d676db675Zack Rusin 655228aa45fcbb65205937f74853801643d676db675Zack Rusin if (!priv) 656228aa45fcbb65205937f74853801643d676db675Zack Rusin return NULL; 657228aa45fcbb65205937f74853801643d676db675Zack Rusin 658319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin priv->r = r; 659319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 6604969d014e5d55985119874c8db7cb98154185802Zack Rusin REGION_NULL(pScreen, &priv->clip); 661228aa45fcbb65205937f74853801643d676db675Zack Rusin 662319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(priv && priv->r); 663319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 664228aa45fcbb65205937f74853801643d676db675Zack Rusin return priv; 665228aa45fcbb65205937f74853801643d676db675Zack Rusin} 666228aa45fcbb65205937f74853801643d676db675Zack Rusin 667228aa45fcbb65205937f74853801643d676db675Zack Rusinstatic XF86VideoAdaptorPtr 668228aa45fcbb65205937f74853801643d676db675Zack Rusinxorg_setup_textured_adapter(ScreenPtr pScreen) 669228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 670319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 671319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 672228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86VideoAdaptorPtr adapt; 673228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86AttributePtr attrs; 674228aa45fcbb65205937f74853801643d676db675Zack Rusin DevUnion *dev_unions; 675228aa45fcbb65205937f74853801643d676db675Zack Rusin int nports = 16, i; 676228aa45fcbb65205937f74853801643d676db675Zack Rusin int nattributes; 677228aa45fcbb65205937f74853801643d676db675Zack Rusin 678228aa45fcbb65205937f74853801643d676db675Zack Rusin nattributes = NUM_TEXTURED_ATTRIBUTES; 679228aa45fcbb65205937f74853801643d676db675Zack Rusin 680319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(ms->exa); 681319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin debug_assert(ms->exa->renderer); 682319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin 683228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt = calloc(1, sizeof(XF86VideoAdaptorRec)); 684228aa45fcbb65205937f74853801643d676db675Zack Rusin dev_unions = calloc(nports, sizeof(DevUnion)); 685228aa45fcbb65205937f74853801643d676db675Zack Rusin attrs = calloc(nattributes, sizeof(XF86AttributeRec)); 686228aa45fcbb65205937f74853801643d676db675Zack Rusin if (adapt == NULL || dev_unions == NULL || attrs == NULL) { 687228aa45fcbb65205937f74853801643d676db675Zack Rusin free(adapt); 688228aa45fcbb65205937f74853801643d676db675Zack Rusin free(dev_unions); 689228aa45fcbb65205937f74853801643d676db675Zack Rusin free(attrs); 690228aa45fcbb65205937f74853801643d676db675Zack Rusin return NULL; 691228aa45fcbb65205937f74853801643d676db675Zack Rusin } 692228aa45fcbb65205937f74853801643d676db675Zack Rusin 693228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->type = XvWindowMask | XvInputMask | XvImageMask; 694228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->flags = 0; 695228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->name = "Gallium3D Textured Video"; 696228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nEncodings = 1; 697228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pEncodings = DummyEncoding; 698228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nFormats = NUM_FORMATS; 699228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pFormats = Formats; 700228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nPorts = 0; 701228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pPortPrivates = dev_unions; 702228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nAttributes = nattributes; 703228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pAttributes = attrs; 704228aa45fcbb65205937f74853801643d676db675Zack Rusin memcpy(attrs, TexturedAttributes, nattributes * sizeof(XF86AttributeRec)); 705228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nImages = NUM_IMAGES; 706228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pImages = Images; 707228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->PutVideo = NULL; 708228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->PutStill = NULL; 709228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->GetVideo = NULL; 710228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->GetStill = NULL; 711228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->StopVideo = stop_video; 712228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->SetPortAttribute = set_port_attribute; 713228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->GetPortAttribute = get_port_attribute; 714228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->QueryBestSize = query_best_size; 715228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->PutImage = put_image; 716228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->QueryImageAttributes = query_image_attributes; 717228aa45fcbb65205937f74853801643d676db675Zack Rusin 718228aa45fcbb65205937f74853801643d676db675Zack Rusin for (i = 0; i < nports; i++) { 719228aa45fcbb65205937f74853801643d676db675Zack Rusin struct xorg_xv_port_priv *priv = 720319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin port_priv_create(ms->exa->renderer); 721228aa45fcbb65205937f74853801643d676db675Zack Rusin 722228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->pPortPrivates[i].ptr = (pointer) (priv); 723228aa45fcbb65205937f74853801643d676db675Zack Rusin adapt->nPorts++; 724228aa45fcbb65205937f74853801643d676db675Zack Rusin } 725228aa45fcbb65205937f74853801643d676db675Zack Rusin 726228aa45fcbb65205937f74853801643d676db675Zack Rusin return adapt; 727228aa45fcbb65205937f74853801643d676db675Zack Rusin} 728228aa45fcbb65205937f74853801643d676db675Zack Rusin 729228aa45fcbb65205937f74853801643d676db675Zack Rusinvoid 73026f9eeddf4cf783d7e5d5ac030a7ac5c1e67e60cJakob Bornecrantzxorg_xv_init(ScreenPtr pScreen) 731228aa45fcbb65205937f74853801643d676db675Zack Rusin{ 732228aa45fcbb65205937f74853801643d676db675Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 733228aa45fcbb65205937f74853801643d676db675Zack Rusin /*modesettingPtr ms = modesettingPTR(pScrn);*/ 734228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86VideoAdaptorPtr *adaptors, *new_adaptors = NULL; 735228aa45fcbb65205937f74853801643d676db675Zack Rusin XF86VideoAdaptorPtr textured_adapter; 736228aa45fcbb65205937f74853801643d676db675Zack Rusin int num_adaptors; 737228aa45fcbb65205937f74853801643d676db675Zack Rusin 738228aa45fcbb65205937f74853801643d676db675Zack Rusin num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); 739228aa45fcbb65205937f74853801643d676db675Zack Rusin new_adaptors = malloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr *)); 740228aa45fcbb65205937f74853801643d676db675Zack Rusin if (new_adaptors == NULL) 741228aa45fcbb65205937f74853801643d676db675Zack Rusin return; 742228aa45fcbb65205937f74853801643d676db675Zack Rusin 743228aa45fcbb65205937f74853801643d676db675Zack Rusin memcpy(new_adaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); 744228aa45fcbb65205937f74853801643d676db675Zack Rusin adaptors = new_adaptors; 745228aa45fcbb65205937f74853801643d676db675Zack Rusin 746228aa45fcbb65205937f74853801643d676db675Zack Rusin /* Add the adaptors supported by our hardware. First, set up the atoms 747228aa45fcbb65205937f74853801643d676db675Zack Rusin * that will be used by both output adaptors. 748228aa45fcbb65205937f74853801643d676db675Zack Rusin */ 749228aa45fcbb65205937f74853801643d676db675Zack Rusin xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); 750228aa45fcbb65205937f74853801643d676db675Zack Rusin xvContrast = MAKE_ATOM("XV_CONTRAST"); 751228aa45fcbb65205937f74853801643d676db675Zack Rusin 752228aa45fcbb65205937f74853801643d676db675Zack Rusin textured_adapter = xorg_setup_textured_adapter(pScreen); 753228aa45fcbb65205937f74853801643d676db675Zack Rusin 754228aa45fcbb65205937f74853801643d676db675Zack Rusin debug_assert(textured_adapter); 755228aa45fcbb65205937f74853801643d676db675Zack Rusin 756228aa45fcbb65205937f74853801643d676db675Zack Rusin if (textured_adapter) { 757228aa45fcbb65205937f74853801643d676db675Zack Rusin adaptors[num_adaptors++] = textured_adapter; 758228aa45fcbb65205937f74853801643d676db675Zack Rusin } 759228aa45fcbb65205937f74853801643d676db675Zack Rusin 760228aa45fcbb65205937f74853801643d676db675Zack Rusin if (num_adaptors) { 761228aa45fcbb65205937f74853801643d676db675Zack Rusin xf86XVScreenInit(pScreen, adaptors, num_adaptors); 762228aa45fcbb65205937f74853801643d676db675Zack Rusin } else { 763228aa45fcbb65205937f74853801643d676db675Zack Rusin xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 764228aa45fcbb65205937f74853801643d676db675Zack Rusin "Disabling Xv because no adaptors could be initialized.\n"); 765228aa45fcbb65205937f74853801643d676db675Zack Rusin } 766228aa45fcbb65205937f74853801643d676db675Zack Rusin 767228aa45fcbb65205937f74853801643d676db675Zack Rusin free(adaptors); 768228aa45fcbb65205937f74853801643d676db675Zack Rusin} 769