xf86-video-intel: 2 commits - configure.ac m4/ac_define_dir.m4 Makefile.am src/intel_dri.c src/sna/sna_accel.c src/sna/sna_dri.c src/sna/sna.h src/sna/sna_video.c src/sna/sna_video.h src/sna/sna_video_hwmc.c src/sna/sna_video_hwmc.h src/sna/sna_video_textured.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Apr 17 07:28:55 PDT 2013
Makefile.am | 2
configure.ac | 3
m4/ac_define_dir.m4 | 49 ++++++++
src/intel_dri.c | 15 ++
src/sna/sna.h | 6 +
src/sna/sna_accel.c | 2
src/sna/sna_dri.c | 16 ++
src/sna/sna_video.c | 134 +++++++++++++++++------
src/sna/sna_video.h | 13 ++
src/sna/sna_video_hwmc.c | 64 ++++-------
src/sna/sna_video_hwmc.h | 2
src/sna/sna_video_textured.c | 243 ++++++++++++++++++++++---------------------
12 files changed, 357 insertions(+), 192 deletions(-)
New commits:
commit 1bf0d869ae07ffc5b9cd79904b421cd37997ae8c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Apr 17 15:24:10 2013 +0100
Prefer i830_dri.so for gen2 chipsets
Probe for i830_dri.so and, if it exists, use that driver in preference
to i915_dri.so for DRI (i.e. GL clients). This was suggested in the
context of distributions supplying i915g as the main DRI driver for
gen3, in which case we need to provide a separate DRI driver for gen2.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/Makefile.am b/Makefile.am
index 5001674..b4b027d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,7 +18,7 @@
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
+ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
SUBDIRS = man
diff --git a/configure.ac b/configure.ac
index 9411e17..d30686f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,6 +28,7 @@ AC_INIT([xf86-video-intel],
[xf86-video-intel])
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR(.)
# Initialize Automake
@@ -168,6 +169,8 @@ AC_ARG_WITH(xorg-module-dir,
AC_ARG_ENABLE(dri, AS_HELP_STRING([--disable-dri],
[Disable DRI support [[default=auto]]]))
+dridriverdir=`$PKG_CONFIG --variable=dridriverdir dri`
+AC_DEFINE_DIR(DRI_DRIVER_PATH, dridriverdir, [Default DRI driver path])
AC_ARG_ENABLE(xvmc, AS_HELP_STRING([--disable-xvmc],
[Disable XvMC support [[default=yes]]]),
diff --git a/m4/ac_define_dir.m4 b/m4/ac_define_dir.m4
new file mode 100644
index 0000000..db42d3e
--- /dev/null
+++ b/m4/ac_define_dir.m4
@@ -0,0 +1,49 @@
+# ===========================================================================
+# http://autoconf-archive.cryp.to/ac_define_dir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AC_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION])
+#
+# DESCRIPTION
+#
+# This macro sets VARNAME to the expansion of the DIR variable, taking
+# care of fixing up ${prefix} and such.
+#
+# VARNAME is then offered as both an output variable and a C preprocessor
+# symbol.
+#
+# Example:
+#
+# AC_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.])
+#
+# LAST MODIFICATION
+#
+# 2008-04-12
+#
+# COPYLEFT
+#
+# Copyright (c) 2008 Stepan Kasal <kasal at ucw.cz>
+# Copyright (c) 2008 Andreas Schwab <schwab at suse.de>
+# Copyright (c) 2008 Guido U. Draheim <guidod at gmx.de>
+# Copyright (c) 2008 Alexandre Oliva
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved.
+
+AC_DEFUN([AC_DEFINE_DIR], [
+ prefix_NONE=
+ exec_prefix_NONE=
+ test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
+dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
+dnl refers to ${prefix}. Thus we have to use `eval' twice.
+ eval ac_define_dir="\"[$]$2\""
+ eval ac_define_dir="\"$ac_define_dir\""
+ AC_SUBST($1, "$ac_define_dir")
+ AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3])
+ test "$prefix_NONE" && prefix=NONE
+ test "$exec_prefix_NONE" && exec_prefix=NONE
+])
diff --git a/src/intel_dri.c b/src/intel_dri.c
index 8f27921..0df9912 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1523,13 +1523,24 @@ out_complete:
static int dri2_server_generation;
#endif
+static bool has_i830_dri(void)
+{
+ return access(DRI_DRIVER_PATH "/i830_dri.so", R_OK) == 0;
+}
+
static const char *dri_driver_name(intel_screen_private *intel)
{
const char *s = xf86GetOptValString(intel->Options, OPTION_DRI);
Bool dummy;
- if (s == NULL || xf86getBoolValue(&dummy, s))
- return INTEL_INFO(intel)->gen < 040 ? "i915" : "i965";
+ if (s == NULL || xf86getBoolValue(&dummy, s)) {
+ if (INTEL_INFO(intel)->gen < 030)
+ return has_i830_dri() ? "i830" : "i915";
+ else if (INTEL_INFO(intel)->gen < 040)
+ return "i915";
+ else
+ return "i965";
+ }
return s;
}
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 5fb1662..98e0d6a 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -39,6 +39,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <errno.h>
#include <time.h>
#include <string.h>
+#include <unistd.h>
#include "sna.h"
#include "sna_reg.h"
@@ -2381,13 +2382,24 @@ out_complete:
}
#endif
+static bool has_i830_dri(void)
+{
+ return access(DRI_DRIVER_PATH "/i830_dri.so", R_OK) == 0;
+}
+
static const char *dri_driver_name(struct sna *sna)
{
const char *s = xf86GetOptValString(sna->Options, OPTION_DRI);
Bool dummy;
- if (s == NULL || xf86getBoolValue(&dummy, s))
- return sna->kgem.gen < 040 ? "i915" : "i965";
+ if (s == NULL || xf86getBoolValue(&dummy, s)) {
+ if (sna->kgem.gen < 030)
+ return has_i830_dri() ? "i830" : "i915";
+ else if (sna->kgem.gen < 040)
+ return "i915";
+ else
+ return "i965";
+ }
return s;
}
commit ddd75d6539dcf692cb76747cd63d1f301180f18a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Apr 9 19:13:46 2013 +0100
xgvevent
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 20981b3..ee6578b 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -57,6 +57,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <glyphstr.h>
#include <picturestr.h>
#include <gcstruct.h>
+#include <xvdix.h>
#include <pciaccess.h>
@@ -248,6 +249,11 @@ struct sna {
void *flip_pending;
} dri;
+ struct sna_xv {
+ XvAdaptorPtr adaptors;
+ int num_adaptors;
+ } xv;
+
unsigned int tiling;
#define SNA_TILING_FB 0x1
#define SNA_TILING_2D 0x2
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index c363a3c..c337de7 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -57,7 +57,7 @@
#define FORCE_INPLACE 0
#define FORCE_FALLBACK 0
#define FORCE_FLUSH 0
-#define FORCE_FULL_SYNC 1 /* https://bugs.freedesktop.org/show_bug.cgi?id=61628 */
+#define FORCE_FULL_SYNC 0 /* https://bugs.freedesktop.org/show_bug.cgi?id=61628 */
#define DEFAULT_TILING I915_TILING_X
diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index 6d067c7..b753490 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -532,50 +532,118 @@ sna_video_copy_data(struct sna *sna,
return true;
}
+struct xXvEvent_Intel {
+ uint8_t type; /* GenericEvent */
+ uint8_t extension; /* XvReqCode */
+ uint16_t seqno;
+ uint32_t length; /* 0 */
+ uint16_t evtype;
+ uint16_t pad;
+ uint32_t frame;
+ uint32_t name;
+};
+#define XvFrameRelease_Intel 0x100
+
+void sna_video_send_frame_release(ClientPtr client,
+ uint32_t frame,
+ uint32_t name)
+{
+ //GEMaskIsSet
+ struct xXvEvent_Intel ev = {
+ .type = GenericEvent,
+ .extension = XvReqCode,
+ .seqno = client->sequence,
+ .length = 0,
+ .evtype = XvFrameRelease_Intel,
+ .frame = frame,
+ .name = name
+ };
+ assert(!client->swapped);
+ WriteToClient(client, sizeof(ev), &ev);
+}
+
+XvAdaptorPtr sna_xv_adaptor_alloc(struct sna *sna)
+{
+ XvAdaptorPtr new_adaptors;
+
+ new_adaptors = realloc(sna->xv.adaptors,
+ (sna->xv.num_adaptors+1)*sizeof(XvAdaptorRec));
+ if (new_adaptors == NULL)
+ return NULL;
+
+ sna->xv.adaptors = new_adaptors;
+ return &sna->xv.adaptors[sna->xv.num_adaptors++];
+}
+
+int
+sna_xv_alloc_port(unsigned long port, XvPortPtr in, XvPortPtr *out)
+{
+ *out = in;
+ return Success;
+}
+
+int
+sna_xv_free_port(XvPortPtr port)
+{
+ return Success;
+}
+
+static int
+sna_xv_query_adaptors(ScreenPtr screen,
+ XvAdaptorPtr *adaptors,
+ int *num_adaptors)
+{
+ struct sna *sna = to_sna_from_screen(screen);
+
+ *num_adaptors = sna->xv.num_adaptors;
+ *adaptors = sna->xv.adaptors;
+ return Success;
+}
+
+static Bool
+sna_xv_close_screen(ScreenPtr screen)
+{
+ return TRUE;
+}
+
void sna_video_init(struct sna *sna, ScreenPtr screen)
{
- XF86VideoAdaptorPtr *adaptors, *newAdaptors;
- XF86VideoAdaptorPtr textured, overlay;
- int num_adaptors;
- int prefer_overlay =
- xf86ReturnOptValBool(sna->Options, OPTION_PREFER_OVERLAY, false);
+ XvScreenPtr xv;
- if (!xf86LoaderCheckSymbol("xf86XVListGenericAdaptors"))
+ if (noXvExtension)
return;
- adaptors = NULL;
- num_adaptors = xf86XVListGenericAdaptors(sna->scrn, &adaptors);
- newAdaptors = realloc(adaptors,
- (num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr));
- if (newAdaptors == NULL) {
+ if (xf86LoaderCheckSymbol("xf86XVListGenericAdaptors")) {
+ XF86VideoAdaptorPtr *adaptors = NULL;
+ int num_adaptors = xf86XVListGenericAdaptors(sna->scrn, &adaptors);
+ if (num_adaptors)
+ xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
+ "Ignoring generic xf86XV adaptors");
free(adaptors);
- return;
}
- adaptors = newAdaptors;
- /* Set up textured video if we can do it at this depth and we are on
- * supported hardware.
- */
- textured = sna_video_textured_setup(sna, screen);
- overlay = sna_video_sprite_setup(sna, screen);
- if (overlay == NULL)
- overlay = sna_video_overlay_setup(sna, screen);
+ if (XvScreenInit(screen) != Success)
+ return;
- if (overlay && prefer_overlay)
- adaptors[num_adaptors++] = overlay;
+ xv = to_xv(screen);
+ xv->ddCloseScreen = sna_xv_close_screen;
+ xv->ddQueryAdaptors = sna_xv_query_adaptors;
- if (textured)
- adaptors[num_adaptors++] = textured;
+ sna_video_textured_setup(sna, screen);
+ if (!sna_video_sprite_setup(sna, screen))
+ sna_video_overlay_setup(sna, screen);
- if (overlay && !prefer_overlay)
- adaptors[num_adaptors++] = overlay;
+ if (sna->xv.num_adaptors >= 2 &&
+ xf86ReturnOptValBool(sna->Options, OPTION_PREFER_OVERLAY, false)) {
+ XvAdaptorRec tmp;
- if (num_adaptors) {
- if (xf86XVScreenInit(screen, adaptors, num_adaptors))
- sna_video_xvmc_setup(sna, screen);
- } else
- xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
- "Disabling Xv because no adaptors could be initialized.\n");
+ tmp = sna->xv.adaptors[0];
+ sna->xv.adaptors[0] = sna->xv.adaptors[1];
+ sna->xv.adaptors[1] = tmp;
+ }
+
+ xv->nAdaptors = sna->xv.num_adaptors;
+ xv->pAdaptors = sna->xv.adaptors;
- free(adaptors);
+ sna_video_xvmc_setup(sna, screen);
}
diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
index 2e7144e..d39fa5f 100644
--- a/src/sna/sna_video.h
+++ b/src/sna/sna_video.h
@@ -50,6 +50,8 @@ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
}
struct sna_video {
+ struct sna *sna;
+
int brightness;
int contrast;
int saturation;
@@ -95,10 +97,19 @@ struct sna_video_frame {
BoxRec src;
};
+static inline XvScreenPtr to_xv(ScreenPtr screen)
+{
+ return dixLookupPrivate(&screen->devPrivates, XvGetScreenKey());
+}
+
void sna_video_init(struct sna *sna, ScreenPtr screen);
XF86VideoAdaptorPtr sna_video_overlay_setup(struct sna *sna, ScreenPtr screen);
XF86VideoAdaptorPtr sna_video_sprite_setup(struct sna *sna, ScreenPtr screen);
-XF86VideoAdaptorPtr sna_video_textured_setup(struct sna *sna, ScreenPtr screen);
+void sna_video_textured_setup(struct sna *sna, ScreenPtr screen);
+
+XvAdaptorPtr sna_xv_adaptor_alloc(struct sna *sna);
+int sna_xv_alloc_port(unsigned long port, XvPortPtr in, XvPortPtr *out);
+int sna_xv_free_port(XvPortPtr port);
#define FOURCC_XVMC (('C' << 24) + ('M' << 16) + ('V' << 8) + 'X')
diff --git a/src/sna/sna_video_hwmc.c b/src/sna/sna_video_hwmc.c
index 55aa854..15a7844 100644
--- a/src/sna/sna_video_hwmc.c
+++ b/src/sna/sna_video_hwmc.c
@@ -196,66 +196,60 @@ static XvMCSurfaceInfoPtr surface_info_vld[] = {
};
/* check chip type and load xvmc driver */
-Bool sna_video_xvmc_setup(struct sna *sna,
- ScreenPtr screen)
+void sna_video_xvmc_setup(struct sna *sna, ScreenPtr screen)
{
XvMCAdaptorRec *adaptors;
- XvScreenPtr xv;
const char *name;
char bus[64];
- int i, j;
+ int i;
+
+ if (!sna->xv.num_adaptors)
+ return;
if (!xf86LoaderCheckSymbol("XvMCScreenInit"))
- return FALSE;
+ return;
/* Needs KMS support. */
if (sna->kgem.gen < 031)
- return FALSE;
+ return;
/* Not implemented */
if (sna->kgem.gen >= 060)
- return FALSE;
-
- xv = dixLookupPrivate(&screen->devPrivates, XF86XvScreenKey);
+ return;
- adaptors = calloc(xv->nAdaptors, sizeof(XvMCAdaptorRec));
+ adaptors = calloc(sna->xv.num_adaptors, sizeof(XvMCAdaptorRec));
if (adaptors == NULL)
- return FALSE;
-
- for (i = j = 0; i< xv->nAdaptors;i++) {
- if (strncmp(xv->pAdaptors[i].name, "Intel(R)", 8))
- continue;
+ return;
- adaptors[j].xv_adaptor = &xv->pAdaptors[i];
+ for (i = 0; i< sna->xv.num_adaptors; i++) {
+ adaptors[i].xv_adaptor = &sna->xv.adaptors[i];
- adaptors[j].num_subpictures = 0;
- adaptors[j].subpictures = NULL;
- adaptors[j].CreateContext = create_context;
- adaptors[j].DestroyContext = destroy_context;
- adaptors[j].CreateSurface = create_surface;
- adaptors[j].DestroySurface = destroy_surface;
- adaptors[j].CreateSubpicture = create_subpicture;
- adaptors[j].DestroySubpicture = destroy_subpicture;
+ adaptors[i].num_subpictures = 0;
+ adaptors[i].subpictures = NULL;
+ adaptors[i].CreateContext = create_context;
+ adaptors[i].DestroyContext = destroy_context;
+ adaptors[i].CreateSurface = create_surface;
+ adaptors[i].DestroySurface = destroy_surface;
+ adaptors[i].CreateSubpicture = create_subpicture;
+ adaptors[i].DestroySubpicture = destroy_subpicture;
if (sna->kgem.gen >= 045) {
- adaptors[j].num_surfaces = ARRAY_SIZE(surface_info_vld);
- adaptors[j].surfaces = surface_info_vld;
+ adaptors[i].num_surfaces = ARRAY_SIZE(surface_info_vld);
+ adaptors[i].surfaces = surface_info_vld;
} else if (sna->kgem.gen >= 040) {
- adaptors[j].num_surfaces = ARRAY_SIZE(surface_info_i965);
- adaptors[j].surfaces = surface_info_i965;
+ adaptors[i].num_surfaces = ARRAY_SIZE(surface_info_i965);
+ adaptors[i].surfaces = surface_info_i965;
} else {
- adaptors[j].num_surfaces = ARRAY_SIZE(surface_info_i915);
- adaptors[j].surfaces = surface_info_i915;
+ adaptors[i].num_surfaces = ARRAY_SIZE(surface_info_i915);
+ adaptors[i].surfaces = surface_info_i915;
}
-
- j++;
}
- if (XvMCScreenInit(screen, j, adaptors) != Success) {
+ if (XvMCScreenInit(screen, i, adaptors) != Success) {
xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
"[XvMC] Failed to initialize XvMC.\n");
free(adaptors);
- return FALSE;
+ return;
}
sprintf(bus, "pci:%04x:%02x:%02x.%d",
@@ -275,6 +269,4 @@ Bool sna_video_xvmc_setup(struct sna *sna,
xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
"[XvMC] %s driver initialized.\n",
name);
-
- return TRUE;
}
diff --git a/src/sna/sna_video_hwmc.h b/src/sna/sna_video_hwmc.h
index 8b0d2cd..a6469a0 100644
--- a/src/sna/sna_video_hwmc.h
+++ b/src/sna/sna_video_hwmc.h
@@ -40,7 +40,7 @@
#ifdef _SNA_XVMC_SERVER_
#include <xf86xvmc.h>
-Bool sna_video_xvmc_setup(struct sna *sna, ScreenPtr screen);
+void sna_video_xvmc_setup(struct sna *sna, ScreenPtr screen);
#endif
#endif
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 8278606..5f90744 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -43,20 +43,19 @@
static Atom xvBrightness, xvContrast, xvSyncToVblank;
-#define NUM_FORMATS 3
-static const XF86VideoFormatRec Formats[NUM_FORMATS] = {
+static const XvFormatRec Formats[] = {
{15, TrueColor}, {16, TrueColor}, {24, TrueColor}
};
+#define NUM_FORMATS ARRAY_SIZE(Formats)
-//#define NUM_TEXTURED_ATTRIBUTES 3
-#define NUM_TEXTURED_ATTRIBUTES 1
-static const XF86AttributeRec TexturedAttributes[] = {
+static const XvAttributeRec TexturedAttributes[] = {
{XvSettable | XvGettable, -1, 1, "XV_SYNC_TO_VBLANK"},
- {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
- {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
+ //{XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
+ //{XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
};
+#define NUM_TEXTURED_ATTRIBUTES ARRAY_SIZE(TexturedAttributes)
-static const XF86ImageRec Images[] = {
+static const XvImageRec Images[] = {
XVIMAGE_YUY2,
XVIMAGE_YV12,
XVIMAGE_I420,
@@ -64,30 +63,27 @@ static const XF86ImageRec Images[] = {
XVMC_YUV,
};
-static void sna_video_textured_stop(ScrnInfoPtr scrn,
- pointer data,
- Bool shutdown)
+static int sna_video_textured_stop(ClientPtr client,
+ XvPortPtr port,
+ DrawablePtr draw)
{
- struct sna *sna = to_sna(scrn);
- struct sna_video *video = data;
+ struct sna_video *video = port->devPriv.ptr;
DBG(("%s()\n", __FUNCTION__));
- REGION_EMPTY(scrn->pScreen, &video->clip);
+ RegionUninit(&video->clip);
+ sna_video_free_buffers(video->sna, video);
- if (!shutdown)
- return;
-
- sna_video_free_buffers(sna, video);
+ return Success;
}
static int
-sna_video_textured_set_attribute(ScrnInfoPtr scrn,
+sna_video_textured_set_attribute(ClientPtr client,
+ XvPortPtr port,
Atom attribute,
- INT32 value,
- pointer data)
+ INT32 value)
{
- struct sna_video *video = data;
+ struct sna_video *video = port->devPriv.ptr;
if (attribute == xvBrightness) {
if (value < -128 || value > 127)
@@ -111,12 +107,12 @@ sna_video_textured_set_attribute(ScrnInfoPtr scrn,
}
static int
-sna_video_textured_get_attribute(ScrnInfoPtr scrn,
+sna_video_textured_get_attribute(ClientPtr client,
+ XvPortPtr port,
Atom attribute,
- INT32 *value,
- pointer data)
+ INT32 *value)
{
- struct sna_video *video = data;
+ struct sna_video *video = port->devPriv.ptr;
if (attribute == xvBrightness)
*value = video->brightness;
@@ -130,14 +126,14 @@ sna_video_textured_get_attribute(ScrnInfoPtr scrn,
return Success;
}
-static void
-sna_video_textured_best_size(ScrnInfoPtr scrn,
- Bool motion,
- short vid_w, short vid_h,
- short drw_w, short drw_h,
+static int
+sna_video_textured_best_size(ClientPtr client,
+ XvPortPtr port,
+ CARD8 motion,
+ CARD16 vid_w, CARD16 vid_h,
+ CARD16 drw_w, CARD16 drw_h,
unsigned int *p_w,
- unsigned int *p_h,
- pointer data)
+ unsigned int *p_h)
{
if (vid_w > (drw_w << 1))
drw_w = vid_w >> 1;
@@ -146,6 +142,8 @@ sna_video_textured_best_size(ScrnInfoPtr scrn,
*p_w = drw_w;
*p_h = drw_h;
+
+ return Success;
}
/*
@@ -162,35 +160,49 @@ sna_video_textured_best_size(ScrnInfoPtr scrn,
* compositing. It's a new argument to the function in the 1.1 server.
*/
static int
-sna_video_textured_put_image(ScrnInfoPtr scrn,
- 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 clip, pointer data,
- DrawablePtr drawable)
+sna_video_textured_put_image(ClientPtr client,
+ DrawablePtr draw,
+ XvPortPtr port,
+ GCPtr gc,
+ INT16 src_x, INT16 src_y,
+ CARD16 src_w, CARD16 src_h,
+ INT16 drw_x, INT16 drw_y,
+ CARD16 drw_w, CARD16 drw_h,
+ XvImagePtr format,
+ unsigned char *buf,
+ Bool sync,
+ CARD16 width, CARD16 height)
{
- struct sna *sna = to_sna(scrn);
- struct sna_video *video = data;
+ struct sna_video *video = port->devPriv.ptr;
+ struct sna *sna = video->sna;
struct sna_video_frame frame;
- PixmapPtr pixmap = get_drawable_pixmap(drawable);
+ PixmapPtr pixmap = get_drawable_pixmap(draw);
BoxRec dstBox;
+ RegionRec clip;
xf86CrtcPtr crtc;
bool flush = false;
bool ret;
+ clip.extents.x1 = draw->x + drw_x;
+ clip.extents.y1 = draw->y + drw_y;
+ clip.extents.x2 = clip.extents.x1 + drw_w;
+ clip.extents.y2 = clip.extents.y1 + drw_h;
+ clip.data = NULL;
+
+ RegionIntersect(&clip, &clip, gc->pCompositeClip);
+ if (!RegionNotEmpty(&clip))
+ return Success;
+
DBG(("%s: src=(%d, %d),(%d, %d), dst=(%d, %d),(%d, %d), id=%d, sizep=%dx%d, sync?=%d\n",
__FUNCTION__,
src_x, src_y, src_w, src_h,
drw_x, drw_y, drw_w, drw_h,
- id, width, height, sync));
+ format->id, width, height, sync));
DBG(("%s: region %d:(%d, %d), (%d, %d)\n", __FUNCTION__,
- RegionNumRects(clip),
- clip->extents.x1, clip->extents.y1,
- clip->extents.x2, clip->extents.y2));
+ RegionNumRects(&clip),
+ clip.extents.x1, clip.extents.y1,
+ clip.extents.x2, clip.extents.y2));
if (buf == 0) {
DBG(("%s: garbage video buffer\n", __FUNCTION__));
@@ -203,16 +215,16 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
return BadAlloc;
}
- sna_video_frame_init(sna, video, id, width, height, &frame);
+ sna_video_frame_init(sna, video, format->id, width, height, &frame);
- if (!sna_video_clip_helper(scrn, video, &frame,
+ if (!sna_video_clip_helper(sna->scrn, video, &frame,
&crtc, &dstBox,
- src_x, src_y, drw_x, drw_y,
+ src_x, src_y, drw_x + draw->x, drw_y + draw->y,
src_w, src_h, drw_w, drw_h,
- clip))
+ &clip))
return Success;
- if (xvmc_passthrough(id)) {
+ if (xvmc_passthrough(format->id)) {
DBG(("%s: using passthough, name=%d\n",
__FUNCTION__, *(uint32_t *)buf));
@@ -235,19 +247,19 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
}
}
- if (crtc && video->SyncToVblank != 0 &&
+ if (crtc && sync && video->SyncToVblank != 0 &&
sna_pixmap_is_scanout(sna, pixmap)) {
kgem_set_mode(&sna->kgem, KGEM_RENDER, sna_pixmap(pixmap)->gpu_bo);
flush = sna_wait_for_scanline(sna, pixmap, crtc,
- &clip->extents);
+ &clip.extents);
}
ret = Success;
- if (!sna->render.video(sna, video, &frame, clip, pixmap)) {
+ if (!sna->render.video(sna, video, &frame, &clip, pixmap)) {
DBG(("%s: failed to render video\n", __FUNCTION__));
ret = BadAlloc;
} else
- DamageDamageRegion(drawable, clip);
+ DamageDamageRegion(draw, &clip);
kgem_bo_destroy(&sna->kgem, frame.bo);
@@ -257,14 +269,19 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
if (flush)
kgem_submit(&sna->kgem);
+ RegionUninit(&clip);
+
return ret;
}
static int
-sna_video_textured_query(ScrnInfoPtr scrn,
- int id,
- unsigned short *w, unsigned short *h,
- int *pitches, int *offsets)
+sna_video_textured_query(ClientPtr client,
+ XvPortPtr port,
+ XvImagePtr format,
+ unsigned short *w,
+ unsigned short *h,
+ int *pitches,
+ int *offsets)
{
int size, tmp;
@@ -277,7 +294,7 @@ sna_video_textured_query(ScrnInfoPtr scrn,
if (offsets)
offsets[0] = 0;
- switch (id) {
+ switch (format->id) {
/* IA44 is for XvMC only */
case FOURCC_IA44:
case FOURCC_AI44:
@@ -322,87 +339,73 @@ sna_video_textured_query(ScrnInfoPtr scrn,
return size;
}
-XF86VideoAdaptorPtr sna_video_textured_setup(struct sna *sna,
- ScreenPtr screen)
+void sna_video_textured_setup(struct sna *sna, ScreenPtr screen)
{
- XF86VideoAdaptorPtr adaptor;
- XF86AttributePtr attrs;
+ XvAdaptorPtr adaptor;
struct sna_video *video;
- DevUnion *devUnions;
int nports = 16, i;
if (!sna->render.video) {
- xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
+ xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
"Textured video not supported on this hardware\n");
- return NULL;
+ return;
}
if (wedged(sna)) {
xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
"cannot enable XVideo whilst the GPU is wedged\n");
- return NULL;
+ return;
}
- adaptor = calloc(1, sizeof(XF86VideoAdaptorRec));
+ adaptor = sna_xv_adaptor_alloc(sna);
+ if (adaptor == NULL)
+ return;
+
video = calloc(nports, sizeof(struct sna_video));
- devUnions = calloc(nports, sizeof(DevUnion));
-#if NUM_TEXTURED_ATTRIBUTES
- attrs = calloc(NUM_TEXTURED_ATTRIBUTES, sizeof(XF86AttributeRec));
- if (adaptor == NULL ||
- video == NULL ||
- devUnions == NULL ||
- attrs == NULL) {
- free(adaptor);
+ if ( video == NULL) {
+ sna->xv.num_adaptors--;
free(video);
- free(devUnions);
- free(attrs);
- return NULL;
- }
-#else
- if (adaptor == NULL || video == NULL || devUnions == NULL) {
- free(adaptor);
- free(video);
- free(devUnions);
- return NULL;
+ return;
}
- attrs = NULL;
-#endif
- adaptor->type = XvWindowMask | XvInputMask | XvImageMask;
- adaptor->flags = 0;
+ adaptor->type = XvInputMask | XvImageMask;
+ adaptor->pScreen = screen;
adaptor->name = "Intel(R) Textured Video";
adaptor->nEncodings = 1;
- adaptor->pEncodings = xnfalloc(sizeof(XF86VideoEncodingRec));
+ adaptor->pEncodings = xnfalloc(sizeof(XvEncodingRec));
adaptor->pEncodings[0].id = 0;
+ adaptor->pEncodings[0].pScreen = screen;
adaptor->pEncodings[0].name = "XV_IMAGE";
adaptor->pEncodings[0].width = sna->render.max_3d_size;
adaptor->pEncodings[0].height = sna->render.max_3d_size;
adaptor->pEncodings[0].rate.numerator = 1;
adaptor->pEncodings[0].rate.denominator = 1;
adaptor->nFormats = NUM_FORMATS;
- adaptor->pFormats = (XF86VideoFormatPtr)Formats;
- adaptor->nPorts = nports;
- adaptor->pPortPrivates = devUnions;
+ adaptor->pFormats = Formats;
adaptor->nAttributes = NUM_TEXTURED_ATTRIBUTES;
- adaptor->pAttributes = attrs;
- memcpy(attrs, TexturedAttributes,
- NUM_TEXTURED_ATTRIBUTES * sizeof(XF86AttributeRec));
+ adaptor->pAttributes = TexturedAttributes;
adaptor->nImages = ARRAY_SIZE(Images);
- adaptor->pImages = (XF86ImagePtr)Images;
- adaptor->PutVideo = NULL;
- adaptor->PutStill = NULL;
- adaptor->GetVideo = NULL;
- adaptor->GetStill = NULL;
- adaptor->StopVideo = sna_video_textured_stop;
- adaptor->SetPortAttribute = sna_video_textured_set_attribute;
- adaptor->GetPortAttribute = sna_video_textured_get_attribute;
- adaptor->QueryBestSize = sna_video_textured_best_size;
- adaptor->PutImage = sna_video_textured_put_image;
- adaptor->QueryImageAttributes = sna_video_textured_query;
+ adaptor->pImages = Images;
+ adaptor->ddAllocatePort = sna_xv_alloc_port;
+ adaptor->ddFreePort = sna_xv_free_port;
+ adaptor->ddPutVideo = NULL;
+ adaptor->ddPutStill = NULL;
+ adaptor->ddGetVideo = NULL;
+ adaptor->ddGetStill = NULL;
+ adaptor->ddStopVideo = sna_video_textured_stop;
+ adaptor->ddSetPortAttribute = sna_video_textured_set_attribute;
+ adaptor->ddGetPortAttribute = sna_video_textured_get_attribute;
+ adaptor->ddQueryBestSize = sna_video_textured_best_size;
+ adaptor->ddPutImage = sna_video_textured_put_image;
+ adaptor->ddQueryImageAttributes = sna_video_textured_query;
+ adaptor->nPorts = nports;
+ adaptor->pPorts = calloc(nports, sizeof(XvPortRec));
for (i = 0; i < nports; i++) {
struct sna_video *v = &video[i];
+ XvPortPtr port = &adaptor->pPorts[i];
+ v->sna = sna;
v->textured = true;
v->alignment = 4;
v->rotation = RR_Rotate_0;
@@ -411,12 +414,22 @@ XF86VideoAdaptorPtr sna_video_textured_setup(struct sna *sna,
/* gotta uninit this someplace, XXX: shouldn't be necessary for textured */
RegionNull(&v->clip);
- adaptor->pPortPrivates[i].ptr = v;
+ port->id = FakeClientID(0);
+ AddResource(port->id, XvGetRTPort(), port);
+
+ port->pAdaptor = adaptor;
+ port->pNotify = NULL;
+ port->pDraw = NULL;
+ port->client = NULL;
+ port->grab.client = NULL;
+ port->time = currentTime;
+ port->devPriv.ptr = v;
+
+ port++;
}
+ adaptor->base_id = adaptor->pPorts[0].id;
xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
xvContrast = MAKE_ATOM("XV_CONTRAST");
xvSyncToVblank = MAKE_ATOM("XV_SYNC_TO_VBLANK");
-
- return adaptor;
}
More information about the xorg-commit
mailing list