xf86-video-ati: Branch 'master'

Alex Deucher agd5f at kemper.freedesktop.org
Tue Jul 14 11:07:14 PDT 2009


 src/radeon.h                     |    4 +
 src/radeon_textured_video.c      |   89 ++++++++++++++++++++++++---------------
 src/radeon_textured_videofuncs.c |   12 ++---
 src/radeon_video.c               |    4 -
 src/radeon_video.h               |    3 -
 5 files changed, 66 insertions(+), 46 deletions(-)

New commits:
commit 5473eeeb45468fd200fec49a8506281628a5e4b5
Author: Alex Deucher <alexdeucher at gmail.com>
Date:   Tue Jul 14 14:05:13 2009 -0400

    R3/4/5xx: only upload the bicubic texture once
    
    Upload the bicubic texture once during textured video init
    rather than once per frame.  Suggested by Michel Daenzer on
    IRC.

diff --git a/src/radeon.h b/src/radeon.h
index ad9a908..3c62fd9 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -999,6 +999,10 @@ typedef struct {
     Bool cs;
 #endif
 
+    /* Xv bicubic filtering */
+    struct radeon_bo *bicubic_bo;
+    void             *bicubic_memory;
+    int               bicubic_offset;
 } RADEONInfoRec, *RADEONInfoPtr;
 
 #define RADEONWaitForFifo(pScrn, entries)				\
diff --git a/src/radeon_textured_video.c b/src/radeon_textured_video.c
index 617f359..d034c33 100644
--- a/src/radeon_textured_video.c
+++ b/src/radeon_textured_video.c
@@ -332,16 +332,10 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn,
     }
 
     /* Bicubic filter loading */
-    if (pPriv->bicubic_memory == NULL && pPriv->bicubic_enabled) {
-	pPriv->bicubic_offset = radeon_legacy_allocate_memory(pScrn,
-						              &pPriv->bicubic_memory,
-						              sizeof(bicubic_tex_512), 64);
-	pPriv->bicubic_src_offset = pPriv->bicubic_offset;
-	if (pPriv->bicubic_offset == 0)
-		pPriv->bicubic_enabled = FALSE;
-
-	if (info->cs)
-	    pPriv->bicubic_bo = pPriv->bicubic_memory;
+    if (pPriv->bicubic_enabled) {
+	if (info->bicubic_offset == 0)
+	    pPriv->bicubic_enabled = FALSE;
+	pPriv->bicubic_src_offset = info->bicubic_offset;
     }
 
     if (pDraw->type == DRAWABLE_WINDOW)
@@ -375,9 +369,9 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn,
 	int ret;
 	radeon_bo_wait(pPriv->src_bo);
 	ret = radeon_bo_map(pPriv->src_bo, 1);
-	if (ret) 
+	if (ret)
 	    return BadAlloc;
-	
+
 	pPriv->src_addr = pPriv->src_bo->ptr;
     } else {
 	pPriv->src_addr = (uint8_t *)(info->FB + pPriv->video_offset);
@@ -448,27 +442,6 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn,
 	break;
     }
 
-    /* Upload bicubic filter tex */
-    if (pPriv->bicubic_enabled) {
-	if (info->ChipFamily < CHIP_FAMILY_R600) {
-	    uint8_t *bicubic_addr;
-	    int ret;
-	    if (info->cs) {
-		radeon_bo_wait(pPriv->bicubic_bo);
-		ret = radeon_bo_map(pPriv->bicubic_bo, 1);
-		if (ret)
-		    return BadAlloc;
-
-		bicubic_addr = pPriv->bicubic_bo->ptr;
-	    } else
-		bicubic_addr = (uint8_t *)(info->FB + pPriv->bicubic_offset);
-
-	    RADEONCopyData(pScrn, (uint8_t *)bicubic_tex_512, bicubic_addr, 1024, 1024, 1, 512, 2);
-	   if (info->cs)
-	       radeon_bo_unmap(pPriv->bicubic_bo);
-	}
-    }
-
     /* update cliplist */
     if (!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) {
 	REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
@@ -698,6 +671,53 @@ RADEONSetTexPortAttribute(ScrnInfoPtr  pScrn,
     return Success;
 }
 
+static Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn)
+{
+    RADEONInfoPtr    info = RADEONPTR(pScrn);
+
+    /* Bicubic filter loading */
+    info->bicubic_offset = radeon_legacy_allocate_memory(pScrn,
+							 &info->bicubic_memory,
+							 sizeof(bicubic_tex_512), 64);
+    if (info->bicubic_offset == 0)
+	return FALSE;
+
+    if (info->cs)
+	info->bicubic_bo = info->bicubic_memory;
+
+    /* Upload bicubic filter tex */
+    if (info->ChipFamily < CHIP_FAMILY_R600) {
+	uint8_t *bicubic_addr;
+	int ret;
+	if (info->cs) {
+	    radeon_bo_wait(info->bicubic_bo);
+	    ret = radeon_bo_map(info->bicubic_bo, 1);
+	    if (ret)
+		return FALSE;
+
+	    bicubic_addr = info->bicubic_bo->ptr;
+	} else
+	    bicubic_addr = (uint8_t *)(info->FB + info->bicubic_offset);
+
+	RADEONCopyData(pScrn, (uint8_t *)bicubic_tex_512, bicubic_addr, 1024, 1024, 1, 512, 2);
+	if (info->cs)
+	    radeon_bo_unmap(info->bicubic_bo);
+    }
+    return TRUE;
+}
+
+/* XXX */
+static void radeon_unload_bicubic_texture(ScrnInfoPtr pScrn)
+{
+    RADEONInfoPtr    info = RADEONPTR(pScrn);
+
+    if (info->bicubic_memory != NULL) {
+	radeon_legacy_free_memory(pScrn, info->bicubic_memory);
+	info->bicubic_memory = NULL;
+    }
+
+}
+
 XF86VideoAdaptorPtr
 RADEONSetupImageTexturedVideo(ScreenPtr pScreen)
 {
@@ -795,6 +815,9 @@ RADEONSetupImageTexturedVideo(ScreenPtr pScreen)
 	adapt->pPortPrivates[i].ptr = (pointer) (pPriv);
     }
 
+    if (IS_R500_3D || IS_R300_3D)
+	radeon_load_bicubic_texture(pScrn);
+
     return adapt;
 }
 
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index 280a799..95db7d5 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -110,7 +110,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
         radeon_cs_space_add_persistent_bo(info->cs, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	if (pPriv->bicubic_enabled)
-	    radeon_cs_space_add_persistent_bo(info->cs, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
+	    radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	driver_priv = exaGetPixmapDriverPrivate(pPixmap);
 	radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
@@ -499,7 +499,7 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
         radeon_cs_space_add_persistent_bo(info->cs, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	if (pPriv->bicubic_enabled)
-	    radeon_cs_space_add_persistent_bo(info->cs, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
+	    radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	driver_priv = exaGetPixmapDriverPrivate(pPixmap);
 	radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
@@ -1041,7 +1041,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
 	radeon_cs_space_add_persistent_bo(info->cs, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	if (pPriv->bicubic_enabled)
-	  radeon_cs_space_add_persistent_bo(info->cs, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
+	  radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	driver_priv = exaGetPixmapDriverPrivate(pPixmap);
 	radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
@@ -1227,7 +1227,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
 	OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0);
 	OUT_ACCEL_REG(R300_TX_FORMAT1_1, txformat1);
 	OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch);
-	OUT_TEXTURE_REG(R300_TX_OFFSET_1, bicubic_offset, pPriv->bicubic_bo);
+	OUT_TEXTURE_REG(R300_TX_OFFSET_1, bicubic_offset, info->bicubic_bo);
 	FINISH_ACCEL();
 
 	/* Enable tex 1 */
@@ -2492,7 +2492,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
 	radeon_cs_space_add_persistent_bo(info->cs, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	if (pPriv->bicubic_enabled)
-	    radeon_cs_space_add_persistent_bo(info->cs, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
+	    radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
 
 	driver_priv = exaGetPixmapDriverPrivate(pPixmap);
 	radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM);
@@ -2681,7 +2681,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
 	OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0);
 	OUT_ACCEL_REG(R300_TX_FORMAT1_1, txformat1);
 	OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch);
-	OUT_TEXTURE_REG(R300_TX_OFFSET_1, bicubic_offset, pPriv->bicubic_bo);
+	OUT_TEXTURE_REG(R300_TX_OFFSET_1, bicubic_offset, info->bicubic_bo);
 	FINISH_ACCEL();
 
 	/* Enable tex 1 */
diff --git a/src/radeon_video.c b/src/radeon_video.c
index 58b9d46..f1fe72b 100644
--- a/src/radeon_video.c
+++ b/src/radeon_video.c
@@ -1648,10 +1648,6 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
 
   if (pPriv->textured) {
       if (cleanup) {
-	  if (pPriv->bicubic_memory != NULL) {
-	      radeon_legacy_free_memory(pScrn, pPriv->bicubic_memory);
-	      pPriv->bicubic_memory = NULL;
-	  }
 	  if (pPriv->video_memory != NULL) {
 	      radeon_legacy_free_memory(pScrn, pPriv->video_memory);
 	      pPriv->video_memory = NULL;
diff --git a/src/radeon_video.h b/src/radeon_video.h
index aeb6441..989942c 100644
--- a/src/radeon_video.h
+++ b/src/radeon_video.h
@@ -94,8 +94,6 @@ typedef struct {
    int           planev_offset;
 
    /* bicubic filtering */
-   void         *bicubic_memory;
-   int           bicubic_offset;
    Bool          bicubic_enabled;
    uint32_t      bicubic_src_offset;
    int           bicubic_state;
@@ -122,7 +120,6 @@ typedef struct {
     int vsync;
 
     struct radeon_bo *src_bo;
-    struct radeon_bo *bicubic_bo;
 } RADEONPortPrivRec, *RADEONPortPrivPtr;
 
 /* Reference color space transform data */


More information about the xorg-commit mailing list