xf86-video-intel: Branch 'intel-kernelmode' - src/i830_driver.c src/i830.h src/i830_memory.c src/i830_video.c
Dave Airlie
airlied at kemper.freedesktop.org
Thu Feb 28 21:32:41 PST 2008
src/i830.h | 1
src/i830_driver.c | 3
src/i830_memory.c | 21 +++-
src/i830_video.c | 240 +++++++++++++++++++++++++++++++++++++++---------------
4 files changed, 194 insertions(+), 71 deletions(-)
New commits:
commit 5b3e6384f01a9779cb80a2e34d9f7cbd7e60752a
Author: Dave Airlie <airlied at redhat.com>
Date: Fri Feb 29 14:55:13 2008 +1000
initial overlay port - not working yet
diff --git a/src/i830.h b/src/i830.h
index d45b0b8..02c547d 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -416,6 +416,7 @@ typedef struct _I830Rec {
#ifdef I830_XV
/* For Xvideo */
i830_memory *overlay_regs;
+ dri_bo *overlay_regs_bo;
#endif
XF86ModReqInfo shadowReq; /* to test for later libshadow */
Rotation rotation;
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 43e28cd..14a1dff 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -2698,6 +2698,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
pI8301 = I830PTR(pI830->entityPrivate->pScrn_1);
pI830->LpRing = pI8301->LpRing;
pI830->overlay_regs = pI8301->overlay_regs;
+ pI830->overlay_regs_bo = pI8301->overlay_regs_bo;
pI830->overlayOn = pI8301->overlayOn;
pI830->last_3d = pI8301->last_3d;
}
@@ -2911,7 +2912,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
"needs 2D acceleration.\n");
pI830->XvEnabled = FALSE;
}
- if (!IS_I9XX(pI830) && pI830->overlay_regs == NULL) {
+ if (!IS_I9XX(pI830) && pI830->overlay_regs == NULL && pI830->overlay_regs_bo == NULL) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Disabling Xv because the overlay register buffer "
"allocation failed.\n");
diff --git a/src/i830_memory.c b/src/i830_memory.c
index ec464eb..5929f93 100644
--- a/src/i830_memory.c
+++ b/src/i830_memory.c
@@ -360,6 +360,7 @@ i830_reset_allocations(ScrnInfoPtr pScrn)
pI830->exa_offscreen = NULL;
pI830->exa_965_state = NULL;
pI830->overlay_regs = NULL;
+ pI830->overlay_regs_bo = NULL;
#ifdef XF86DRI
pI830->back_buffer = NULL;
pI830->third_buffer = NULL;
@@ -1050,10 +1051,6 @@ i830_allocate_overlay(ScrnInfoPtr pScrn)
I830Ptr pI830 = I830PTR(pScrn);
int flags = 0;
- /* TODO - fix in later commit */
- if (pI830->use_drm_mode)
- return TRUE;
-
/* Only allocate if overlay is going to be enabled. */
if (!pI830->XvEnabled)
return TRUE;
@@ -1061,6 +1058,22 @@ i830_allocate_overlay(ScrnInfoPtr pScrn)
if (!OVERLAY_NOPHYSICAL(pI830))
flags |= NEED_PHYSICAL_ADDR;
+ if (pI830->use_ttm_batch) {
+ int mem_space = DRM_BO_FLAG_MEM_TT;
+ if (flags & NEED_PHYSICAL_ADDR)
+ mem_space = DRM_BO_FLAG_MEM_VRAM;
+
+ /* allocate overlay regs from bufmgr */
+ pI830->overlay_regs_bo = dri_bo_alloc(pI830->bufmgr,"overlay regs",
+ OVERLAY_SIZE, GTT_PAGE_SIZE,
+ mem_space | DRM_BO_FLAG_CACHED | DRM_BO_FLAG_CACHED_MAPPED);
+ if (pI830->overlay_regs_bo == NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Failed to allocate Overlay register space.\n");
+ }
+ return TRUE;
+ }
+
if (!IS_I965G(pI830)) {
pI830->overlay_regs = i830_allocate_memory(pScrn, "overlay registers",
OVERLAY_SIZE, GTT_PAGE_SIZE,
diff --git a/src/i830_video.c b/src/i830_video.c
index d009cf9..5b4663f 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -75,6 +75,7 @@
#include "dixstruct.h"
#include "fourcc.h"
+#include "i915_drm.h"
#ifndef USE_USLEEP_FOR_VIDEO
#define USE_USLEEP_FOR_VIDEO 0
#endif
@@ -321,6 +322,25 @@ typedef struct {
((pI830)->FbBase + \
(pI830)->overlay_regs->offset))
+static I830OverlayRegPtr overlay_reg_prepare(I830Ptr pI830)
+{
+ if (pI830->use_ttm_batch) {
+ dri_bo_map(pI830->overlay_regs_bo, 1);
+ return pI830->overlay_regs_bo->virtual;
+ } else {
+ return I830OVERLAYREG(pI830);
+ }
+}
+
+static void overlay_reg_finish(I830Ptr pI830)
+{
+ if (!pI830->use_ttm_batch)
+ return;
+
+ dri_bo_unmap(pI830->overlay_regs_bo);
+
+}
+
static void *i830_video_alloc_buf(ScrnInfoPtr pScrn, int size)
{
I830Ptr pI830 = I830PTR(pScrn);
@@ -364,6 +384,23 @@ static void i830_video_unmap_buf(I830Ptr pI830, I830PortPrivPtr pPriv)
dri_bo_unmap((dri_bo *)pPriv->buf);
}
+static uint32_t video_read_dovsta(I830Ptr pI830)
+{
+ uint32_t result;
+ if (!pI830->MMIOBase) {
+ struct drm_i915_mmio io = {
+ .read_write = I915_MMIO_READ,
+ .reg = MMIO_REGS_DOVSTA,
+ .data = &result
+ };
+
+ drmCommandWriteRead(pI830->drmSubFD, DRM_I915_MMIO, &io, sizeof(io));
+ } else {
+ result = INREG(DOVSTA);
+ }
+ return result;
+}
+
#if VIDEO_DEBUG
static void
CompareOverlay(I830Ptr pI830, CARD32 * overlay, int size)
@@ -396,6 +433,9 @@ i830_overlay_switch_to_crtc (ScrnInfoPtr pScrn, xf86CrtcPtr crtc)
I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
int pipeconf_reg = intel_crtc->pipe == 0 ? PIPEACONF : PIPEBCONF;
+ if (pI830->use_drm_mode)
+ return;
+
if (INREG(pipeconf_reg) & PIPEACONF_DOUBLE_WIDE)
pPriv->overlayOK = FALSE;
else
@@ -448,13 +488,14 @@ static void
i830_overlay_on(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
- I830OverlayRegPtr overlay = I830OVERLAYREG(pI830);
+ I830OverlayRegPtr overlay;
I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
Bool deactivate = FALSE;
if (*pI830->overlayOn)
return;
+ overlay = overlay_reg_prepare(pI830);
/*
* On I830, if pipe A is off when the overlayis enabled, it will fail to
* turn on and blank the entire screen or lock up the ring. Light up pipe
@@ -464,14 +505,21 @@ i830_overlay_on(ScrnInfoPtr pScrn)
deactivate = i830_pipe_a_require_activate (pScrn);
overlay->OCMD &= ~OVERLAY_ENABLE;
+
+ overlay_reg_finish(pI830);
BEGIN_BATCH(6);
OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE);
OUT_BATCH(MI_NOOP);
OUT_BATCH(MI_OVERLAY_FLIP | MI_OVERLAY_FLIP_ON);
- if (OVERLAY_NOPHYSICAL(pI830)) {
- OUT_BATCH(pI830->overlay_regs->offset | OFC_UPDATE);
+
+ if (pI830->use_ttm_batch) {
+ OUT_RELOC(pI830->overlay_regs_bo, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, OFC_UPDATE);
} else {
- OUT_BATCH(pI830->overlay_regs->bus_addr | OFC_UPDATE);
+ if (OVERLAY_NOPHYSICAL(pI830)) {
+ OUT_BATCH(pI830->overlay_regs->offset | OFC_UPDATE);
+ } else {
+ OUT_BATCH(pI830->overlay_regs->bus_addr | OFC_UPDATE);
+ }
}
/* Wait for the overlay to light up before attempting to use it */
OUT_BATCH(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
@@ -487,35 +535,40 @@ i830_overlay_on(ScrnInfoPtr pScrn)
i830_pipe_a_require_deactivate (pScrn);
OVERLAY_DEBUG("overlay_on\n");
+
*pI830->overlayOn = TRUE;
+ overlay = overlay_reg_prepare(pI830);
overlay->OCMD |= OVERLAY_ENABLE;
+ overlay_reg_finish(pI830);
}
static void
i830_overlay_continue(ScrnInfoPtr pScrn, Bool update_filter)
{
I830Ptr pI830 = I830PTR(pScrn);
- CARD32 flip_addr;
- I830OverlayRegPtr overlay = I830OVERLAYREG(pI830);
+ CARD32 flip_addr = 0;
if (!*pI830->overlayOn)
return;
- if (OVERLAY_NOPHYSICAL(pI830))
- flip_addr = pI830->overlay_regs->offset;
- else
- flip_addr = pI830->overlay_regs->bus_addr;
+ if (!pI830->use_ttm_batch) {
+ if (OVERLAY_NOPHYSICAL(pI830))
+ flip_addr = pI830->overlay_regs->offset;
+ else
+ flip_addr = pI830->overlay_regs->bus_addr;
+ }
if (update_filter)
flip_addr |= OFC_UPDATE;
- OVERLAY_DEBUG ("overlay_continue cmd 0x%08" PRIx32 " -> 0x%08" PRIx32
- " sta 0x%08" PRIx32 "\n",
- overlay->OCMD, INREG(OCMD_REGISTER), INREG(DOVSTA));
BEGIN_BATCH(4);
OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE);
OUT_BATCH(MI_NOOP);
OUT_BATCH(MI_OVERLAY_FLIP | MI_OVERLAY_FLIP_CONTINUE);
- OUT_BATCH(flip_addr);
+ if (pI830->use_ttm_batch) {
+ OUT_RELOC(pI830->overlay_regs_bo, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, flip_addr);
+ } else {
+ OUT_BATCH(flip_addr);
+ }
ADVANCE_BATCH();
OVERLAY_DEBUG("overlay_continue\n");
}
@@ -524,7 +577,7 @@ static void
i830_overlay_off(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
- I830OverlayRegPtr overlay = I830OVERLAYREG(pI830);
+ I830OverlayRegPtr overlay;
if (!*pI830->overlayOn)
return;
@@ -548,17 +601,24 @@ i830_overlay_off(ScrnInfoPtr pScrn)
* Turn overlay off
*/
{
+ overlay = overlay_reg_prepare(pI830);
overlay->OCMD &= ~OVERLAY_ENABLE;
- OVERLAY_DEBUG ("overlay_off cmd 0x%08" PRIx32 " -> 0x%08" PRIx32 " sta 0x%08" PRIx32 "\n",
- overlay->OCMD, INREG(OCMD_REGISTER), INREG(DOVSTA));
+ // OVERLAY_DEBUG ("overlay_off cmd 0x%08lx -> 0x%08lx sta 0x%08lx\n",
+ // overlay->OCMD, INREG(OCMD_REGISTER), INREG(DOVSTA));
+ overlay_reg_finish(pI830);
+
BEGIN_BATCH(6);
OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE);
OUT_BATCH(MI_NOOP);
OUT_BATCH(MI_OVERLAY_FLIP | MI_OVERLAY_FLIP_CONTINUE);
- if (OVERLAY_NOPHYSICAL(pI830)) {
- OUT_BATCH(pI830->overlay_regs->offset);
+ if (pI830->use_ttm_batch) {
+ OUT_RELOC(pI830->overlay_regs_bo, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, 0);
} else {
- OUT_BATCH(pI830->overlay_regs->bus_addr);
+ if (OVERLAY_NOPHYSICAL(pI830)) {
+ OUT_BATCH(pI830->overlay_regs->offset);
+ } else {
+ OUT_BATCH(pI830->overlay_regs->bus_addr);
+ }
}
OUT_BATCH(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
OUT_BATCH(MI_NOOP);
@@ -627,7 +687,7 @@ I830InitVideo(ScreenPtr pScreen)
/* Set up overlay video if we can do it at this depth. */
if (!IS_I965G(pI830) && pScrn->bitsPerPixel != 8 &&
- pI830->overlay_regs != NULL)
+ (pI830->overlay_regs != NULL || pI830->overlay_regs_bo != NULL))
{
overlayAdaptor = I830SetupImageVideoOverlay(pScreen);
if (overlayAdaptor != NULL) {
@@ -651,14 +711,14 @@ I830ResetVideo(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
- I830OverlayRegPtr overlay = I830OVERLAYREG(pI830);
+ I830OverlayRegPtr overlay;
OVERLAY_DEBUG("I830ResetVideo: base: %p, offset: 0x%lx, obase: %p\n",
pI830->FbBase, pI830->overlay_regs->offset, overlay);
/*
* Default to maximum image size in YV12
*/
-
+ overlay = overlay_reg_prepare(pI830);
memset(overlay, 0, sizeof(*overlay));
overlay->YRGB_VPH = 0;
overlay->UV_VPH = 0;
@@ -713,6 +773,7 @@ I830ResetVideo(ScrnInfoPtr pScrn)
else
overlay->OCONFIG |= OVERLAY_PIPE_B;
+ overlay_reg_finish(pI830);
#if 0
/*
* XXX DUMP REGISTER CODE !!!
@@ -722,7 +783,7 @@ I830ResetVideo(ScrnInfoPtr pScrn)
{
int i;
for (i = 0x30000; i < 0x31000; i += 4)
- ErrorF("0x%x 0x%" PRIx32 "\n", i, INREG(i));
+ ErrorF("0x%x 0x%lx\n", i, INREG(i));
}
#endif
}
@@ -786,33 +847,41 @@ I830UpdateGamma(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
- CARD32 gamma0 = pPriv->gamma0;
- CARD32 gamma1 = pPriv->gamma1;
- CARD32 gamma2 = pPriv->gamma2;
- CARD32 gamma3 = pPriv->gamma3;
- CARD32 gamma4 = pPriv->gamma4;
- CARD32 gamma5 = pPriv->gamma5;
+ CARD32 gamma[6] = { pPriv->gamma0, pPriv->gamma1, pPriv->gamma2,
+ pPriv->gamma3, pPriv->gamma4, pPriv->gamma5 };
#if 0
ErrorF ("Original gamma: 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n",
gamma0, gamma1, gamma2, gamma3, gamma4, gamma5);
#endif
- gamma1 = I830BoundGamma (gamma1, gamma0);
- gamma2 = I830BoundGamma (gamma2, gamma1);
- gamma3 = I830BoundGamma (gamma3, gamma2);
- gamma4 = I830BoundGamma (gamma4, gamma3);
- gamma5 = I830BoundGamma (gamma5, gamma4);
+ gamma[1] = I830BoundGamma (gamma[1], gamma[0]);
+ gamma[2] = I830BoundGamma (gamma[2], gamma[1]);
+ gamma[3] = I830BoundGamma (gamma[3], gamma[2]);
+ gamma[4] = I830BoundGamma (gamma[4], gamma[3]);
+ gamma[5] = I830BoundGamma (gamma[5], gamma[4]);
#if 0
ErrorF ("Bounded gamma: 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n",
gamma0, gamma1, gamma2, gamma3, gamma4, gamma5);
#endif
- OUTREG(OGAMC5, gamma5);
- OUTREG(OGAMC4, gamma4);
- OUTREG(OGAMC3, gamma3);
- OUTREG(OGAMC2, gamma2);
- OUTREG(OGAMC1, gamma1);
- OUTREG(OGAMC0, gamma0);
+ if (pI830->use_drm_mode) {
+
+ struct drm_i915_mmio io = {
+ .read_write = I915_MMIO_WRITE,
+ .reg = MMIO_REGS_GAMMA,
+ .data = gamma
+ };
+ drmCommandWriteRead(pI830->drmSubFD, DRM_I915_MMIO, &io, sizeof(io));
+
+ } else {
+
+ OUTREG(OGAMC5, gamma[5]);
+ OUTREG(OGAMC4, gamma[4]);
+ OUTREG(OGAMC3, gamma[3]);
+ OUTREG(OGAMC2, gamma[2]);
+ OUTREG(OGAMC1, gamma[1]);
+ OUTREG(OGAMC0, gamma[0]);
+ }
}
static XF86VideoAdaptorPtr
@@ -1081,7 +1150,8 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
I830Ptr pI830 = I830PTR(pScrn);
I830OverlayRegPtr overlay;
-
+ int ret;
+ int do_continue = 0;
if (pPriv->textured) {
/* XXX: Currently the brightness/saturation attributes aren't hooked up.
* However, apps expect them to be there, and the spec seems to let us
@@ -1090,32 +1160,40 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
return Success;
}
- overlay = I830OVERLAYREG(pI830);
+ overlay = overlay_reg_prepare(pI830);
if (attribute == xvBrightness) {
- if ((value < -128) || (value > 127))
- return BadValue;
+ if ((value < -128) || (value > 127)) {
+ ret = BadValue;
+ goto err;
+ }
pPriv->brightness = value;
overlay->OCLRC0 = (pPriv->contrast << 18) | (pPriv->brightness & 0xff);
OVERLAY_DEBUG("BRIGHTNESS\n");
- i830_overlay_continue (pScrn, FALSE);
+ do_continue = 1;
} else if (attribute == xvContrast) {
- if ((value < 0) || (value > 255))
- return BadValue;
+ if ((value < 0) || (value > 255)) {
+ ret = BadValue;
+ goto err;
+ }
pPriv->contrast = value;
overlay->OCLRC0 = (pPriv->contrast << 18) | (pPriv->brightness & 0xff);
OVERLAY_DEBUG("CONTRAST\n");
- i830_overlay_continue (pScrn, FALSE);
+ do_continue = 1;
} else if (attribute == xvSaturation) {
- if ((value < 0) || (value > 1023))
- return BadValue;
+ if ((value < 0) || (value > 1023)) {
+ ret = BadValue;
+ goto err;
+ }
pPriv->saturation = value;
overlay->OCLRC1 = pPriv->saturation;
- i830_overlay_continue (pScrn, FALSE);
+ do_continue = 1;
} else if (attribute == xvPipe) {
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- if ((value < -1) || (value > xf86_config->num_crtc))
- return BadValue;
+ if ((value < -1) || (value > xf86_config->num_crtc)) {
+ ret = BadValue;
+ goto err;
+ }
if (value < 0)
pPriv->desired_crtc = NULL;
else
@@ -1149,17 +1227,23 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
break;
}
OVERLAY_DEBUG("COLORKEY\n");
- i830_overlay_continue (pScrn, FALSE);
+ do_continue = 1;
REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
} else if(attribute == xvDoubleBuffer) {
- if ((value < 0) || (value > 1))
- return BadValue;
+ if ((value < 0) || (value > 1)) {
+ ret = BadValue;
+ goto err;
+ }
/* Do not allow buffer change while playing video */
if(!*pI830->overlayOn)
pPriv->doubleBuffer = value;
} else
return BadMatch;
+ overlay_reg_finish(pI830);
+ if (do_continue) {
+ i830_overlay_continue (pScrn, FALSE);
+ }
/* Ensure that the overlay is off, ready for updating */
if ((attribute == xvGamma0 ||
attribute == xvGamma1 ||
@@ -1172,6 +1256,9 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
}
return Success;
+ err:
+ overlay_reg_finish(pI830);
+ return ret;
}
static int
@@ -1805,7 +1892,7 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
{
I830Ptr pI830 = I830PTR(pScrn);
I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
- I830OverlayRegPtr overlay = I830OVERLAYREG(pI830);
+ I830OverlayRegPtr overlay;
unsigned int swidth, swidthy, swidthuv;
unsigned int mask, shift, offsety, offsetu;
int tmp;
@@ -1816,7 +1903,9 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
dstPitch);
#if VIDEO_DEBUG
+ overlay = overlay_reg_prepare(pI830);
CompareOverlay(pI830, (CARD32 *) overlay, 0x100);
+ overlay_reg_finish(pI830);
#endif
/*
@@ -1920,6 +2009,7 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
offsetu = pPriv->UBuf1offset;
}
+ overlay = overlay_reg_prepare(pI830);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
@@ -1962,16 +2052,33 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
dstBox->x1, dstBox->y1, dstBox->x2, dstBox->y2);
/* buffer locations */
- overlay->OBUF_0Y = pPriv->YBuf0offset;
- overlay->OBUF_0U = pPriv->UBuf0offset;
- overlay->OBUF_0V = pPriv->VBuf0offset;
- if(pPriv->doubleBuffer) {
+ if (pI830->use_ttm_batch) {
+ dri_emit_reloc(pI830->overlay_regs_bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_MEM_TT, pPriv->YBuf0offset,
+ offsetof(I830OverlayRegRec, OBUF_0Y), (dri_bo *)pPriv->buf);
+ dri_emit_reloc(pI830->overlay_regs_bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_MEM_TT, pPriv->UBuf0offset,
+ offsetof(I830OverlayRegRec, OBUF_0U), (dri_bo *)pPriv->buf);
+ dri_emit_reloc(pI830->overlay_regs_bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_MEM_TT, pPriv->VBuf0offset,
+ offsetof(I830OverlayRegRec, OBUF_0V), (dri_bo *)pPriv->buf);
+ if (pPriv->doubleBuffer) {
+ dri_emit_reloc(pI830->overlay_regs_bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_MEM_TT, pPriv->YBuf1offset,
+ offsetof(I830OverlayRegRec, OBUF_1Y), (dri_bo *)pPriv->buf);
+ dri_emit_reloc(pI830->overlay_regs_bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_MEM_TT, pPriv->UBuf1offset,
+ offsetof(I830OverlayRegRec, OBUF_1U), (dri_bo *)pPriv->buf);
+ dri_emit_reloc(pI830->overlay_regs_bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_MEM_TT, pPriv->VBuf1offset,
+ offsetof(I830OverlayRegRec, OBUF_1V), (dri_bo *)pPriv->buf);
+ }
+ } else {
+ overlay->OBUF_0Y = pPriv->YBuf0offset;
+ overlay->OBUF_0U = pPriv->UBuf0offset;
+ overlay->OBUF_0V = pPriv->VBuf0offset;
+ if(pPriv->doubleBuffer) {
overlay->OBUF_1Y = pPriv->YBuf1offset;
overlay->OBUF_1U = pPriv->UBuf1offset;
overlay->OBUF_1V = pPriv->VBuf1offset;
+ }
}
- OVERLAY_DEBUG("pos: 0x%" PRIx32 ", size: 0x%" PRIx32 "\n",
+ OVERLAY_DEBUG("pos: 0x%lx, size: 0x%lx\n",
overlay->DWINPOS, overlay->DWINSZ);
OVERLAY_DEBUG("dst: %d x %d, src: %d x %d\n", drw_w, drw_h, src_w, src_h);
@@ -2133,8 +2240,9 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
OCMD |= BUFFER1;
overlay->OCMD = OCMD;
- OVERLAY_DEBUG("OCMD is 0x%" PRIx32 "\n", OCMD);
+ OVERLAY_DEBUG("OCMD is 0x%lx\n", OCMD);
+ overlay_reg_finish(pI830);
/* make sure the overlay is on */
i830_overlay_on (pScrn);
/* and show this frame */
@@ -2435,7 +2543,7 @@ I830PutImage(ScrnInfoPtr pScrn,
/* Pick the idle buffer */
if (!pPriv->textured && *pI830->overlayOn && pPriv->doubleBuffer)
- pPriv->currentBuf = !((INREG(DOVSTA) & OC_BUF) >> 20);
+ pPriv->currentBuf = !((video_read_dovsta(pI830) & OC_BUF) >> 20);
/* copy data */
top = y1 >> 16;
@@ -2846,7 +2954,7 @@ I830DisplaySurface(XF86SurfacePtr surface,
/* Pick the idle buffer */
if (!pI830Priv->textured && *pI830->overlayOn && pI830Priv->doubleBuffer)
- pI830Priv->currentBuf = !((INREG(DOVSTA) & OC_BUF) >> 20);
+ pI830Priv->currentBuf = !((video_read_dovsta(pI830) & OC_BUF) >> 20);
i830_display_video(pScrn, crtc, surface->id, surface->width, surface->height,
surface->pitches[0], x1, y1, x2, y2, &dstBox,
More information about the xorg-commit
mailing list