summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2010-03-01 22:57:38 +0100
committerCarl Worth <cworth@cworth.org>2010-03-04 09:36:21 -0800
commit80f2a1f3b5e477a12899ea2251aebcfa62689943 (patch)
treee9a27af15ab6155bf957c54999108e913f645c57
parenta0ee9c3d9c72962c8d513ec8c43dd4a21e316947 (diff)
Xv: fixup YUV plane offset for xvmc case
In my previous cleanup I've inadvertedly dropped the offset adjustment code for the xvmc passthrough case. Fix this up. Also reimplement that ugly hack I've accidently killed to keep i915 class xvmc a tad bit longer on life support. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Tested-by: xunx.fang@intel.com
-rw-r--r--src/i830_video.c52
1 files changed, 31 insertions, 21 deletions
diff --git a/src/i830_video.c b/src/i830_video.c
index d1f391b6..2092a183 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -574,7 +574,7 @@ static XF86VideoAdaptorPtr I830SetupImageVideoTextured(ScreenPtr screen)
adapt->pAttributes = attrs;
memcpy(attrs, TexturedAttributes,
nAttributes * sizeof(XF86AttributeRec));
- if (IS_I915(intel))
+ if (IS_I915G(intel) || IS_I915GM(intel))
adapt->nImages = NUM_IMAGES - XVMC_IMAGE;
else
adapt->nImages = NUM_IMAGES;
@@ -1346,7 +1346,7 @@ i830_setup_video_buffer(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
}
static void
-i830_dst_pitch_and_size(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, short width,
+i830_setup_dst_params(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, short width,
short height, int *dstPitch, int *dstPitch2, int *size,
int id)
{
@@ -1410,6 +1410,20 @@ i830_dst_pitch_and_size(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, s
ErrorF("srcPitch: %d, dstPitch: %d, size: %d\n", srcPitch, *dstPitch,
size);
#endif
+
+ adaptor_priv->YBufOffset = 0;
+
+ if (adaptor_priv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ adaptor_priv->UBufOffset =
+ adaptor_priv->YBufOffset + (*dstPitch * 2 * width);
+ adaptor_priv->VBufOffset =
+ adaptor_priv->UBufOffset + (*dstPitch * width / 2);
+ } else {
+ adaptor_priv->UBufOffset =
+ adaptor_priv->YBufOffset + (*dstPitch * 2 * height);
+ adaptor_priv->VBufOffset =
+ adaptor_priv->UBufOffset + (*dstPitch * height / 2);
+ }
}
static Bool
@@ -1428,27 +1442,12 @@ i830_copy_video_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
srcPitch = width << 1;
}
- i830_dst_pitch_and_size(scrn, adaptor_priv, width, height, dstPitch,
+ i830_setup_dst_params(scrn, adaptor_priv, width, height, dstPitch,
dstPitch2, &size, id);
if (!i830_setup_video_buffer(scrn, adaptor_priv, size, id, buf))
return FALSE;
- /* fixup pointers */
- adaptor_priv->YBufOffset = 0;
-
- if (adaptor_priv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- adaptor_priv->UBufOffset =
- adaptor_priv->YBufOffset + (*dstPitch * 2 * width);
- adaptor_priv->VBufOffset =
- adaptor_priv->UBufOffset + (*dstPitch * width / 2);
- } else {
- adaptor_priv->UBufOffset =
- adaptor_priv->YBufOffset + (*dstPitch * 2 * height);
- adaptor_priv->VBufOffset =
- adaptor_priv->UBufOffset + (*dstPitch * height / 2);
- }
-
/* copy data */
if (is_planar_fourcc(id)) {
I830CopyPlanarData(adaptor_priv, buf, srcPitch, srcPitch2,
@@ -1513,16 +1512,27 @@ I830PutImageTextured(ScrnInfoPtr scrn,
return Success;
if (xvmc_passthrough(id)) {
+ int size;
i830_free_video_buffers(adaptor_priv);
+
+ i830_setup_dst_params(scrn, adaptor_priv, width, height, &dstPitch,
+ &dstPitch2, &size, id);
+
if (IS_I965G(intel)) {
adaptor_priv->buf =
drm_intel_bo_gem_create_from_name(intel->bufmgr,
"xvmc surface",
(uintptr_t)buf);
} else {
- /* XXX: i915 is not support and needs some serious care.
- * grep for KMS in i915_hwmc.c */
- return BadAlloc;
+ if (IS_I915G(intel) || IS_I915GM(intel)) {
+ /* XXX: i915 is not support and needs some
+ * serious care. grep for KMS in i915_hwmc.c */
+ return BadAlloc;
+ }
+ /* fixup pointers */
+ adaptor_priv->YBufOffset += (uint32_t) buf;
+ adaptor_priv->UBufOffset += (uint32_t) buf;
+ adaptor_priv->VBufOffset += (uint32_t) buf;
}
} else {
if (!i830_copy_video_data(scrn, adaptor_priv, width, height,