xf86-video-intel: src/common.h src/i830_hwmc.c src/i830_hwmc.h src/i830_video.c src/i965_video.c src/Makefile.am src/xvmc/intel_batchbuffer.h src/xvmc/intel_xvmc.c src/xvmc/intel_xvmc.h src/xvmc/Makefile.am

Nan hai Zou znh at kemper.freedesktop.org
Tue Nov 25 18:16:29 PST 2008


 src/Makefile.am              |    4 +
 src/common.h                 |    1 
 src/i830_hwmc.c              |    2 
 src/i830_hwmc.h              |    5 +-
 src/i830_video.c             |   17 +++++++
 src/i965_video.c             |    4 +
 src/xvmc/Makefile.am         |   98 +++++++++++++++++++++++++++++++++++++++++++
 src/xvmc/intel_batchbuffer.h |   37 +++++++++-------
 src/xvmc/intel_xvmc.c        |   16 +++++--
 src/xvmc/intel_xvmc.h        |    1 
 10 files changed, 160 insertions(+), 25 deletions(-)

New commits:
commit 2ec42f5eb083ef1d112544f897bbdea6bdacb925
Author: Zou Nan hai <nanhai.zou at intel.com>
Date:   Wed Nov 26 10:15:41 2008 +0800

      [965-xvmc] merge 965-xvmc branch to master

diff --git a/src/Makefile.am b/src/Makefile.am
index 232ac53..3fb30ff 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -73,7 +73,9 @@ INTEL_XVMC_SRCS = \
 	 i830_hwmc.h \
 	 i830_hwmc.c \
          i915_hwmc.c \
-         i915_hwmc.h
+         i915_hwmc.h \
+         i965_hwmc.c \
+         i965_hwmc.h
 
 
 intel_drv_la_SOURCES = \
diff --git a/src/common.h b/src/common.h
index 214932a..4a87acb 100644
--- a/src/common.h
+++ b/src/common.h
@@ -345,6 +345,7 @@ extern int I810_DEBUG;
 #define IS_GM45(pI810) (DEVICE_ID(pI810->PciInfo) == PCI_CHIP_GM45_GM)
 #define IS_G4X(pI810) (DEVICE_ID(pI810->PciInfo) == PCI_CHIP_IGD_E_G || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_G45_G || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_Q45_G || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_G41_G || IS_GM45(pI810))
 #define IS_I965GM(pI810) (DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_GM || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_GME)
+#define IS_965_Q(pI810) (DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_Q)
 #define IS_I965G(pI810) (DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_G || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_G35_G || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_Q || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I946_GZ || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_GM || DEVICE_ID(pI810->PciInfo) == PCI_CHIP_I965_GME || IS_G4X(pI810))
 #define IS_G33CLASS(pI810) (DEVICE_ID(pI810->PciInfo) == PCI_CHIP_G33_G ||\
  			    DEVICE_ID(pI810->PciInfo) == PCI_CHIP_Q35_G ||\
diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 787d93d..cd69a58 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -58,10 +58,8 @@ Bool intel_xvmc_probe(ScrnInfoPtr pScrn)
     if (IS_I9XX(pI830)) {
 	if (IS_I915(pI830))
 	    ret = intel_xvmc_set_driver(&i915_xvmc_driver);
-	/*
 	else
 	    ret = intel_xvmc_set_driver(&i965_xvmc_driver);
-	 */
     } else {
 	ErrorF("Your chipset doesn't support XvMC.\n");
 	return FALSE;
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index 4db9aea..72208d5 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -77,7 +77,8 @@ struct intel_xvmc_command {
     unsigned int subPicNo;
     unsigned int flags;
     unsigned int real_id;
-    unsigned int pad[6];
+    unsigned int surf_offset;
+    unsigned int pad[5];
 };
 
 #ifdef _INTEL_XVMC_SERVER_
@@ -98,7 +99,7 @@ struct intel_xvmc_driver {
 
 extern struct intel_xvmc_driver *xvmc_driver;
 extern struct intel_xvmc_driver i915_xvmc_driver;
-/* extern struct intel_xvmc_driver i965_xvmc_driver; */
+extern struct intel_xvmc_driver i965_xvmc_driver;
 
 extern Bool intel_xvmc_set_driver(struct intel_xvmc_driver *);
 extern Bool intel_xvmc_probe(ScrnInfoPtr);
diff --git a/src/i830_video.c b/src/i830_video.c
index 216ed47..a483031 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -2301,6 +2301,8 @@ I830PutImage(ScrnInfoPtr pScrn,
 	break;
 #ifdef INTEL_XVMC
     case FOURCC_XVMC:
+	srcPitch = (width + 0x3) & ~0x3;
+	srcPitch2 = ((width >> 1) + 0x3) & ~0x3;
 	break;
 #endif
     case FOURCC_UYVY:
@@ -2459,6 +2461,13 @@ I830PutImage(ScrnInfoPtr pScrn,
 	break;
 #ifdef INTEL_XVMC
     case FOURCC_XVMC:
+	if (pPriv->rotation != RR_Rotate_0) {
+	    top &= ~1;
+	    nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top;
+	    I830CopyPlanarData(pScrn, pPriv, buf, srcPitch, srcPitch2, dstPitch,
+		    height, top, left, nlines, npixels, id);
+	}
+
 	break;
 #endif
     default:
@@ -2499,6 +2508,14 @@ I830PutImage(ScrnInfoPtr pScrn,
 	    i830_fill_colorkey (pScreen, pPriv->colorKey, clipBoxes);
 	}
     } else if (IS_I965G(pI830)) {
+
+#ifdef INTEL_XVMC
+	if (id == FOURCC_XVMC && pPriv->rotation == RR_Rotate_0) {
+	    pPriv->YBuf0offset = buf -  pI830->FbBase;
+	    pPriv->UBuf0offset = pPriv->YBuf0offset + height*width; 
+	    pPriv->VBuf0offset = pPriv->UBuf0offset + height*width/4; 
+	}
+#endif
 	I965DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
 				 dstPitch, x1, y1, x2, y2,
 				 src_w, src_h, drw_w, drw_h, pPixmap);
diff --git a/src/i965_video.c b/src/i965_video.c
index 37eebb3..6c295a6 100644
--- a/src/i965_video.c
+++ b/src/i965_video.c
@@ -37,6 +37,7 @@
 
 #include "i830.h"
 #include "i830_video.h"
+#include "i830_hwmc.h"
 #include "brw_defines.h"
 #include "brw_structs.h"
 #include <string.h>
@@ -248,6 +249,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
 	src_pitch[0] = video_pitch;
 	n_src_surf = 1;
 	break;
+#ifdef INTEL_XVMC
+    case FOURCC_XVMC:
+#endif
     case FOURCC_I420:
     case FOURCC_YV12:
 	src_surf_format = BRW_SURFACEFORMAT_R8_UNORM;
diff --git a/src/xvmc/Makefile.am b/src/xvmc/Makefile.am
index 2f75cc5..9ecd1dc 100644
--- a/src/xvmc/Makefile.am
+++ b/src/xvmc/Makefile.am
@@ -16,6 +16,8 @@ libIntelXvMC_la_SOURCES = intel_xvmc.c \
 			 i915_program.h \
 			 i915_xvmc.c \
                          i915_xvmc.h \
+			 i965_xvmc.c \
+			 i965_xvmc.h \
                          intel_batchbuffer.c \
                          intel_batchbuffer.h \
                          xf86dri.c \
@@ -26,4 +28,100 @@ libIntelXvMC_la_CFLAGS = @XORG_CFLAGS@ @DRM_CFLAGS@ @DRI_CFLAGS@ \
 	@XVMCLIB_CFLAGS@ -I$(top_srcdir)/src -DTRUE=1 -DFALSE=0
 libIntelXvMC_la_LDFLAGS = -version-number 1:0:0
 libIntelXvMC_la_LIBADD = @DRI_LIBS@
+INTEL_G4A = \
+	     dual_prime_igd.g4a              \
+	     field_backward_igd.g4a          \
+	     field_f_b_igd.g4a               \
+	     field_forward_igd.g4a           \
+	     frame_backward_igd.g4a          \
+	     frame_f_b_igd.g4a               \
+	     frame_forward_igd.g4a           \
+	     dual_prime.g4a              \
+	     field_backward.g4a          \
+	     field_f_b.g4a               \
+	     field_forward.g4a           \
+	     frame_backward.g4a          \
+	     frame_f_b.g4a               \
+	     frame_forward.g4a           \
+	     ipicture.g4a                \
+	     null.g4a
+
+INTEL_G4I = \
+	    addidct.g4i         \
+	    block_clear.g4i     \
+	    read_frame_x0y0_y.g4i \
+	    read_frame_x0y1_y.g4i \
+	    read_frame_x1y0_y.g4i \
+	    read_frame_x1y1_y.g4i \
+	    read_frame_x0y0_uv.g4i \
+	    read_frame_x0y1_uv.g4i \
+	    read_frame_x1y0_uv.g4i \
+	    read_frame_x1y1_uv.g4i \
+	    read_frame_x0y0_y_igd.g4i \
+	    read_frame_x0y1_y_igd.g4i \
+	    read_frame_x1y0_y_igd.g4i \
+	    read_frame_x1y1_y_igd.g4i \
+	    read_frame_x0y0_uv_igd.g4i \
+	    read_frame_x0y1_uv_igd.g4i \
+	    read_frame_x1y0_uv_igd.g4i \
+	    read_frame_x1y1_uv_igd.g4i \
+	    motion_frame_y.g4i         \
+	    motion_frame_uv.g4i        \
+	    read_field_x0y0_y.g4i                    \
+	    read_field_x0y1_y.g4i                    \
+	    read_field_x1y0_y.g4i                    \
+	    read_field_x1y1_y.g4i                    \
+	    read_field_x0y0_uv.g4i                   \
+	    read_field_x0y1_uv.g4i                   \
+	    read_field_x1y0_uv.g4i                   \
+	    read_field_x1y1_uv.g4i                   \
+	    read_field_x0y0_y_igd.g4i                    \
+	    read_field_x0y1_y_igd.g4i                    \
+	    read_field_x1y0_y_igd.g4i                    \
+	    read_field_x1y1_y_igd.g4i                    \
+	    read_field_x0y0_uv_igd.g4i                   \
+	    read_field_x0y1_uv_igd.g4i                   \
+	    read_field_x1y0_uv_igd.g4i                   \
+	    read_field_x1y1_uv_igd.g4i                   \
+	    motion_field_y.g4i                       \
+	    motion_field_uv.g4i
+
+
+INTEL_G4B = \
+	    dual_prime.g4b              \
+	    field_backward.g4b          \
+	    field_f_b.g4b               \
+	    field_forward.g4b           \
+	    frame_backward.g4b          \
+	    frame_f_b.g4b               \
+	    frame_forward.g4b           \
+	    dual_prime_igd.g4b              \
+	    field_backward_igd.g4b          \
+	    field_f_b_igd.g4b               \
+	    field_forward_igd.g4b           \
+	    frame_backward_igd.g4b          \
+	    frame_f_b_igd.g4b               \
+	    frame_forward_igd.g4b           \
+	    ipicture.g4b                \
+	    null.g4b
+
+		 
+EXTRA_DIST =  \
+	      $(INTEL_G4A)  \
+	      $(INTEL_G4I)  \
+	      $(INTEL_G4B)    
+
+if HAVE_GEN4ASM
+
+SUFFIXES = .g4a .g4b
+.g4a.g4b:
+	m4 $*.g4a > $*.g4m && intel-gen4asm -o $@ $*.g4m && rm $*.g4m
+
+$(INTEL_G4B): $(INTEL_G4I)
+	BUILT_SOURCES= $(INTEL_G4B)
+
+clean-local:
+	-rm -f $(INTEL_G4B)
+endif
+
 endif
diff --git a/src/xvmc/intel_batchbuffer.h b/src/xvmc/intel_batchbuffer.h
index aec71e4..d4d8037 100644
--- a/src/xvmc/intel_batchbuffer.h
+++ b/src/xvmc/intel_batchbuffer.h
@@ -6,32 +6,37 @@
 extern int VERBOSE;
 #endif
 
-#define BATCH_LOCALS    char *batch_ptr;
+#define BATCH_LOCALS    unsigned char *batch_ptr;
 
 #define BEGIN_BATCH(n)                                                  \
     do {                                                                \
-        if (VERBOSE) fprintf(stderr,                                    \
-                             "BEGIN_BATCH(%ld) in %s, %d dwords free\n", \
-                             ((unsigned long)n), __FUNCTION__,          \
-                             xvmc_driver->batch.space/4);                     \
-        if (xvmc_driver->batch.space < (n)*4)                                 \
-            intelFlushBatch(TRUE);                            \
-        batch_ptr = xvmc_driver->batch.ptr;                                   \
+        if (xvmc_driver->batch.space < (n)*4)                           \
+            intelFlushBatch(TRUE);                            		\
+        batch_ptr = xvmc_driver->batch.ptr;                             \
     } while (0)
 
 #define OUT_BATCH(n)                                                    \
     do {                                                                \
-        *(GLuint *)batch_ptr = (n);                                     \
-        if (VERBOSE) fprintf(stderr, " -- %08x at %s/%d\n", (n), __FILE__, __LINE__); \
+        *(unsigned int *)batch_ptr = (n);                               \
         batch_ptr += 4;                                                 \
     } while (0)
 
-#define ADVANCE_BATCH()                                        \
-    do {                                                       \
-        if (VERBOSE) fprintf(stderr, "ADVANCE_BATCH()\n");     \
-        xvmc_driver->batch.space -= (batch_ptr - xvmc_driver->batch.ptr);  \
-        xvmc_driver->batch.ptr = batch_ptr;                          \
-        assert(xvmc_driver->batch.space >= 0);                       \
+#define OUT_BATCH_SHORT(n)                                              \
+    do {                                                                \
+        *(short *)batch_ptr = (n);                                      \
+        batch_ptr += 2;                                                 \
+    } while (0)
+
+#define OUT_BATCH_CHAR(n)                                               \
+	do {                                                                \
+		*(char *)batch_ptr = (n);                                       \
+		batch_ptr ++;                                                   \
+	} while (0)
+#define ADVANCE_BATCH()                                                  \
+    do {                                                                 \
+        xvmc_driver->batch.space -= (batch_ptr - xvmc_driver->batch.ptr);\
+        xvmc_driver->batch.ptr = batch_ptr;                              \
+        assert(xvmc_driver->batch.space >= 0);                           \
     } while(0)
 
 extern void intelFlushBatch(Bool);
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index ea39069..9ca6f6c 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -341,6 +341,8 @@ Status XvMCCreateContext(Display *display, XvPortID port,
 		xvmc_driver = &i915_xvmc_mc_driver;
 		break;
 	    case XVMC_I965_MPEG2_MC:
+		xvmc_driver = &i965_xvmc_mc_driver;
+		break;
 	    case XVMC_I945_MPEG2_VLD:
 	    case XVMC_I965_MPEG2_VLD:
 	    default:
@@ -578,12 +580,13 @@ Status XvMCCreateBlocks(Display *display, XvMCContext *context,
                         unsigned int num_blocks,
                         XvMCBlockArray *block)
 {
+    Status ret;
     if (!display || !context || !num_blocks || !block)
         return BadValue;
 
     memset(block, 0, sizeof(XvMCBlockArray));
 
-    if (!(block->blocks = (short *)malloc(num_blocks << 6 * sizeof(short))))
+    if (!(block->blocks = (short *)malloc((num_blocks << 6) * sizeof(short))))
         return BadAlloc;
 
     block->num_blocks = num_blocks;
@@ -598,6 +601,7 @@ Status XvMCCreateBlocks(Display *display, XvMCContext *context,
  */
 Status XvMCDestroyBlocks(Display *display, XvMCBlockArray *block)
 {
+    Status ret;
     if (!display || !block)
         return BadValue;
 
@@ -750,19 +754,23 @@ Status XvMCPutSurface(Display *display,XvMCSurface *surface,
 	intel_surf->gc = XCreateGC(display, draw, 0, NULL);
     }
     intel_surf->last_draw = draw;
-
     /* fill intel_surf->data */
+    if (0)
+    {
+	drmVBlank vbl;
+	vbl.request.type = DRM_VBLANK_RELATIVE;
+	vbl.request.sequence = 1;
+	drmWaitVBlank(xvmc_driver->fd, &vbl);
+    }
     ret = (xvmc_driver->put_surface)(display, surface, draw, srcx, srcy,
 	    srcw, srch, destx, desty, destw, desth, flags, &intel_surf->data);
     if (ret) {
 	XVMC_ERR("put surface fail\n");
 	return ret;
     }
-
     ret = XvPutImage(display, context->port, draw, intel_surf->gc,
 	    intel_surf->image, srcx, srcy, srcw, srch, destx, desty,
 	    destw, desth);
-
     return ret;
 }
 
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index c4dfd77..9ef2121 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -201,6 +201,7 @@ typedef struct _intel_xvmc_driver {
 } intel_xvmc_driver_t, *intel_xvmc_driver_ptr;
 
 extern struct _intel_xvmc_driver i915_xvmc_mc_driver;
+extern struct _intel_xvmc_driver i965_xvmc_mc_driver;
 extern struct _intel_xvmc_driver *xvmc_driver;
 
 #define SET_BLOCKED_SIGSET()   do {    \


More information about the xorg-commit mailing list