st/xorg: start working on the Xv acceleration code
This commit is contained in:
parent
80965fca74
commit
228aa45fcb
|
@ -151,5 +151,11 @@ crtc_cursor_destroy(xf86CrtcPtr crtc);
|
|||
void
|
||||
output_init(ScrnInfoPtr pScrn);
|
||||
|
||||
/***********************************************************************
|
||||
* xorg_xv.c
|
||||
*/
|
||||
void
|
||||
xorg_init_video(ScreenPtr pScreen);
|
||||
|
||||
|
||||
#endif /* _XORG_TRACKER_H_ */
|
||||
|
|
|
@ -0,0 +1,212 @@
|
|||
#include "xorg_tracker.h"
|
||||
|
||||
#include <xf86xv.h>
|
||||
#include <X11/extensions/Xv.h>
|
||||
#include <fourcc.h>
|
||||
|
||||
/*XXX get these from pipe's texture limits */
|
||||
#define IMAGE_MAX_WIDTH 2048
|
||||
#define IMAGE_MAX_HEIGHT 2048
|
||||
|
||||
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
|
||||
|
||||
static Atom xvBrightness, xvContrast;
|
||||
|
||||
#define NUM_TEXTURED_ATTRIBUTES 2
|
||||
static XF86AttributeRec TexturedAttributes[NUM_TEXTURED_ATTRIBUTES] = {
|
||||
{XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
|
||||
{XvSettable | XvGettable, 0, 255, "XV_CONTRAST"}
|
||||
};
|
||||
|
||||
#define NUM_FORMATS 3
|
||||
static XF86VideoFormatRec Formats[NUM_FORMATS] = {
|
||||
{15, TrueColor}, {16, TrueColor}, {24, TrueColor}
|
||||
};
|
||||
|
||||
static XF86VideoEncodingRec DummyEncoding[1] = {
|
||||
{
|
||||
0,
|
||||
"XV_IMAGE",
|
||||
IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,
|
||||
{1, 1}
|
||||
}
|
||||
};
|
||||
|
||||
#define NUM_IMAGES 2
|
||||
static XF86ImageRec Images[NUM_IMAGES] = {
|
||||
XVIMAGE_UYVY,
|
||||
XVIMAGE_YUY2,
|
||||
};
|
||||
|
||||
struct xorg_xv_port_priv {
|
||||
RegionRec clip;
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
stop_video(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
|
||||
{
|
||||
}
|
||||
|
||||
static int
|
||||
set_port_attribute(ScrnInfoPtr pScrn,
|
||||
Atom attribute, INT32 value, pointer data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
get_port_attribute(ScrnInfoPtr pScrn,
|
||||
Atom attribute, INT32 * value, pointer data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
query_best_size(ScrnInfoPtr pScrn,
|
||||
Bool motion,
|
||||
short vid_w, short vid_h,
|
||||
short drw_w, short drw_h,
|
||||
unsigned int *p_w, unsigned int *p_h, pointer data)
|
||||
{
|
||||
}
|
||||
|
||||
static int
|
||||
put_image(ScrnInfoPtr pScrn,
|
||||
short src_x, short src_y,
|
||||
short drw_x, short drw_y,
|
||||
short src_w, short src_h,
|
||||
short drw_w, short drw_h,
|
||||
int id, unsigned char *buf,
|
||||
short width, short height,
|
||||
Bool sync, RegionPtr clipBoxes, pointer data,
|
||||
DrawablePtr pDraw)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
query_image_attributes(ScrnInfoPtr pScrn,
|
||||
int id,
|
||||
unsigned short *w, unsigned short *h,
|
||||
int *pitches, int *offsets)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct xorg_xv_port_priv *
|
||||
port_priv_create(ScreenPtr pScreen)
|
||||
{
|
||||
/*ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];*/
|
||||
/*modesettingPtr ms = modesettingPTR(pScrn);*/
|
||||
struct xorg_xv_port_priv *priv = NULL;
|
||||
|
||||
priv = calloc(1, sizeof(struct xorg_xv_port_priv));
|
||||
|
||||
if (!priv)
|
||||
return NULL;
|
||||
|
||||
REGION_NULL(pScreen, &priv->clip);
|
||||
|
||||
return priv;
|
||||
}
|
||||
|
||||
static XF86VideoAdaptorPtr
|
||||
xorg_setup_textured_adapter(ScreenPtr pScreen)
|
||||
{
|
||||
/*ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];*/
|
||||
/*modesettingPtr ms = modesettingPTR(pScrn);*/
|
||||
XF86VideoAdaptorPtr adapt;
|
||||
XF86AttributePtr attrs;
|
||||
DevUnion *dev_unions;
|
||||
int nports = 16, i;
|
||||
int nattributes;
|
||||
|
||||
nattributes = NUM_TEXTURED_ATTRIBUTES;
|
||||
|
||||
adapt = calloc(1, sizeof(XF86VideoAdaptorRec));
|
||||
dev_unions = calloc(nports, sizeof(DevUnion));
|
||||
attrs = calloc(nattributes, sizeof(XF86AttributeRec));
|
||||
if (adapt == NULL || dev_unions == NULL || attrs == NULL) {
|
||||
free(adapt);
|
||||
free(dev_unions);
|
||||
free(attrs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
adapt->type = XvWindowMask | XvInputMask | XvImageMask;
|
||||
adapt->flags = 0;
|
||||
adapt->name = "Gallium3D Textured Video";
|
||||
adapt->nEncodings = 1;
|
||||
adapt->pEncodings = DummyEncoding;
|
||||
adapt->nFormats = NUM_FORMATS;
|
||||
adapt->pFormats = Formats;
|
||||
adapt->nPorts = 0;
|
||||
adapt->pPortPrivates = dev_unions;
|
||||
adapt->nAttributes = nattributes;
|
||||
adapt->pAttributes = attrs;
|
||||
memcpy(attrs, TexturedAttributes, nattributes * sizeof(XF86AttributeRec));
|
||||
adapt->nImages = NUM_IMAGES;
|
||||
adapt->pImages = Images;
|
||||
adapt->PutVideo = NULL;
|
||||
adapt->PutStill = NULL;
|
||||
adapt->GetVideo = NULL;
|
||||
adapt->GetStill = NULL;
|
||||
adapt->StopVideo = stop_video;
|
||||
adapt->SetPortAttribute = set_port_attribute;
|
||||
adapt->GetPortAttribute = get_port_attribute;
|
||||
adapt->QueryBestSize = query_best_size;
|
||||
adapt->PutImage = put_image;
|
||||
adapt->QueryImageAttributes = query_image_attributes;
|
||||
|
||||
for (i = 0; i < nports; i++) {
|
||||
struct xorg_xv_port_priv *priv =
|
||||
port_priv_create(pScreen);
|
||||
|
||||
adapt->pPortPrivates[i].ptr = (pointer) (priv);
|
||||
adapt->nPorts++;
|
||||
}
|
||||
|
||||
return adapt;
|
||||
}
|
||||
|
||||
void
|
||||
xorg_init_video(ScreenPtr pScreen)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||
/*modesettingPtr ms = modesettingPTR(pScrn);*/
|
||||
XF86VideoAdaptorPtr *adaptors, *new_adaptors = NULL;
|
||||
XF86VideoAdaptorPtr textured_adapter;
|
||||
int num_adaptors;
|
||||
|
||||
num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
|
||||
new_adaptors = malloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr *));
|
||||
if (new_adaptors == NULL)
|
||||
return;
|
||||
|
||||
memcpy(new_adaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr));
|
||||
adaptors = new_adaptors;
|
||||
|
||||
/* Add the adaptors supported by our hardware. First, set up the atoms
|
||||
* that will be used by both output adaptors.
|
||||
*/
|
||||
xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
|
||||
xvContrast = MAKE_ATOM("XV_CONTRAST");
|
||||
|
||||
textured_adapter = xorg_setup_textured_adapter(pScreen);
|
||||
|
||||
debug_assert(textured_adapter);
|
||||
|
||||
if (textured_adapter) {
|
||||
adaptors[num_adaptors++] = textured_adapter;
|
||||
}
|
||||
|
||||
if (num_adaptors) {
|
||||
xf86XVScreenInit(pScreen, adaptors, num_adaptors);
|
||||
} else {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
|
||||
"Disabling Xv because no adaptors could be initialized.\n");
|
||||
}
|
||||
|
||||
free(adaptors);
|
||||
}
|
Loading…
Reference in New Issue