diff --git a/src/atombios_crtc.c b/src/atombios_crtc.c index 4e2395f..11f5ea2 100644 --- a/src/atombios_crtc.c +++ b/src/atombios_crtc.c @@ -505,6 +505,10 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc, OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, (mode->HDisplay << 16) | mode->VDisplay); + OUTREG(AVIVO_D1MODE_VLINE_START_END + radeon_crtc->crtc_offset, + ((0 << AVIVO_D1MODE_VLINE_START_SHIFT) | + (mode->VDisplay << AVIVO_D1MODE_VLINE_END_SHIFT))); + if (adjusted_mode->Flags & V_INTERLACE) OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, AVIVO_D1MODE_INTERLEAVE_EN); diff --git a/src/legacy_crtc.c b/src/legacy_crtc.c index 75ab6c8..ec4986f 100644 --- a/src/legacy_crtc.c +++ b/src/legacy_crtc.c @@ -133,6 +133,8 @@ RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, OUTREG(RADEON_CRTC_V_TOTAL_DISP, restore->crtc_v_total_disp); OUTREG(RADEON_CRTC_V_SYNC_STRT_WID, restore->crtc_v_sync_strt_wid); + OUTREG(RADEON_CRTC_GUI_TRIG_VLINE, restore->crtc_gui_trig_vline); + if (IS_R300_VARIANT) OUTREG(R300_CRTC_TILE_X0_Y0, restore->crtc_tile_x0_y0); OUTREG(RADEON_CRTC_OFFSET_CNTL, restore->crtc_offset_cntl); @@ -180,6 +182,8 @@ RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, OUTREG(RADEON_FP_H2_SYNC_STRT_WID, restore->fp_h2_sync_strt_wid); OUTREG(RADEON_FP_V2_SYNC_STRT_WID, restore->fp_v2_sync_strt_wid); + OUTREG(RADEON_CRTC2_GUI_TRIG_VLINE, restore->crtc2_gui_trig_vline); + if (IS_R300_VARIANT) OUTREG(R300_CRTC2_TILE_X0_Y0, restore->crtc2_tile_x0_y0); OUTREG(RADEON_CRTC2_OFFSET_CNTL, restore->crtc2_offset_cntl); @@ -518,6 +522,8 @@ RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) save->crtc_v_total_disp = INREG(RADEON_CRTC_V_TOTAL_DISP); save->crtc_v_sync_strt_wid = INREG(RADEON_CRTC_V_SYNC_STRT_WID); + save->crtc_gui_trig_vline = INREG(RADEON_CRTC_GUI_TRIG_VLINE); + save->crtc_offset = INREG(RADEON_CRTC_OFFSET); save->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL); save->crtc_pitch = INREG(RADEON_CRTC_PITCH); @@ -557,6 +563,8 @@ RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save) save->crtc2_offset_cntl = INREG(RADEON_CRTC2_OFFSET_CNTL); save->crtc2_pitch = INREG(RADEON_CRTC2_PITCH); + save->crtc2_gui_trig_vline = INREG(RADEON_CRTC2_GUI_TRIG_VLINE); + if (IS_R300_VARIANT) save->crtc2_tile_x0_y0 = INREG(R300_CRTC2_TILE_X0_Y0); @@ -946,6 +954,9 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, (pScrn->bitsPerPixel * 8)); save->crtc_pitch |= save->crtc_pitch << 16; + save->crtc_gui_trig_vline = ((0 << RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT) | + (mode->CrtcVDisplay << RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT)); + if (info->IsDellServer) { save->dac2_cntl = info->SavedReg->dac2_cntl; save->tv_dac_cntl = info->SavedReg->tv_dac_cntl; @@ -1137,6 +1148,9 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, ((pScrn->bitsPerPixel * 8) -1)) / (pScrn->bitsPerPixel * 8); save->crtc2_pitch |= save->crtc2_pitch << 16; + save->crtc2_gui_trig_vline = ((0 << RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT) | + (mode->CrtcVDisplay << RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT)); + /* check to see if TV DAC is enabled for another crtc and keep it enabled */ if (save->crtc2_gen_cntl & RADEON_CRTC2_CRT2_ON) save->crtc2_gen_cntl = RADEON_CRTC2_CRT2_ON; diff --git a/src/radeon.h b/src/radeon.h index f7ae1a8..5341c17 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -601,6 +601,9 @@ struct radeon_accel_state { /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ Bool src_tile_width; Bool src_tile_height; + + uint32_t render_offset; + uint32_t scan_offset; #endif #ifdef USE_XAA diff --git a/src/radeon_exa.c b/src/radeon_exa.c index 0f86fdd..907861b 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -176,6 +176,18 @@ static Bool RADEONGetOffsetPitch(PixmapPtr pPix, int bpp, uint32_t *pitch_offset return TRUE; } +/* swap in render offset */ +static uint32_t RADEONGetRenderOffset(PixmapPtr pPix) +{ + RINFO_FROM_SCREEN(pPix->drawable.pScreen); + + /* front buffer */ + if (exaGetPixmapOffset(pPix) == 0) + return info->accel_state->render_offset; + else + return exaGetPixmapOffset(pPix); +} + Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, uint32_t *pitch_offset) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); @@ -186,13 +198,12 @@ Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, uint32_t *pitch_offset) if (bpp == 24) bpp = 8; - offset = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; + offset = RADEONGetRenderOffset(pPix)/*exaGetPixmapOffset(pPix)*/ + info->fbLocation + pScrn->fbOffset; pitch = exaGetPixmapPitch(pPix); return RADEONGetOffsetPitch(pPix, bpp, pitch_offset, offset, pitch); } -#if X_BYTE_ORDER == X_BIG_ENDIAN static unsigned long swapper_surfaces[3]; @@ -204,6 +215,24 @@ static Bool RADEONPrepareAccess(PixmapPtr pPix, int index) int bpp, soff; uint32_t size, flags; + if (exaGetPixmapOffset(pPix) == 0) { + /* sync buffers */ + if (info->directRenderingEnabled) + RADEONSyncRenderBufferCP(pPix); + else + RADEONSyncRenderBufferMMIO(pPix); + + /* switch scanout to backbuffer */ + info->accel_state->render_offset = info->dri->backOffset; + info->accel_state->scan_offset = info->dri->frontOffset; + if (info->directRenderingEnabled) + RADEONFlipRenderBufferCP(pPix); + else + RADEONFlipRenderBufferMMIO(pPix); + /* do sw rendering to front buffer */ + } + +#if X_BYTE_ORDER == X_BIG_ENDIAN /* Front buffer is always set with proper swappers */ if (offset == 0) return TRUE; @@ -259,6 +288,8 @@ static Bool RADEONPrepareAccess(PixmapPtr pPix, int index) OUTREG(RADEON_SURFACE0_LOWER_BOUND + soff, offset); OUTREG(RADEON_SURFACE0_UPPER_BOUND + soff, offset + size - 1); swapper_surfaces[index] = offset; +#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ + return TRUE; } @@ -269,6 +300,22 @@ static void RADEONFinishAccess(PixmapPtr pPix, int index) uint32_t offset = exaGetPixmapOffset(pPix); int soff; + if (exaGetPixmapOffset(pPix) == 0) { + /* flip scan out back to front */ + if (info->directRenderingEnabled) + RADEONFlipRenderBufferCP(pPix); + else + RADEONFlipRenderBufferMMIO(pPix); + + /* sync render buffer with sw changes */ + if (info->directRenderingEnabled) + RADEONSyncRenderBufferCP(pPix); + else + RADEONSyncRenderBufferMMIO(pPix); + + } + +#if X_BYTE_ORDER == X_BIG_ENDIAN /* Front buffer is always set with proper swappers */ if (offset == 0) return; @@ -291,9 +338,10 @@ static void RADEONFinishAccess(PixmapPtr pPix, int index) OUTREG(RADEON_SURFACE0_LOWER_BOUND + soff, 0); OUTREG(RADEON_SURFACE0_UPPER_BOUND + soff, 0); swapper_surfaces[index] = 0; +#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ + } -#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ #define RADEON_SWITCH_TO_2D() \ do { \ diff --git a/src/radeon_exa_funcs.c b/src/radeon_exa_funcs.c index 62224d0..6c403a5 100644 --- a/src/radeon_exa_funcs.c +++ b/src/radeon_exa_funcs.c @@ -58,6 +58,8 @@ #include "exa.h" +void FUNC_NAME(RADEONSyncRenderBuffer)(PixmapPtr pPix); + static int FUNC_NAME(RADEONMarkSync)(ScreenPtr pScreen) { @@ -84,6 +86,54 @@ FUNC_NAME(RADEONSync)(ScreenPtr pScreen, int marker) RADEONPTR(pScrn)->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; } +static void +FUNC_NAME(RADEONDone2D)(PixmapPtr pPix) +{ + RINFO_FROM_SCREEN(pPix->drawable.pScreen); + ACCEL_PREAMBLE(); + + TRACE; + + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); +} + +void FUNC_NAME(RADEONFlipRenderBuffer)(PixmapPtr pPix) +{ + RINFO_FROM_SCREEN(pPix->drawable.pScreen); + uint32_t tmp = info->accel_state->scan_offset; + ACCEL_PREAMBLE(); + + TRACE; + + if (exaGetPixmapOffset(pPix) == 0) { + /* switch render buffer to scan buffer */ + info->accel_state->scan_offset = info->accel_state->render_offset; + info->accel_state->render_offset = tmp; + + /* write new scan base */ + /* XXX: FIXME deal with multiple crtcs */ + if (IS_AVIVO_VARIANT) { + BEGIN_ACCEL(3); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, (RADEON_WAIT_FE_CRTC_VLINE | + RADEON_ENG_DISPLAY_SELECT_CRTC0)); + OUT_ACCEL_REG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS, + info->accel_state->scan_offset + pScrn->fbOffset + info->fbLocation); + OUT_ACCEL_REG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS, + info->accel_state->scan_offset + pScrn->fbOffset + info->fbLocation); + } else { + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, (RADEON_WAIT_FE_CRTC_VLINE | + RADEON_ENG_DISPLAY_SELECT_CRTC0)); + OUT_ACCEL_REG(RADEON_CRTC_OFFSET, info->accel_state->scan_offset); + } + FINISH_ACCEL(); + } +} + static Bool FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) { @@ -100,6 +150,8 @@ FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) if (!RADEONGetPixmapOffsetPitch(pPix, &dst_pitch_offset)) RADEON_FALLBACK(("RADEONGetPixmapOffsetPitch failed\n")); + FUNC_NAME(RADEONSyncRenderBuffer)(pPix); + RADEON_SWITCH_TO_2D(); BEGIN_ACCEL(5); @@ -120,7 +172,6 @@ FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) return TRUE; } - static void FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2) { @@ -139,15 +190,12 @@ static void FUNC_NAME(RADEONDoneSolid)(PixmapPtr pPix) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); - ACCEL_PREAMBLE(); TRACE; - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); + FUNC_NAME(RADEONDone2D)(pPix); + FUNC_NAME(RADEONFlipRenderBuffer)(pPix); + } void @@ -190,9 +238,6 @@ FUNC_NAME(RADEONPrepareCopy)(PixmapPtr pSrc, PixmapPtr pDst, TRACE; - info->accel_state->xdir = xdir; - info->accel_state->ydir = ydir; - if (pDst->drawable.bitsPerPixel == 24) RADEON_FALLBACK(("24bpp unsupported")); if (!RADEONGetDatatypeBpp(pDst->drawable.bitsPerPixel, &datatype)) @@ -202,6 +247,11 @@ FUNC_NAME(RADEONPrepareCopy)(PixmapPtr pSrc, PixmapPtr pDst, if (!RADEONGetPixmapOffsetPitch(pDst, &dst_pitch_offset)) RADEON_FALLBACK(("RADEONGetPixmapOffsetPitch dest failed\n")); + FUNC_NAME(RADEONSyncRenderBuffer)(pDst); + + info->accel_state->xdir = xdir; + info->accel_state->ydir = ydir; + FUNC_NAME(RADEONDoPrepareCopy)(pScrn, src_pitch_offset, dst_pitch_offset, datatype, rop, planemask); @@ -241,15 +291,40 @@ static void FUNC_NAME(RADEONDoneCopy)(PixmapPtr pDst) { RINFO_FROM_SCREEN(pDst->drawable.pScreen); - ACCEL_PREAMBLE(); TRACE; - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); + FUNC_NAME(RADEONDone2D)(pDst); + FUNC_NAME(RADEONFlipRenderBuffer)(pDst); +} + +/* blit front to render pixmap */ +void FUNC_NAME(RADEONSyncRenderBuffer)(PixmapPtr pPix) +{ + RINFO_FROM_SCREEN(pPix->drawable.pScreen); + uint32_t datatype; + uint32_t pitch = exaGetPixmapPitch(pPix); + uint32_t src_pitch_offset, src_offset; + uint32_t dst_pitch_offset, dst_offset; + int w = pScrn->virtualX; + int h = pScrn->virtualY; + + if (exaGetPixmapOffset(pPix) == 0) { + src_offset = info->accel_state->scan_offset + info->fbLocation + pScrn->fbOffset; + dst_offset = info->accel_state->render_offset + info->fbLocation + pScrn->fbOffset; + + info->accel_state->xdir = 0; + info->accel_state->ydir = 0; + + RADEONGetDatatypeBpp(pPix->drawable.bitsPerPixel, &datatype); + RADEONGetOffsetPitch(pPix, pPix->drawable.bitsPerPixel, &src_pitch_offset, src_offset, pitch); + RADEONGetOffsetPitch(pPix, pPix->drawable.bitsPerPixel, &dst_pitch_offset, dst_offset, pitch); + + FUNC_NAME(RADEONDoPrepareCopy)(pScrn, src_pitch_offset, dst_pitch_offset, + datatype, 3, 0xffffffff); + FUNC_NAME(RADEONCopy)(pPix, 0, 0, 0, 0, w, h); + FUNC_NAME(RADEONDone2D)(pPix); + } } static Bool @@ -276,6 +351,8 @@ FUNC_NAME(RADEONUploadToScreen)(PixmapPtr pDst, int x, int y, int w, int h, if (bpp < 8) return FALSE; + FUNC_NAME(RADEONSyncRenderBuffer)(pDst); + #ifdef ACCEL_CP if (info->directRenderingEnabled && RADEONGetPixmapOffsetPitch(pDst, &dst_pitch_off)) { @@ -293,6 +370,8 @@ FUNC_NAME(RADEONUploadToScreen)(PixmapPtr pDst, int x, int y, int w, int h, } exaMarkSync(pDst->drawable.pScreen); + FUNC_NAME(RADEONDone2D)(pDst); + FUNC_NAME(RADEONFlipRenderBuffer)(pDst); return TRUE; } #endif @@ -329,6 +408,8 @@ FUNC_NAME(RADEONUploadToScreen)(PixmapPtr pDst, int x, int y, int w, int h, OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); #endif + FUNC_NAME(RADEONDone2D)(pDst); + FUNC_NAME(RADEONFlipRenderBuffer)(pDst); return TRUE; } @@ -388,6 +469,9 @@ FUNC_NAME(RADEONDownloadFromScreen)(PixmapPtr pSrc, int x, int y, int w, int h, TRACE; + if (exaGetPixmapOffset(pSrc) == 0) + FUNC_NAME(RADEONSyncRenderBuffer)(pSrc); + #ifdef ACCEL_CP /* * Try to accelerate download. Use an indirect buffer as scratch space, @@ -543,10 +627,8 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen) info->accel_state->exa->UploadToScreen = FUNC_NAME(RADEONUploadToScreen); info->accel_state->exa->DownloadFromScreen = FUNC_NAME(RADEONDownloadFromScreen); -#if X_BYTE_ORDER == X_BIG_ENDIAN info->accel_state->exa->PrepareAccess = RADEONPrepareAccess; info->accel_state->exa->FinishAccess = RADEONFinishAccess; -#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ info->accel_state->exa->flags = EXA_OFFSCREEN_PIXMAPS; info->accel_state->exa->pixmapOffsetAlign = RADEON_BUFFER_ALIGN + 1; @@ -605,6 +687,10 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen) #endif info->accel_state->exa->maxY = 8192; + info->accel_state->render_offset = info->dri->backOffset; + info->accel_state->scan_offset = info->dri->frontOffset; + + RADEONEngineInit(pScrn); if (!exaDriverInit(pScreen, info->accel_state->exa)) { diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c index 97199ae..e30b94e 100644 --- a/src/radeon_exa_render.c +++ b/src/radeon_exa_render.c @@ -540,7 +540,9 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op, pixel_shift = pDst->drawable.bitsPerPixel >> 4; - dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + FUNC_NAME(RADEONSyncRenderBuffer)(pDst); + + dst_offset = RADEONGetRenderOffset(pDst) /*exaGetPixmapOffset(pDst)*/ + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pDst); colorpitch = dst_pitch >> pixel_shift; if (RADEONPixmapIsColortiled(pDst)) @@ -838,9 +840,11 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, else info->accel_state->has_mask = FALSE; + FUNC_NAME(RADEONSyncRenderBuffer)(pDst); + pixel_shift = pDst->drawable.bitsPerPixel >> 4; - dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + dst_offset = RADEONGetRenderOffset(pDst) /*exaGetPixmapOffset(pDst)*/ + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pDst); colorpitch = dst_pitch >> pixel_shift; if (RADEONPixmapIsColortiled(pDst)) @@ -1199,9 +1203,11 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, else info->accel_state->has_mask = FALSE; + FUNC_NAME(RADEONSyncRenderBuffer)(pDst); + pixel_shift = pDst->drawable.bitsPerPixel >> 4; - dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + dst_offset = RADEONGetRenderOffset(pDst) /*exaGetPixmapOffset(pDst)*/ + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pDst); colorpitch = dst_pitch >> pixel_shift; @@ -2128,6 +2134,8 @@ static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst) OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); FINISH_ACCEL(); + FUNC_NAME(RADEONFlipRenderBuffer)(pDst); + LEAVE_DRAW(0); } diff --git a/src/radeon_probe.h b/src/radeon_probe.h index c14241e..7ecfdb3 100644 --- a/src/radeon_probe.h +++ b/src/radeon_probe.h @@ -438,6 +438,7 @@ typedef struct { uint32_t crtc_h_sync_strt_wid; uint32_t crtc_v_total_disp; uint32_t crtc_v_sync_strt_wid; + uint32_t crtc_gui_trig_vline; uint32_t crtc_offset; uint32_t crtc_offset_cntl; uint32_t crtc_pitch; @@ -459,6 +460,7 @@ typedef struct { uint32_t crtc2_h_sync_strt_wid; uint32_t crtc2_v_total_disp; uint32_t crtc2_v_sync_strt_wid; + uint32_t crtc2_gui_trig_vline; uint32_t crtc2_offset; uint32_t crtc2_offset_cntl; uint32_t crtc2_pitch; diff --git a/src/radeon_reg.h b/src/radeon_reg.h index 19f9869..10d869e 100644 --- a/src/radeon_reg.h +++ b/src/radeon_reg.h @@ -401,6 +401,9 @@ # define RADEON_CRTC_H_CUTOFF_ACTIVE_EN (1<<4) # define RADEON_CRTC_V_CUTOFF_ACTIVE_EN (1<<5) #define RADEON_CRTC_GUI_TRIG_VLINE 0x0218 +# define RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT 0 +# define RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT 16 +# define RADEON_CRTC_GUI_TRIG_VLINE_INV (1 << 15) #define RADEON_CRTC_H_SYNC_STRT_WID 0x0204 # define RADEON_CRTC_H_SYNC_STRT_PIX (0x07 << 0) # define RADEON_CRTC_H_SYNC_STRT_CHAR (0x3ff << 3) @@ -3619,6 +3622,10 @@ #define AVIVO_D1MODE_DATA_FORMAT 0x6528 # define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) #define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652c +#define AVIVO_D1MODE_VLINE_START_END 0x6538 +# define AVIVO_D1MODE_VLINE_START_SHIFT 0 +# define AVIVO_D1MODE_VLINE_END_SHIFT 16 +# define AVIVO_D1MODE_VLINE_INV (1 << 31) #define AVIVO_D1MODE_VIEWPORT_START 0x6580 #define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584 #define AVIVO_D1MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6588 diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c index c5ad0e1..b52d4e1 100644 --- a/src/radeon_textured_videofuncs.c +++ b/src/radeon_textured_videofuncs.c @@ -109,7 +109,8 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv #ifdef USE_EXA if (info->useEXA) { - dst_offset = exaGetPixmapOffset(pPixmap) + info->fbLocation + pScrn->fbOffset; + FUNC_NAME(RADEONSyncRenderBuffer)(pPixmap); + dst_offset = RADEONGetRenderOffset(pPixmap) /*exaGetPixmapOffset(pPixmap)*/ + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pPixmap); } else #endif @@ -1244,6 +1245,11 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); FINISH_ACCEL(); +#ifdef USE_EXA + if (info->useEXA) + FUNC_NAME(RADEONFlipRenderBuffer)(pPixmap); +#endif + DamageDamageRegion(pPriv->pDraw, &pPriv->clip); }