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