1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_tracker.h" 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86xv.h> 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/Xv.h> 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <fourcc.h> 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_exa.h" 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_renderer.h" 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_exa_tgsi.h" 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h" 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*XXX get these from pipe's texture limits */ 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMAGE_MAX_WIDTH 2048 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMAGE_MAX_HEIGHT 2048 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RES_720P_X 1280 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RES_720P_Y 720 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* The ITU-R BT.601 conversion matrix for SDTV. */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* original, matrix, but we transpose it to 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * make the shader easier 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float bt_601[] = { 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, 0.0, 1.4075, , 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, -0.3455, -0.7169, 0, 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, 1.7790, 0., 0, 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};*/ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float bt_601[] = { 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, 1.0, 1.0, 0.5, 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0.0, -0.3455, 1.7790, 0, 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.4075, -0.7169, 0., 0, 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* The ITU-R BT.709 conversion matrix for HDTV. */ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* original, but we transpose to make the conversion 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the shader easier 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float bt_709[] = { 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, 0.0, 1.581, 0, 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, -0.1881, -0.47, 0, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, 1.8629, 0., 0, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};*/ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const float bt_709[] = { 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.0, 1.0, 1.0, 0.5, 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0.0, -0.1881, 1.8629, 0, 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1.581,-0.47 , 0.0, 0, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Atom xvBrightness, xvContrast; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_TEXTURED_ATTRIBUTES 2 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XF86AttributeRec TexturedAttributes[NUM_TEXTURED_ATTRIBUTES] = { 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"}, 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"} 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_FORMATS 3 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XF86VideoFormatRec Formats[NUM_FORMATS] = { 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {15, TrueColor}, {16, TrueColor}, {24, TrueColor} 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XF86VideoEncodingRec DummyEncoding[1] = { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "XV_IMAGE", 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT, 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {1, 1} 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_IMAGES 3 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XF86ImageRec Images[NUM_IMAGES] = { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVIMAGE_UYVY, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVIMAGE_YUY2, 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVIMAGE_YV12, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct xorg_xv_port_priv { 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_renderer *r; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RegionRec clip; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int brightness; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int contrast; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int current_set; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* juggle two sets of seperate Y, U and V 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * textures */ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *yuv[2][3]; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *yuv_views[2][3]; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *priv = (struct xorg_xv_port_priv *)data; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org REGION_EMPTY(pScrn->pScreen, &priv->clip); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_port_attribute(ScrnInfoPtr pScrn, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Atom attribute, INT32 value, pointer data) 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *priv = (struct xorg_xv_port_priv *)data; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attribute == xvBrightness) { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((value < -128) || (value > 127)) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BadValue; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->brightness = value; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (attribute == xvContrast) { 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((value < 0) || (value > 255)) 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BadValue; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->contrast = value; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BadMatch; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Success; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_port_attribute(ScrnInfoPtr pScrn, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Atom attribute, INT32 * value, pointer data) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *priv = (struct xorg_xv_port_priv *)data; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attribute == xvBrightness) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = priv->brightness; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (attribute == xvContrast) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = priv->contrast; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BadMatch; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Success; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgquery_best_size(ScrnInfoPtr pScrn, 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Bool motion, 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short vid_w, short vid_h, 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short drw_w, short drw_h, 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int *p_w, unsigned int *p_h, pointer data) 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vid_w > (drw_w << 1)) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drw_w = vid_w >> 1; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vid_h > (drw_h << 1)) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drw_h = vid_h >> 1; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *p_w = drw_w; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *p_h = drw_h; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct pipe_resource * 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_component_texture(struct pipe_context *pipe, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, int height) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = pipe->screen; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *tex = 0; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = PIPE_TEXTURE_2D; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = PIPE_FORMAT_L8_UNORM; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.last_level = 0; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = width; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = height; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = PIPE_BIND_SAMPLER_VIEW; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = screen->resource_create(screen, &templ); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tex; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_yuv_textures(struct xorg_xv_port_priv *priv, int width, int height) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource **dst = priv->yuv[priv->current_set]; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **dst_view = priv->yuv_views[priv->current_set]; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view view_templ; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = priv->r->pipe; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[0] || 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0]->width0 != width || 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0]->height0 != height) { 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&dst[0], NULL); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&dst_view[0], NULL); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[1] || 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1]->width0 != width || 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1]->height0 != height) { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&dst[1], NULL); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&dst_view[1], NULL); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[2] || 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2]->width0 != width || 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2]->height0 != height) { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&dst[2], NULL); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&dst_view[2], NULL); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[0]) { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = create_component_texture(priv->r->pipe, width, height); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst[0]) { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&view_templ, 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0], 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0]->format); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_view[0] = pipe->create_sampler_view(pipe, dst[0], &view_templ); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[1]) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = create_component_texture(priv->r->pipe, width, height); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst[1]) { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&view_templ, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1], 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1]->format); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_view[1] = pipe->create_sampler_view(pipe, dst[1], &view_templ); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[2]) { 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2] = create_component_texture(priv->r->pipe, width, height); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst[2]) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_sampler_view_default_template(&view_templ, 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2], 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2]->format); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_view[2] = pipe->create_sampler_view(pipe, dst[2], &view_templ); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst[0] || !dst[1] || !dst[2] || !dst_view[0] || !dst_view[1] || !dst_view[2] ) 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BadAlloc; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Success; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgquery_image_attributes(ScrnInfoPtr pScrn, 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int id, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned short *w, unsigned short *h, 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *pitches, int *offsets) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int size, tmp; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*w > IMAGE_MAX_WIDTH) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *w = IMAGE_MAX_WIDTH; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*h > IMAGE_MAX_HEIGHT) 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *h = IMAGE_MAX_HEIGHT; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *w = (*w + 1) & ~1; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offsets) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsets[0] = 0; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (id) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FOURCC_YV12: 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *h = (*h + 1) & ~1; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = (*w + 3) & ~3; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pitches) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitches[0] = size; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size *= *h; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offsets) { 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsets[1] = size; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = ((*w >> 1) + 3) & ~3; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pitches) { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitches[1] = pitches[2] = tmp; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp *= (*h >> 1); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size += tmp; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offsets) { 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsets[2] = size; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size += tmp; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FOURCC_UYVY: 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FOURCC_YUY2: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = *w << 1; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pitches) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitches[0] = size; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size *= *h; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return size; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopy_packed_data(ScrnInfoPtr pScrn, 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *port, 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int id, 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *buf, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int left, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int top, 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned short w, unsigned short h) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource **dst = port->yuv[port->current_set]; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *ytrans, *utrans, *vtrans; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = port->r->pipe; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *ymap, *vmap, *umap; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char y1, y2, u, v; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int yidx, uidx, vidx; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int y_array_size = w * h; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ytrans = pipe_get_transfer(pipe, dst[0], 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE, 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org left, top, w, h); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org utrans = pipe_get_transfer(pipe, dst[1], 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE, 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org left, top, w, h); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtrans = pipe_get_transfer(pipe, dst[2], 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org left, top, w, h); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymap = (char*)pipe->transfer_map(pipe, ytrans); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org umap = (char*)pipe->transfer_map(pipe, utrans); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vmap = (char*)pipe->transfer_map(pipe, vtrans); 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org yidx = uidx = vidx = 0; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (id) { 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FOURCC_YV12: { 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int pitches[3], offsets[3]; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *y, *u, *v; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query_image_attributes(pScrn, FOURCC_YV12, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &w, &h, pitches, offsets); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = buf + offsets[0]; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = buf + offsets[1]; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u = buf + offsets[2]; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < h; ++i) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < w; ++j) { 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int yoffset = (w*i+j); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ii = (i|1), jj = (j|1); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int vuoffset = (w/2)*(ii/2) + (jj/2); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymap[yidx++] = y[yoffset]; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org umap[uidx++] = u[vuoffset]; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vmap[vidx++] = v[vuoffset]; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FOURCC_UYVY: 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < y_array_size; i +=2 ) { 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* extracting two pixels */ 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u = buf[0]; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = buf[1]; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = buf[2]; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y2 = buf[3]; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf += 4; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymap[yidx++] = y1; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymap[yidx++] = y2; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org umap[uidx++] = u; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org umap[uidx++] = u; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vmap[vidx++] = v; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vmap[vidx++] = v; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FOURCC_YUY2: 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < y_array_size; i +=2 ) { 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* extracting two pixels */ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = buf[0]; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u = buf[1]; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y2 = buf[2]; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = buf[3]; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf += 4; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymap[yidx++] = y1; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymap[yidx++] = y2; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org umap[uidx++] = u; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org umap[uidx++] = u; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vmap[vidx++] = v; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vmap[vidx++] = v; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_assert(!"Unsupported yuv format!"); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, ytrans); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, utrans); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, vtrans); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, ytrans); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, utrans); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, vtrans); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsetup_fs_video_constants(struct xorg_renderer *r, boolean hdtv) 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int param_bytes = 12 * sizeof(float); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *video_constants = (hdtv) ? bt_709 : bt_601; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_set_constants(r, PIPE_SHADER_FRAGMENT, 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org video_constants, param_bytes); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_yuv(struct xorg_xv_port_priv *port, 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float src_x, float src_y, float src_w, float src_h, 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dst_x, int dst_y, int dst_w, int dst_h) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource **textures = port->yuv[port->current_set]; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*debug_printf(" draw_yuv([%d, %d, %d ,%d], [%d, %d, %d, %d])\n", 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_x, src_y, src_w, src_h, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_x, dst_y, dst_w, dst_h);*/ 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_draw_yuv(port->r, 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_x, src_y, src_w, src_h, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_x, dst_y, dst_w, dst_h, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textures); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbind_blend_state(struct xorg_xv_port_priv *port) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_blend_state blend; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&blend, 0, sizeof(struct pipe_blend_state)); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].blend_enable = 0; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].colormask = PIPE_MASK_RGBA; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* porter&duff src */ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_blend(port->r->cso, &blend); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbind_shaders(struct xorg_xv_port_priv *port) 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vs_traits = 0, fs_traits = 0; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_shader shader; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs_traits |= VS_YUV; 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fs_traits |= FS_YUV; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = xorg_shaders_get(port->r->shaders, vs_traits, fs_traits); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_vertex_shader_handle(port->r->cso, shader.vs); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_fragment_shader_handle(port->r->cso, shader.fs); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbind_samplers(struct xorg_xv_port_priv *port) 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state sampler; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **dst_views = port->yuv_views[port->current_set]; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sampler, 0, sizeof(struct pipe_sampler_state)); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_s = PIPE_TEX_WRAP_CLAMP; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.wrap_t = PIPE_TEX_WRAP_CLAMP; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler.normalized_coords = 1; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplers[0] = &sampler; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplers[1] = &sampler; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplers[2] = &sampler; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_samplers(port->r->cso, PIPE_SHADER_FRAGMENT, 3, 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (const struct pipe_sampler_state **)samplers); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_sampler_views(port->r->cso, PIPE_SHADER_FRAGMENT, 3, dst_views); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdisplay_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RegionPtr dstRegion, 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int src_x, int src_y, int src_w, int src_h, 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dstX, int dstY, int dst_w, int dst_h, 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PixmapPtr pPixmap) 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(pScrn); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BoxPtr pbox; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int nbox; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dxo, dyo; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Bool hdtv; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int x, y, w, h; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct exa_pixmap_priv *dst; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *dst_surf = NULL; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exaMoveInPixmap(pPixmap); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = exaGetPixmapDriverPrivate(pPixmap); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*debug_printf("display_video([%d, %d, %d, %d], [%d, %d, %d, %d])\n", 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_x, src_y, src_w, src_h, dstX, dstY, dst_w, dst_h);*/ 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst && !dst->tex) { 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xorg_exa_set_shared_usage(pPixmap); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pScrn->pScreen->ModifyPixmapHeader(pPixmap, 0, 0, 0, 0, 0, NULL); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst || !dst->tex) 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XORG_FALLBACK("Xv destination %s", !dst ? "!dst" : "!dst->tex"); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_surf = xorg_gpu_surface(pPriv->r->pipe, dst); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdtv = ((src_w >= RES_720P_X) && (src_h >= RES_720P_Y)); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef COMPOSITE 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org REGION_TRANSLATE(pScrn->pScreen, dstRegion, -pPixmap->screen_x, 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org -pPixmap->screen_y); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxo = dstRegion->extents.x1; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dyo = dstRegion->extents.y1; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbox = REGION_RECTS(dstRegion); 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nbox = REGION_NUM_RECTS(dstRegion); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderer_bind_destination(pPriv->r, dst_surf, 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_surf->width, dst_surf->height); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_blend_state(pPriv); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_shaders(pPriv); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_samplers(pPriv); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup_fs_video_constants(pPriv->r, hdtv); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DamageDamageRegion(&pPixmap->drawable, dstRegion); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (nbox--) { 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int box_x1 = pbox->x1; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int box_y1 = pbox->y1; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int box_x2 = pbox->x2; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int box_y2 = pbox->y2; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float diff_x = (float)src_w / (float)dst_w; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float diff_y = (float)src_h / (float)dst_h; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float offset_x = box_x1 - dstX; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float offset_y = box_y1 - dstY; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float offset_w; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float offset_h; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef COMPOSITE 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_x += pPixmap->screen_x; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_y += pPixmap->screen_y; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x = box_x1; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = box_y1; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org w = box_x2 - box_x1; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = box_y2 - box_y1; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_w = dst_w - w; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset_h = dst_h - h; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_yuv(pPriv, 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (float) src_x + offset_x*diff_x, (float) src_y + offset_y*diff_y, 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (float) src_w - offset_w*diff_x, (float) src_h - offset_h*diff_y, 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, w, h); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbox++; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DamageRegionProcessPending(&pPixmap->drawable); 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&dst_surf, NULL); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgput_image(ScrnInfoPtr pScrn, 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short src_x, short src_y, 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short drw_x, short drw_y, 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short src_w, short src_h, 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short drw_w, short drw_h, 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int id, unsigned char *buf, 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short width, short height, 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Bool sync, RegionPtr clipBoxes, pointer data, 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DrawablePtr pDraw) 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *pPriv = (struct xorg_xv_port_priv *) data; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PixmapPtr pPixmap; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT32 x1, x2, y1, y2; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BoxRec dstBox; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ret; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Clip */ 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1 = src_x; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x2 = src_x + src_w; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y1 = src_y; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y2 = src_y + src_h; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstBox.x1 = drw_x; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstBox.x2 = drw_x + drw_w; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstBox.y1 = drw_y; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstBox.y2 = drw_y + drw_h; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2, clipBoxes, 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height)) 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Success; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = check_yuv_textures(pPriv, width, height); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copy_packed_data(pScrn, pPriv, id, buf, 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_x, src_y, width, height); 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pDraw->type == DRAWABLE_WINDOW) { 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pPixmap = (*pScreen->GetWindowPixmap)((WindowPtr)pDraw); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pPixmap = (PixmapPtr)pDraw; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org display_video(pScrn, pPriv, id, clipBoxes, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_x, src_y, src_w, src_h, 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drw_x, drw_y, 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drw_w, drw_h, pPixmap); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pPriv->current_set = (pPriv->current_set + 1) & 1; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Success; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct xorg_xv_port_priv * 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgport_priv_create(struct xorg_renderer *r) 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *priv = NULL; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv = calloc(1, sizeof(struct xorg_xv_port_priv)); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!priv) 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org priv->r = r; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org REGION_NULL(pScreen, &priv->clip); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_assert(priv && priv->r); 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return priv; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XF86VideoAdaptorPtr 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_setup_textured_adapter(ScreenPtr pScreen) 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(pScrn); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XF86VideoAdaptorPtr adapt; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XF86AttributePtr attrs; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DevUnion *dev_unions; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int nports = 16, i; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int nattributes; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nattributes = NUM_TEXTURED_ATTRIBUTES; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_assert(ms->exa); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_assert(ms->exa->renderer); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt = calloc(1, sizeof(XF86VideoAdaptorRec)); 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dev_unions = calloc(nports, sizeof(DevUnion)); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs = calloc(nattributes, sizeof(XF86AttributeRec)); 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (adapt == NULL || dev_unions == NULL || attrs == NULL) { 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(adapt); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dev_unions); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(attrs); 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->type = XvWindowMask | XvInputMask | XvImageMask; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->flags = 0; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->name = "Gallium3D Textured Video"; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->nEncodings = 1; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->pEncodings = DummyEncoding; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->nFormats = NUM_FORMATS; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->pFormats = Formats; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->nPorts = 0; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->pPortPrivates = dev_unions; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->nAttributes = nattributes; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->pAttributes = attrs; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(attrs, TexturedAttributes, nattributes * sizeof(XF86AttributeRec)); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->nImages = NUM_IMAGES; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->pImages = Images; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->PutVideo = NULL; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->PutStill = NULL; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->GetVideo = NULL; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->GetStill = NULL; 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->StopVideo = stop_video; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->SetPortAttribute = set_port_attribute; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->GetPortAttribute = get_port_attribute; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->QueryBestSize = query_best_size; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->PutImage = put_image; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->QueryImageAttributes = query_image_attributes; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nports; i++) { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xorg_xv_port_priv *priv = 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org port_priv_create(ms->exa->renderer); 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->pPortPrivates[i].ptr = (pointer) (priv); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adapt->nPorts++; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return adapt; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_xv_init(ScreenPtr pScreen) 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*modesettingPtr ms = modesettingPTR(pScrn);*/ 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XF86VideoAdaptorPtr *adaptors, *new_adaptors = NULL; 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XF86VideoAdaptorPtr textured_adapter; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_adaptors; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org new_adaptors = malloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr *)); 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_adaptors == NULL) 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(new_adaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adaptors = new_adaptors; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add the adaptors supported by our hardware. First, set up the atoms 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that will be used by both output adaptors. 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xvContrast = MAKE_ATOM("XV_CONTRAST"); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textured_adapter = xorg_setup_textured_adapter(pScreen); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_assert(textured_adapter); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (textured_adapter) { 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adaptors[num_adaptors++] = textured_adapter; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_adaptors) { 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86XVScreenInit(pScreen, adaptors, num_adaptors); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (textured_adapter) 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xorg_xvmc_init(pScreen, textured_adapter->name); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Disabling Xv because no adaptors could be initialized.\n"); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(adaptors); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 762