summaryrefslogtreecommitdiff
path: root/Source/DirectFB/gfxdrivers/mach64
diff options
context:
space:
mode:
Diffstat (limited to 'Source/DirectFB/gfxdrivers/mach64')
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/Makefile.am39
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/Makefile.in603
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/mach64.c1640
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/mach64.h120
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/mach64_overlay.c724
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/mach64_state.c654
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/mach64_state.h90
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/mmio.h198
-rwxr-xr-xSource/DirectFB/gfxdrivers/mach64/regs.h883
9 files changed, 4951 insertions, 0 deletions
diff --git a/Source/DirectFB/gfxdrivers/mach64/Makefile.am b/Source/DirectFB/gfxdrivers/mach64/Makefile.am
new file mode 100755
index 0000000..89b9a0e
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/Makefile.am
@@ -0,0 +1,39 @@
+## Makefile.am for DirectFB/gfxdrivers/mach64
+
+INCLUDES = \
+ -I$(top_builddir)/include \
+ -I$(top_srcdir)/include \
+ -I$(top_builddir)/lib \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/systems \
+ -I$(top_srcdir)/src
+
+mach64_LTLIBRARIES = libdirectfb_mach64.la
+
+if BUILD_STATIC
+mach64_DATA = $(mach64_LTLIBRARIES:.la=.o)
+endif
+
+mach64dir = $(MODULEDIR)/gfxdrivers
+
+libdirectfb_mach64_la_SOURCES = \
+ mach64.c \
+ mach64.h \
+ mach64_state.c \
+ mach64_state.h \
+ mach64_overlay.c \
+ regs.h \
+ mmio.h
+
+libdirectfb_mach64_la_LDFLAGS = \
+ -module \
+ -avoid-version \
+ $(DFB_LDFLAGS)
+
+libdirectfb_mach64_la_LIBADD = \
+ $(top_builddir)/lib/direct/libdirect.la \
+ $(top_builddir)/src/libdirectfb.la
+
+
+include $(top_srcdir)/rules/libobject.make
+
diff --git a/Source/DirectFB/gfxdrivers/mach64/Makefile.in b/Source/DirectFB/gfxdrivers/mach64/Makefile.in
new file mode 100755
index 0000000..edcb305
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/Makefile.in
@@ -0,0 +1,603 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/rules/libobject.make
+subdir = gfxdrivers/mach64
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(mach64dir)" "$(DESTDIR)$(mach64dir)"
+mach64LTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(mach64_LTLIBRARIES)
+libdirectfb_mach64_la_DEPENDENCIES = \
+ $(top_builddir)/lib/direct/libdirect.la \
+ $(top_builddir)/src/libdirectfb.la
+am_libdirectfb_mach64_la_OBJECTS = mach64.lo mach64_state.lo \
+ mach64_overlay.lo
+libdirectfb_mach64_la_OBJECTS = $(am_libdirectfb_mach64_la_OBJECTS)
+libdirectfb_mach64_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libdirectfb_mach64_la_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+SOURCES = $(libdirectfb_mach64_la_SOURCES)
+DIST_SOURCES = $(libdirectfb_mach64_la_SOURCES)
+mach64DATA_INSTALL = $(INSTALL_DATA)
+DATA = $(mach64_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASFLAGS = @ASFLAGS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFB_CFLAGS_OMIT_FRAME_POINTER = @DFB_CFLAGS_OMIT_FRAME_POINTER@
+DFB_INTERNAL_CFLAGS = @DFB_INTERNAL_CFLAGS@
+DFB_LDFLAGS = @DFB_LDFLAGS@
+DFB_SMOOTH_SCALING = @DFB_SMOOTH_SCALING@
+DIRECTFB_BINARY_AGE = @DIRECTFB_BINARY_AGE@
+DIRECTFB_CSOURCE = @DIRECTFB_CSOURCE@
+DIRECTFB_INTERFACE_AGE = @DIRECTFB_INTERFACE_AGE@
+DIRECTFB_MAJOR_VERSION = @DIRECTFB_MAJOR_VERSION@
+DIRECTFB_MICRO_VERSION = @DIRECTFB_MICRO_VERSION@
+DIRECTFB_MINOR_VERSION = @DIRECTFB_MINOR_VERSION@
+DIRECTFB_VERSION = @DIRECTFB_VERSION@
+DIRECT_BUILD_DEBUG = @DIRECT_BUILD_DEBUG@
+DIRECT_BUILD_DEBUGS = @DIRECT_BUILD_DEBUGS@
+DIRECT_BUILD_GETTID = @DIRECT_BUILD_GETTID@
+DIRECT_BUILD_NETWORK = @DIRECT_BUILD_NETWORK@
+DIRECT_BUILD_STDBOOL = @DIRECT_BUILD_STDBOOL@
+DIRECT_BUILD_TEXT = @DIRECT_BUILD_TEXT@
+DIRECT_BUILD_TRACE = @DIRECT_BUILD_TRACE@
+DSYMUTIL = @DSYMUTIL@
+DYNLIB = @DYNLIB@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+FREETYPE_PROVIDER = @FREETYPE_PROVIDER@
+FUSION_BUILD_KERNEL = @FUSION_BUILD_KERNEL@
+FUSION_BUILD_MULTI = @FUSION_BUILD_MULTI@
+FUSION_MESSAGE_SIZE = @FUSION_MESSAGE_SIZE@
+GIF_PROVIDER = @GIF_PROVIDER@
+GREP = @GREP@
+HAVE_LINUX = @HAVE_LINUX@
+INCLUDEDIR = @INCLUDEDIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTERNALINCLUDEDIR = @INTERNALINCLUDEDIR@
+JPEG_PROVIDER = @JPEG_PROVIDER@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBJPEG = @LIBJPEG@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPNG_CONFIG = @LIBPNG_CONFIG@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_AGE = @LT_AGE@
+LT_BINARY = @LT_BINARY@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MAN2HTML = @MAN2HTML@
+MKDIR_P = @MKDIR_P@
+MODULEDIR = @MODULEDIR@
+MODULEDIRNAME = @MODULEDIRNAME@
+NMEDIT = @NMEDIT@
+OBJEXT = @OBJEXT@
+OSX_LIBS = @OSX_LIBS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PNG_PROVIDER = @PNG_PROVIDER@
+RANLIB = @RANLIB@
+RUNTIME_SYSROOT = @RUNTIME_SYSROOT@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_LIBS = @SDL_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOPATH = @SOPATH@
+STRIP = @STRIP@
+SYSCONFDIR = @SYSCONFDIR@
+SYSFS_LIBS = @SYSFS_LIBS@
+THREADFLAGS = @THREADFLAGS@
+THREADLIB = @THREADLIB@
+TSLIB_CFLAGS = @TSLIB_CFLAGS@
+TSLIB_LIBS = @TSLIB_LIBS@
+VERSION = @VERSION@
+VNC_CFLAGS = @VNC_CFLAGS@
+VNC_CONFIG = @VNC_CONFIG@
+VNC_LIBS = @VNC_LIBS@
+X11_CFLAGS = @X11_CFLAGS@
+X11_LIBS = @X11_LIBS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+INCLUDES = \
+ -I$(top_builddir)/include \
+ -I$(top_srcdir)/include \
+ -I$(top_builddir)/lib \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/systems \
+ -I$(top_srcdir)/src
+
+mach64_LTLIBRARIES = libdirectfb_mach64.la
+@BUILD_STATIC_TRUE@mach64_DATA = $(mach64_LTLIBRARIES:.la=.o)
+mach64dir = $(MODULEDIR)/gfxdrivers
+libdirectfb_mach64_la_SOURCES = \
+ mach64.c \
+ mach64.h \
+ mach64_state.c \
+ mach64_state.h \
+ mach64_overlay.c \
+ regs.h \
+ mmio.h
+
+libdirectfb_mach64_la_LDFLAGS = \
+ -module \
+ -avoid-version \
+ $(DFB_LDFLAGS)
+
+libdirectfb_mach64_la_LIBADD = \
+ $(top_builddir)/lib/direct/libdirect.la \
+ $(top_builddir)/src/libdirectfb.la
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rules/libobject.make $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gfxdrivers/mach64/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gfxdrivers/mach64/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-mach64LTLIBRARIES: $(mach64_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(mach64dir)" || $(MKDIR_P) "$(DESTDIR)$(mach64dir)"
+ @list='$(mach64_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(mach64LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(mach64dir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(mach64LTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(mach64dir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-mach64LTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(mach64_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(mach64dir)/$$p'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(mach64dir)/$$p"; \
+ done
+
+clean-mach64LTLIBRARIES:
+ -test -z "$(mach64_LTLIBRARIES)" || rm -f $(mach64_LTLIBRARIES)
+ @list='$(mach64_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libdirectfb_mach64.la: $(libdirectfb_mach64_la_OBJECTS) $(libdirectfb_mach64_la_DEPENDENCIES)
+ $(libdirectfb_mach64_la_LINK) -rpath $(mach64dir) $(libdirectfb_mach64_la_OBJECTS) $(libdirectfb_mach64_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mach64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mach64_overlay.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mach64_state.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-mach64DATA: $(mach64_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(mach64dir)" || $(MKDIR_P) "$(DESTDIR)$(mach64dir)"
+ @list='$(mach64_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(mach64DATA_INSTALL) '$$d$$p' '$(DESTDIR)$(mach64dir)/$$f'"; \
+ $(mach64DATA_INSTALL) "$$d$$p" "$(DESTDIR)$(mach64dir)/$$f"; \
+ done
+
+uninstall-mach64DATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(mach64_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(mach64dir)/$$f'"; \
+ rm -f "$(DESTDIR)$(mach64dir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(mach64dir)" "$(DESTDIR)$(mach64dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-mach64LTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-mach64DATA install-mach64LTLIBRARIES
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-mach64DATA uninstall-mach64LTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-mach64LTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am \
+ install-mach64DATA install-mach64LTLIBRARIES install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-mach64DATA uninstall-mach64LTLIBRARIES
+
+%.o: .libs/%.a %.la
+ rm -f $<.tmp/*.o
+ if test -d $<.tmp; then rmdir $<.tmp; fi
+ mkdir $<.tmp
+ (cd $<.tmp && $(AR) x ../../$<)
+ $(LD) -o $@ -r $<.tmp/*.o
+ rm -f $<.tmp/*.o && rmdir $<.tmp
+
+.PHONY: $(LTLIBRARIES:%.la=.libs/%.a)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Source/DirectFB/gfxdrivers/mach64/mach64.c b/Source/DirectFB/gfxdrivers/mach64/mach64.c
new file mode 100755
index 0000000..84fd571
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/mach64.c
@@ -0,0 +1,1640 @@
+/*
+ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org)
+ (c) Copyright 2000-2004 Convergence (integrated media) GmbH
+
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <dok@directfb.org>,
+ Andreas Hundt <andi@fischlustig.de>,
+ Sven Neumann <neo@directfb.org>,
+ Ville Syrjälä <syrjala@sci.fi> and
+ Claudio Ciccani <klan@users.sf.net>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <config.h>
+
+#include <dfb_types.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include <fbdev/fb.h>
+
+#include <directfb.h>
+
+#include <direct/messages.h>
+#include <direct/util.h>
+
+#include <core/coredefs.h>
+#include <core/coretypes.h>
+
+#include <core/screens.h>
+#include <core/state.h>
+#include <core/gfxcard.h>
+#include <core/surface.h>
+
+#include <gfx/convert.h>
+#include <gfx/util.h>
+
+#include <misc/conf.h>
+
+#include <core/graphics_driver.h>
+
+
+DFB_GRAPHICS_DRIVER( mach64 )
+
+
+#include "regs.h"
+#include "mmio.h"
+#include "mach64_state.h"
+#include "mach64.h"
+
+
+/* driver capability flags */
+
+
+#define MACH64_SUPPORTED_DRAWINGFLAGS \
+ (DSDRAW_DST_COLORKEY | DSDRAW_SRC_PREMULTIPLY)
+
+#define MACH64_SUPPORTED_BLITTINGFLAGS \
+ (DSBLIT_SRC_COLORKEY | DSBLIT_DST_COLORKEY)
+
+#define MACH64_SUPPORTED_DRAWINGFUNCTIONS \
+ (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | DFXL_DRAWLINE)
+
+#define MACH64_SUPPORTED_BLITTINGFUNCTIONS \
+ (DFXL_BLIT)
+
+
+#define MACH64GT_SUPPORTED_DRAWINGFLAGS \
+ (DSDRAW_DST_COLORKEY | DSDRAW_BLEND | DSDRAW_SRC_PREMULTIPLY)
+
+#define MACH64GT_SUPPORTED_BLITTINGFLAGS \
+ (DSBLIT_SRC_COLORKEY | DSBLIT_DST_COLORKEY | DSBLIT_BLEND_COLORALPHA | \
+ DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_COLORIZE | DSBLIT_DEINTERLACE | \
+ DSBLIT_SRC_PREMULTCOLOR)
+
+#define MACH64GT_SUPPORTED_DRAWINGFUNCTIONS \
+ (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | DFXL_DRAWLINE | DFXL_FILLTRIANGLE)
+
+#define MACH64GT_SUPPORTED_BLITTINGFUNCTIONS \
+ (DFXL_BLIT | DFXL_STRETCHBLIT)
+
+
+static bool mach64DrawLine2D( void *drv, void *dev, DFBRegion *line );
+static bool mach64DrawLine3D( void *drv, void *dev, DFBRegion *line );
+
+static bool mach64Blit2D( void *drv, void *dev, DFBRectangle *rect, int dx, int dy );
+
+static bool mach64BlitScaleOld( void *drv, void *dev, DFBRectangle *rect, int dx, int dy );
+static bool mach64StretchBlitScaleOld( void *drv, void *dev, DFBRectangle *srect, DFBRectangle *drect );
+
+static bool mach64BlitScale( void *drv, void *dev, DFBRectangle *rect, int dx, int dy );
+static bool mach64StretchBlitScale( void *drv, void *dev, DFBRectangle *srect, DFBRectangle *drect );
+
+static bool mach64BlitTexOld( void *drv, void *dev, DFBRectangle *rect, int dx, int dy );
+static bool mach64StretchBlitTexOld( void *drv, void *dev, DFBRectangle *srect, DFBRectangle *drect );
+
+static bool mach64BlitTex( void *drv, void *dev, DFBRectangle *rect, int dx, int dy );
+static bool mach64StretchBlitTex( void *drv, void *dev, DFBRectangle *srect, DFBRectangle *drect );
+
+/* required implementations */
+
+static void mach64EngineReset( void *drv, void *dev )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitidle( mdrv, mdev );
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+
+ mach64_out32( mmio, DP_WRITE_MSK, 0xFFFFFFFF );
+ mach64_out32( mmio, DP_MIX, FRGD_MIX_SRC | BKGD_MIX_DST );
+
+ if (mdrv->accelerator == FB_ACCEL_ATI_MACH64GT) {
+ mach64_waitfifo( mdrv, mdev, 12 );
+
+ /* Some 3D registers aren't accessible without this. */
+ mach64_out32( mmio, SCALE_3D_CNTL, SCALE_3D_FCN_SHADE );
+
+ mach64_out32( mmio, SRC_CNTL, 0 );
+ mach64_out32( mmio, Z_CNTL, 0 );
+
+ mach64_out32( mmio, RED_X_INC, 0 );
+ mach64_out32( mmio, RED_Y_INC, 0 );
+ mach64_out32( mmio, GREEN_X_INC, 0 );
+ mach64_out32( mmio, GREEN_Y_INC, 0 );
+ mach64_out32( mmio, BLUE_X_INC, 0 );
+ mach64_out32( mmio, BLUE_Y_INC, 0 );
+ mach64_out32( mmio, ALPHA_X_INC, 0 );
+ mach64_out32( mmio, ALPHA_Y_INC, 0 );
+
+ mach64_out32( mmio, SCALE_3D_CNTL, 0 );
+ }
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO)
+ mach64_out32( mmio, HW_DEBUG, mdev->hw_debug );
+}
+
+static DFBResult mach64EngineSync( void *drv, void *dev )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64_waitidle( mdrv, mdev );
+
+ return DFB_OK;
+}
+
+static void mach64FlushTextureCache( void *drv, void *dev )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, TEX_CNTL, TEX_CACHE_FLUSH );
+ }
+}
+
+static bool mach64_use_scaler( Mach64DeviceData *mdev,
+ CardState *state, DFBAccelerationMask accel )
+{
+ if (accel & DFXL_STRETCHBLIT ||
+ state->source->config.format != state->destination->config.format ||
+ state->blittingflags & (DSBLIT_BLEND_COLORALPHA | DSBLIT_DEINTERLACE))
+ return true;
+
+ return false;
+}
+
+static bool mach64_use_tex( Mach64DeviceData *mdev,
+ CardState *state, DFBAccelerationMask accel )
+{
+ if (state->blittingflags & (DSBLIT_BLEND_ALPHACHANNEL |
+ DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR))
+ return true;
+
+ /*
+ * 3D Rage II chips lock up if the scaler is used with destination
+ * color keying. Using the texture engine works however.
+ */
+ if (mdev->chip < CHIP_3D_RAGE_PRO &&
+ mach64_use_scaler( mdev, state, accel ) &&
+ state->blittingflags & DSBLIT_DST_COLORKEY)
+ return true;
+
+ return false;
+}
+
+static bool mach64_use_scaler_3d( Mach64DeviceData *mdev,
+ CardState *state, DFBAccelerationMask accel )
+{
+ if (DFB_DRAWING_FUNCTION( accel )) {
+ if (state->drawingflags & DSDRAW_BLEND)
+ return true;
+ } else {
+ if (accel & DFXL_STRETCHBLIT ||
+ state->source->config.format != state->destination->config.format ||
+ state->blittingflags & (DSBLIT_BLEND_COLORALPHA | DSBLIT_DEINTERLACE |
+ DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_COLORIZE |
+ DSBLIT_SRC_PREMULTCOLOR))
+ return true;
+ }
+
+ return false;
+}
+
+static bool mach64_check_blend( Mach64DeviceData *mdev, CardState *state )
+{
+ switch (state->src_blend) {
+ case DSBF_SRCCOLOR:
+ case DSBF_INVSRCCOLOR:
+ return false;
+ case DSBF_DESTALPHA:
+ case DSBF_INVDESTALPHA:
+ case DSBF_SRCALPHASAT:
+ if (mdev->chip < CHIP_3D_RAGE_PRO)
+ return false;
+ default:
+ break;
+ }
+
+ switch (state->dst_blend) {
+ case DSBF_DESTCOLOR:
+ case DSBF_INVDESTCOLOR:
+ case DSBF_SRCALPHASAT:
+ return false;
+ case DSBF_DESTALPHA:
+ case DSBF_INVDESTALPHA:
+ if (mdev->chip < CHIP_3D_RAGE_PRO)
+ return false;
+ default:
+ break;
+ }
+
+ return true;
+}
+
+static void mach64CheckState( void *drv, void *dev,
+ CardState *state, DFBAccelerationMask accel )
+{
+ switch (state->destination->config.format) {
+ case DSPF_RGB332:
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ case DSPF_RGB16:
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ break;
+ default:
+ return;
+ }
+
+ if (DFB_DRAWING_FUNCTION( accel )) {
+ if (state->drawingflags & ~MACH64_SUPPORTED_DRAWINGFLAGS)
+ return;
+
+ state->accel |= MACH64_SUPPORTED_DRAWINGFUNCTIONS;
+ } else {
+ if (state->source->config.format != state->destination->config.format)
+ return;
+
+ if (state->blittingflags & ~MACH64_SUPPORTED_BLITTINGFLAGS)
+ return;
+
+ /* Can't do source and destination color keying at the same time. */
+ if (state->blittingflags & DSBLIT_SRC_COLORKEY &&
+ state->blittingflags & DSBLIT_DST_COLORKEY)
+ return;
+
+ state->accel |= MACH64_SUPPORTED_BLITTINGFUNCTIONS;
+ }
+}
+
+static void mach64GTCheckState( void *drv, void *dev,
+ CardState *state, DFBAccelerationMask accel )
+{
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ switch (state->destination->config.format) {
+ case DSPF_RGB444:
+ case DSPF_ARGB4444:
+ /* Not supported. */
+ if (mdev->chip < CHIP_3D_RAGE_PRO)
+ return;
+
+ /* Causes the chip to lock up. */
+ if (mdev->chip < CHIP_3D_RAGE_XLXC &&
+ mach64_use_scaler_3d( mdev, state, accel ))
+ return;
+ case DSPF_RGB332:
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ case DSPF_RGB16:
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ break;
+ default:
+ return;
+ }
+
+ if (DFB_DRAWING_FUNCTION( accel )) {
+ if (state->drawingflags & ~MACH64GT_SUPPORTED_DRAWINGFLAGS)
+ return;
+
+ if (state->drawingflags & DSDRAW_BLEND &&
+ !mach64_check_blend( mdev, state ))
+ return;
+
+ /* Causes the chip to lock up. */
+ if (state->drawingflags & DSDRAW_BLEND &&
+ state->drawingflags & DSDRAW_DST_COLORKEY)
+ return;
+
+ state->accel |= MACH64GT_SUPPORTED_DRAWINGFUNCTIONS;
+ } else {
+ CoreSurface *source = state->source;
+
+ switch (source->config.format) {
+ case DSPF_RGB332:
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ case DSPF_RGB444:
+ case DSPF_ARGB4444:
+ case DSPF_RGB16:
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ break;
+ default:
+ return;
+ }
+
+ if (state->blittingflags & ~MACH64GT_SUPPORTED_BLITTINGFLAGS)
+ return;
+
+ if (state->blittingflags & (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA) &&
+ !mach64_check_blend( mdev, state ))
+ return;
+
+ /* Can't do alpha modulation. */
+ if (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL &&
+ state->blittingflags & DSBLIT_BLEND_COLORALPHA)
+ return;
+
+ /* Can't do source and destination color keying at the same time. */
+ if (state->blittingflags & DSBLIT_SRC_COLORKEY &&
+ state->blittingflags & DSBLIT_DST_COLORKEY)
+ return;
+
+ /* Causes the chip to lock up. */
+ if (state->blittingflags & (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA) &&
+ state->blittingflags & DSBLIT_DST_COLORKEY)
+ return;
+
+ if (mach64_use_tex( mdev, state, accel )) {
+ /* Max texture size is 1024x1024. */
+ if (source->config.size.w > 1024 || source->config.size.h > 1024)
+ return;
+
+ state->accel |= MACH64GT_SUPPORTED_BLITTINGFUNCTIONS;
+ } else if (mach64_use_scaler( mdev, state, accel )) {
+ /* Max scaler source size depends on the chip type. */
+ if (mdev->chip < CHIP_3D_RAGE_PRO) {
+ /* Tested on 3D Rage II+ and IIC. */
+ if (source->config.size.w > 4095 || source->config.size.h > 4095)
+ return;
+ } else {
+ /* Tested on 3D Rage LT Pro, XL and Mobility. */
+ if (source->config.size.w > 4096 || source->config.size.h > 16384)
+ return;
+ }
+
+ state->accel |= MACH64GT_SUPPORTED_BLITTINGFUNCTIONS;
+ } else
+ state->accel |= accel;
+ }
+}
+
+static void mach64SetState( void *drv, void *dev,
+ GraphicsDeviceFuncs *funcs,
+ CardState *state, DFBAccelerationMask accel )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (state->mod_hw == SMF_ALL) {
+ mdev->valid = 0;
+ } else if (state->mod_hw) {
+ if (state->mod_hw & SMF_SOURCE)
+ MACH64_INVALIDATE( m_source | m_srckey );
+
+ if (state->mod_hw & SMF_SRC_COLORKEY)
+ MACH64_INVALIDATE( m_srckey );
+
+ if (state->mod_hw & SMF_DESTINATION)
+ MACH64_INVALIDATE( m_color | m_dstkey );
+
+ if (state->mod_hw & SMF_COLOR)
+ MACH64_INVALIDATE( m_color );
+
+ if (state->mod_hw & SMF_DST_COLORKEY)
+ MACH64_INVALIDATE( m_dstkey );
+
+ if (state->mod_hw & SMF_BLITTING_FLAGS)
+ MACH64_INVALIDATE( m_srckey | m_dstkey | m_disable_key );
+
+ if (state->mod_hw & SMF_DRAWING_FLAGS)
+ MACH64_INVALIDATE( m_color | m_dstkey | m_disable_key );
+ }
+
+ if (state->mod_hw & SMF_DESTINATION)
+ mach64_set_destination( mdrv, mdev, state );
+
+ switch (accel) {
+ case DFXL_FILLRECTANGLE:
+ case DFXL_DRAWRECTANGLE:
+ case DFXL_DRAWLINE:
+ mach64_waitfifo( mdrv, mdev, 2 );
+ mach64_out32( mmio, DP_SRC, FRGD_SRC_FRGD_CLR );
+ mach64_out32( mmio, DP_PIX_WIDTH, mdev->pix_width );
+
+ mach64_set_color( mdrv, mdev, state );
+
+ if (state->drawingflags & DSDRAW_DST_COLORKEY)
+ mach64_set_dst_colorkey( mdrv, mdev, state );
+ else
+ mach64_disable_colorkey( mdrv, mdev );
+
+ funcs->DrawLine = mach64DrawLine2D;
+
+ state->set = DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | DFXL_DRAWLINE;
+ break;
+ case DFXL_BLIT:
+ mach64_set_source( mdrv, mdev, state );
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+ mach64_out32( mmio, DP_SRC, FRGD_SRC_BLIT );
+ mach64_out32( mmio, DP_PIX_WIDTH, mdev->pix_width );
+
+ if (state->blittingflags & DSBLIT_DST_COLORKEY)
+ mach64_set_dst_colorkey( mdrv, mdev, state );
+ else if (state->blittingflags & DSBLIT_SRC_COLORKEY)
+ mach64_set_src_colorkey( mdrv, mdev, state );
+ else
+ mach64_disable_colorkey( mdrv, mdev );
+
+ funcs->Blit = mach64Blit2D;
+
+ state->set = DFXL_BLIT;
+ break;
+ default:
+ D_BUG( "unexpected drawing/blitting function" );
+ break;
+ }
+
+ if (state->mod_hw & SMF_CLIP) {
+ mach64_set_clip( mdrv, mdev, state );
+ mdev->clip = state->clip;
+ }
+
+ state->mod_hw = 0;
+}
+
+static void mach64GTSetState( void *drv, void *dev,
+ GraphicsDeviceFuncs *funcs,
+ CardState *state, DFBAccelerationMask accel )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ bool use_scaler_3d;
+
+ if (state->mod_hw == SMF_ALL) {
+ mdev->valid = 0;
+ } else if (state->mod_hw) {
+ if (state->mod_hw & SMF_SOURCE)
+ MACH64_INVALIDATE( m_source | m_source_scale | m_srckey | m_srckey_scale | m_blit_blend );
+
+ if (state->mod_hw & SMF_SRC_COLORKEY)
+ MACH64_INVALIDATE( m_srckey | m_srckey_scale );
+
+ if (state->mod_hw & SMF_DESTINATION)
+ MACH64_INVALIDATE( m_color | m_dstkey );
+
+ if (state->mod_hw & SMF_COLOR)
+ MACH64_INVALIDATE( m_color | m_color_3d | m_color_tex );
+
+ if (state->mod_hw & SMF_DST_COLORKEY)
+ MACH64_INVALIDATE( m_dstkey );
+
+ if (state->mod_hw & SMF_BLITTING_FLAGS)
+ MACH64_INVALIDATE( m_color_tex | m_source_scale | m_srckey | m_srckey_scale | m_dstkey | m_disable_key | m_blit_blend );
+
+ if (state->mod_hw & SMF_DRAWING_FLAGS)
+ MACH64_INVALIDATE( m_color | m_color_3d | m_dstkey | m_disable_key | m_draw_blend );
+
+ if (state->mod_hw & (SMF_SRC_BLEND | SMF_DST_BLEND))
+ MACH64_INVALIDATE( m_draw_blend | m_blit_blend );
+ }
+
+ use_scaler_3d = mach64_use_scaler_3d( mdev, state, accel );
+
+ /* At least 3D Rage II+ and IIC chips _will_ lock up without this. */
+ if (mdev->chip < CHIP_3D_RAGE_PRO && use_scaler_3d != mdev->use_scaler_3d)
+ mach64_waitidle( mdrv, mdev );
+
+ mdev->use_scaler_3d = use_scaler_3d;
+
+ if (state->mod_hw & SMF_DESTINATION)
+ mach64gt_set_destination( mdrv, mdev, state );
+
+ switch (accel) {
+ case DFXL_FILLRECTANGLE:
+ case DFXL_DRAWRECTANGLE:
+ case DFXL_DRAWLINE:
+ case DFXL_FILLTRIANGLE:
+ if (use_scaler_3d) {
+ mach64_waitfifo( mdrv, mdev, 3 );
+ /* Some 3D registers aren't accessible without this. */
+ mach64_out32( mmio, SCALE_3D_CNTL, SCALE_3D_FCN_SHADE );
+
+ mach64_out32( mmio, DP_SRC, FRGD_SRC_SCALE );
+ mach64_out32( mmio, DP_PIX_WIDTH, mdev->pix_width );
+
+ mach64_set_color_3d( mdrv, mdev, state );
+
+ mach64_set_draw_blend( mdrv, mdev, state );
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, SCALE_3D_CNTL, SCALE_3D_FCN_SHADE | mdev->draw_blend );
+
+ funcs->DrawLine = mach64DrawLine3D;
+ } else {
+ mach64_waitfifo( mdrv, mdev, 3 );
+ mach64_out32( mmio, SCALE_3D_CNTL, 0 );
+
+ mach64_out32( mmio, DP_SRC, FRGD_SRC_FRGD_CLR );
+ mach64_out32( mmio, DP_PIX_WIDTH, mdev->pix_width );
+
+ mach64_set_color( mdrv, mdev, state );
+
+ funcs->DrawLine = mach64DrawLine2D;
+ }
+
+ if (state->drawingflags & DSDRAW_DST_COLORKEY)
+ mach64_set_dst_colorkey( mdrv, mdev, state );
+ else
+ mach64_disable_colorkey( mdrv, mdev );
+
+ state->set = DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | DFXL_DRAWLINE | DFXL_FILLTRIANGLE;
+ break;
+ case DFXL_BLIT:
+ case DFXL_STRETCHBLIT:
+ mdev->blit_deinterlace = state->blittingflags & DSBLIT_DEINTERLACE;
+
+ if (use_scaler_3d) {
+ mach64_waitfifo( mdrv, mdev, 1 );
+ /* Some 3D registers aren't accessible without this. */
+ mach64_out32( mmio, SCALE_3D_CNTL, SCALE_3D_FCN_SHADE );
+
+ mach64gt_set_source_scale( mdrv, mdev, state );
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+ mach64_out32( mmio, DP_SRC, FRGD_SRC_SCALE );
+ mach64_out32( mmio, DP_PIX_WIDTH, mdev->pix_width );
+
+ if (state->blittingflags & (DSBLIT_BLEND_COLORALPHA |
+ DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR))
+ mach64_set_color_tex( mdrv, mdev, state );
+
+ mach64_set_blit_blend( mdrv, mdev, state );
+
+ if (state->blittingflags & DSBLIT_DST_COLORKEY)
+ mach64_set_dst_colorkey( mdrv, mdev, state );
+ else if (state->blittingflags & DSBLIT_SRC_COLORKEY)
+ mach64_set_src_colorkey_scale( mdrv, mdev, state );
+ else
+ mach64_disable_colorkey( mdrv, mdev );
+
+ if (mdev->chip < CHIP_3D_RAGE_PRO) {
+ if (mach64_use_tex( mdev, state, accel )) {
+ funcs->Blit = mach64BlitTexOld;
+ funcs->StretchBlit = mach64StretchBlitTexOld;
+ } else {
+ funcs->Blit = mach64BlitScaleOld;
+ funcs->StretchBlit = mach64StretchBlitScaleOld;
+ }
+ } else {
+ if (mach64_use_tex( mdev, state, accel )) {
+ funcs->Blit = mach64BlitTex;
+ funcs->StretchBlit = mach64StretchBlitTex;
+ } else {
+ funcs->Blit = mach64BlitScale;
+ funcs->StretchBlit = mach64StretchBlitScale;
+ }
+ }
+
+ state->set = DFXL_BLIT | DFXL_STRETCHBLIT;
+ } else {
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, SCALE_3D_CNTL, 0 );
+
+ mach64gt_set_source( mdrv, mdev, state );
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+ mach64_out32( mmio, DP_SRC, FRGD_SRC_BLIT );
+ mach64_out32( mmio, DP_PIX_WIDTH, mdev->pix_width );
+
+ if (state->blittingflags & DSBLIT_DST_COLORKEY)
+ mach64_set_dst_colorkey( mdrv, mdev, state );
+ else if (state->blittingflags & DSBLIT_SRC_COLORKEY)
+ mach64_set_src_colorkey( mdrv, mdev, state );
+ else
+ mach64_disable_colorkey( mdrv, mdev );
+
+ funcs->Blit = mach64Blit2D;
+
+ state->set = DFXL_BLIT;
+ }
+ break;
+ default:
+ D_BUG( "unexpected drawing/blitting function" );
+ break;
+ }
+
+ if (state->mod_hw & SMF_CLIP) {
+ mach64_set_clip( mdrv, mdev, state );
+ mdev->clip = state->clip;
+ }
+
+ state->mod_hw = 0;
+}
+
+/* */
+
+static bool mach64FillRectangle( void *drv, void *dev, DFBRectangle *rect )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, 3 );
+
+ mach64_out32( mmio, DST_CNTL, DST_X_DIR | DST_Y_DIR );
+ mach64_out32( mmio, DST_Y_X, (S13( rect->x ) << 16) | S14( rect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (rect->w << 16) | rect->h );
+
+ return true;
+}
+
+static bool mach64DrawRectangle( void *drv, void *dev, DFBRectangle *rect )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ int x2 = rect->x + rect->w - 1;
+ int y2 = rect->y + rect->h - 1;
+
+ mach64_waitfifo( mdrv, mdev, 8 );
+
+ mach64_out32( mmio, DST_CNTL, DST_X_DIR | DST_Y_DIR );
+ mach64_out32( mmio, DST_Y_X, (S13( rect->x ) << 16) | S14( rect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (1 << 16) | rect->h );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (rect->w << 16) | 1 );
+
+ mach64_out32( mmio, DST_CNTL, 0 );
+ mach64_out32( mmio, DST_Y_X, (S13( x2 ) << 16) | S14( y2 ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (1 << 16) | rect->h );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (rect->w << 16) | 1 );
+
+ return true;
+}
+
+static void mach64_draw_line( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ int x1, int y1,
+ int x2, int y2,
+ bool draw_3d )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ u32 dst_cntl = 0;
+ int dx, dy;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+
+ if (dx < 0)
+ dx = -dx;
+ else
+ dst_cntl |= DST_X_DIR;
+
+ if (dy < 0)
+ dy = -dy;
+ else
+ dst_cntl |= DST_Y_DIR;
+
+ if (!dx || !dy) {
+ /* horizontal / vertical line */
+ mach64_waitfifo( mdrv, mdev, 3 );
+
+ mach64_out32( mmio, DST_CNTL, dst_cntl);
+ mach64_out32( mmio, DST_Y_X, (S13( x1 ) << 16) | S14( y1 ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, ((dx+1) << 16) | (dy+1) );
+
+ return;
+ }
+
+ if (dx < dy) {
+ int tmp = dx;
+ dx = dy;
+ dy = tmp;
+ dst_cntl |= DST_Y_MAJOR;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 6 );
+
+ mach64_out32( mmio, DST_CNTL, DST_LAST_PEL | dst_cntl );
+ mach64_out32( mmio, DST_Y_X, (S13( x1 ) << 16) | S14( y1 ) );
+
+ /* Bresenham parameters must be calculated differently
+ * for the 2D and 3D engines.
+ */
+ if (draw_3d) {
+ mach64_out32( mmio, DST_BRES_ERR, -dx );
+ mach64_out32( mmio, DST_BRES_INC, 2*dy );
+ mach64_out32( mmio, DST_BRES_DEC, -2*dx );
+ mach64_out32( mmio, DST_BRES_LNTH, dx+1 );
+ } else {
+ mach64_out32( mmio, DST_BRES_ERR, 2*dy-dx );
+ mach64_out32( mmio, DST_BRES_INC, 2*dy );
+ mach64_out32( mmio, DST_BRES_DEC, 2*dy-2*dx );
+ mach64_out32( mmio, DST_BRES_LNTH, dx+1 );
+ }
+}
+
+static bool mach64DrawLine2D( void *drv, void *dev, DFBRegion *line )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64_draw_line( mdrv, mdev,
+ line->x1, line->y1,
+ line->x2, line->y2,
+ false );
+
+ return true;
+}
+
+static bool mach64DrawLine3D( void *drv, void *dev, DFBRegion *line )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64_draw_line( mdrv, mdev,
+ line->x1, line->y1,
+ line->x2, line->y2,
+ true );
+
+ return true;
+}
+
+static void mach64_fill_trapezoid( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ int X1l, int X1r,
+ int X2l, int X2r,
+ int Y, int dY )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ u32 dst_cntl;
+ int dXl, dXr;
+
+ X1r++; X2r++;
+
+ dst_cntl = DST_Y_DIR | TRAP_FILL_DIR;
+
+ dXl = X2l - X1l;
+ if (dXl < 0)
+ dXl = -dXl;
+ else
+ dst_cntl |= DST_X_DIR;
+
+ dXr = X2r - X1r;
+ if (dXr < 0)
+ dXr = -dXr;
+ else
+ dst_cntl |= TRAIL_X_DIR;
+
+ mach64_waitfifo( mdrv, mdev, 9 );
+
+ mach64_out32( mmio, DST_CNTL, dst_cntl );
+ mach64_out32( mmio, DST_Y_X, (S13( X1l ) << 16) | S14( Y ) );
+
+ mach64_out32( mmio, LEAD_BRES_ERR, -dY );
+ mach64_out32( mmio, LEAD_BRES_INC, 2*dXl );
+ mach64_out32( mmio, LEAD_BRES_DEC, -2*dY );
+
+ mach64_out32( mmio, TRAIL_BRES_ERR, -dY );
+ mach64_out32( mmio, TRAIL_BRES_INC, 2*dXr );
+ mach64_out32( mmio, TRAIL_BRES_DEC, -2*dY );
+
+ mach64_out32( mmio, LEAD_BRES_LNTH, (S14( X1r ) << 16) | (dY+1) | DRAW_TRAP | LINE_DIS );
+}
+
+static bool mach64FillTriangle( void *drv, void *dev, DFBTriangle *tri )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ dfb_sort_triangle( tri );
+
+ if (tri->y2 == tri->y3) {
+ mach64_fill_trapezoid( mdrv, mdev,
+ tri->x1, tri->x1,
+ MIN( tri->x2, tri->x3), MAX( tri->x2, tri->x3 ),
+ tri->y1, tri->y3 - tri->y1 );
+ } else if (tri->y1 == tri->y2) {
+ mach64_fill_trapezoid( mdrv, mdev,
+ MIN( tri->x1, tri->x2), MAX( tri->x1, tri->x2 ),
+ tri->x3, tri->x3,
+ tri->y1, tri->y3 - tri->y1 );
+ } else {
+ int majDx = tri->x3 - tri->x1;
+ int majDy = tri->y3 - tri->y1;
+ int topDx = tri->x2 - tri->x1;
+ int topDy = tri->y2 - tri->y1;
+ int botDy = tri->y3 - tri->y2;
+
+ int topXperY = (topDx << 20) / topDy;
+ int X2a = tri->x1 + (((topXperY * topDy) + (1<<19)) >> 20);
+
+ int majXperY = (majDx << 20) / majDy;
+ int majX2 = tri->x1 + (((majXperY * topDy) + (1<<19)) >> 20);
+ int majX2a = majX2 - ((majXperY + (1<<19)) >> 20);
+
+ mach64_fill_trapezoid( mdrv, mdev,
+ tri->x1, tri->x1,
+ MIN( X2a, majX2a ), MAX( X2a, majX2a ),
+ tri->y1, topDy - 1 );
+ mach64_fill_trapezoid( mdrv, mdev,
+ MIN( tri->x2, majX2 ), MAX( tri->x2, majX2 ),
+ tri->x3, tri->x3,
+ tri->y2, botDy );
+ }
+
+ return true;
+}
+
+static void mach64DoBlit2D( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ DFBRectangle *srect,
+ DFBRectangle *drect )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ u32 dst_cntl = 0;
+
+ if (srect->x <= drect->x) {
+ srect->x += srect->w - 1;
+ drect->x += drect->w - 1;
+ } else
+ dst_cntl |= DST_X_DIR;
+
+ if (srect->y <= drect->y) {
+ srect->y += srect->h - 1;
+ drect->y += drect->h - 1;
+ } else
+ dst_cntl |= DST_Y_DIR;
+
+ mach64_waitfifo( mdrv, mdev, 5 );
+
+ mach64_out32( mmio, SRC_Y_X, (S13( srect->x ) << 16) | S14( srect->y ) );
+ mach64_out32( mmio, SRC_HEIGHT1_WIDTH1, (srect->w << 16) | srect->h );
+
+ mach64_out32( mmio, DST_CNTL, dst_cntl );
+ mach64_out32( mmio, DST_Y_X, (S13( drect->x ) << 16) | S14( drect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (drect->w << 16) | drect->h );
+}
+
+static void mach64DoBlitScaleOld( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ DFBRectangle *srect,
+ DFBRectangle *drect,
+ bool filter )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *source = mdev->source;
+
+ u32 scale_3d_cntl = SCALE_3D_FCN_SCALE | mdev->blit_blend;
+ int hacc, vacc;
+
+ if (!filter)
+ scale_3d_cntl |= SCALE_PIX_REP;
+
+ if (mdev->blit_deinterlace) {
+ srect->y /= 2;
+ srect->h /= 2;
+ }
+
+ srect->x <<= 16;
+ srect->y <<= 16;
+ srect->w <<= 16;
+ srect->h <<= 16;
+
+ /*
+ * SCALE_HACC and SCALE_VACC have limited scale so we need to change
+ * SCALE_Y_OFF in order to handle the full range of source coordinates.
+ */
+ hacc = srect->x & 0xFFFF0; /* s4.12 */
+ vacc = srect->y & 0xFFFF0; /* s4.12 */
+ srect->x &= ~0xFFFFF;
+ srect->y &= ~0xFFFFF;
+
+ mach64_waitfifo( mdrv, mdev, 14 );
+
+ mach64_out32( mmio, SCALE_3D_CNTL, scale_3d_cntl );
+ mach64_out32( mmio, SCALE_Y_OFF, mdev->scale_offset +
+ (srect->y >> 16) * mdev->scale_pitch +
+ (srect->x >> 16) * DFB_BYTES_PER_PIXEL( source->config.format ) );
+
+
+ mach64_out32( mmio, SCALE_WIDTH, (srect->w + hacc) >> 16 );
+ mach64_out32( mmio, SCALE_HEIGHT, (srect->h + vacc) >> 16 );
+
+ mach64_out32( mmio, SCALE_Y_PITCH, mdev->scale_pitch / DFB_BYTES_PER_PIXEL( source->config.format ) );
+
+ mach64_out32( mmio, SCALE_X_INC, srect->w / drect->w );
+ mach64_out32( mmio, SCALE_Y_INC, srect->h / drect->h );
+
+ if (mdev->blit_deinterlace && mdev->field)
+ vacc += 0x8000;
+
+ mach64_out32( mmio, SCALE_VACC, vacc );
+ mach64_out32( mmio, SCALE_HACC, hacc );
+ mach64_out32( mmio, SCALE_XUV_INC, (srect->w/2) / (drect->w/2) );
+ mach64_out32( mmio, SCALE_UV_HACC, hacc >> 1 );
+
+ mach64_out32( mmio, DST_CNTL, DST_X_DIR | DST_Y_DIR );
+ mach64_out32( mmio, DST_Y_X, (S13( drect->x ) << 16) | S14( drect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (drect->w << 16) | drect->h );
+
+ /* Some scaler and 3D color registers are shared. */
+ MACH64_INVALIDATE( m_color_3d | m_color_tex );
+}
+
+static void mach64DoBlitScale( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ DFBRectangle *srect,
+ DFBRectangle *drect,
+ bool filter )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *source = mdev->source;
+
+ u32 scale_3d_cntl = SCALE_3D_FCN_SCALE | mdev->blit_blend;
+ int hacc, vacc;
+
+ if (!filter)
+ scale_3d_cntl |= SCALE_PIX_REP;
+
+ if (mdev->blit_deinterlace) {
+ srect->y /= 2;
+ srect->h /= 2;
+ }
+
+ srect->x <<= 16;
+ srect->y <<= 16;
+ srect->w <<= 16;
+ srect->h <<= 16;
+
+ /* Hardware bug: Hitting SC_TOP results in incorrect rendering. */
+ if (drect->y < mdev->clip.y1) {
+ int sy, dy;
+ dy = mdev->clip.y1 - drect->y;
+ sy = (u64) srect->h * dy / drect->h;
+ srect->y += sy;
+ srect->h -= sy;
+ drect->y += dy;
+ drect->h -= dy;
+ }
+
+ /*
+ * SCALE_HACC and SCALE_VACC have limited scale so we need to change
+ * SCALE_OFF in order to handle the full range of source coordinates.
+ */
+ hacc = srect->x & 0xFFFFF0; /* s8.12 */
+ vacc = srect->y & 0xFFFF0; /* s4.12 */
+ srect->x &= ~0xFFFFFF;
+ srect->y &= ~0xFFFFF;
+
+ mach64_waitfifo( mdrv, mdev, 12 );
+
+ mach64_out32( mmio, SCALE_3D_CNTL, scale_3d_cntl );
+ mach64_out32( mmio, SCALE_OFF, mdev->scale_offset +
+ (srect->y >> 16) * mdev->scale_pitch +
+ (srect->x >> 16) * DFB_BYTES_PER_PIXEL( source->config.format ) );
+
+ mach64_out32( mmio, SCALE_WIDTH, (srect->w + hacc) >> 16 );
+ mach64_out32( mmio, SCALE_HEIGHT, (srect->h + vacc) >> 16 );
+
+ mach64_out32( mmio, SCALE_PITCH, mdev->scale_pitch / DFB_BYTES_PER_PIXEL( source->config.format ) );
+
+ mach64_out32( mmio, SCALE_X_INC, srect->w / drect->w );
+ mach64_out32( mmio, SCALE_Y_INC, srect->h / drect->h );
+
+ if (mdev->blit_deinterlace && mdev->field)
+ vacc += 0x8000;
+
+ mach64_out32( mmio, SCALE_VACC, vacc );
+ mach64_out32( mmio, SCALE_HACC, hacc );
+
+ mach64_out32( mmio, DST_CNTL, DST_X_DIR | DST_Y_DIR );
+ mach64_out32( mmio, DST_Y_X, (S13( drect->x ) << 16) | S14( drect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (drect->w << 16) | drect->h );
+
+ /* Some scaler and 3D color registers are shared. */
+ MACH64_INVALIDATE( m_color_3d | m_color_tex );
+}
+
+static void mach64DoBlitTexOld( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ DFBRectangle *srect,
+ DFBRectangle *drect,
+ bool filter )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ u32 scale_3d_cntl = SCALE_3D_FCN_TEXTURE | MIP_MAP_DISABLE | mdev->blit_blend;
+
+ if (mdev->blit_deinterlace) {
+ srect->y /= 2;
+ srect->h /= 2;
+ }
+
+ srect->x <<= 1;
+ srect->y <<= 1;
+ srect->w <<= 1;
+ srect->h <<= 1;
+
+ /* Must add 0.5 to get correct rendering. */
+ srect->x += 0x1;
+ srect->y += 0x1;
+
+ if (filter) {
+ /* Avoid using texels outside of texture. */
+ srect->w -= 0x2;
+ srect->h -= 0x2;
+
+ scale_3d_cntl |= BILINEAR_TEX_EN | TEX_BLEND_FCN_LINEAR_MIPMAP_NEAREST;
+ }
+
+ if (mdev->blit_deinterlace && mdev->field)
+ srect->y += 0x1;
+
+ mach64_waitfifo( mdrv, mdev, 14 );
+
+ mach64_out32( mmio, SCALE_3D_CNTL, scale_3d_cntl );
+ mach64_out32( mmio, TEX_0_OFF + (mdev->tex_size << 2), mdev->tex_offset );
+
+ mach64_out32( mmio, S_X_INC2, 0 );
+ mach64_out32( mmio, S_Y_INC2, 0 );
+ mach64_out32( mmio, S_XY_INC2, 0 );
+ mach64_out32( mmio, S_X_INC_START, (srect->w << (25 - mdev->tex_size)) / drect->w );
+ mach64_out32( mmio, S_Y_INC, 0 );
+ mach64_out32( mmio, S_START, (srect->x << (25 - mdev->tex_size)) );
+
+ mach64_out32( mmio, T_X_INC2, 0 );
+ mach64_out32( mmio, T_Y_INC2, 0 );
+ mach64_out32( mmio, T_XY_INC2, 0 );
+ mach64_out32( mmio, T_X_INC_START, 0 );
+ mach64_out32( mmio, T_Y_INC, (srect->h << (25 - mdev->tex_size)) / drect->h );
+ mach64_out32( mmio, T_START, (srect->y << (25 - mdev->tex_size)) );
+
+ mach64_waitfifo( mdrv, mdev, 3 );
+
+ mach64_out32( mmio, DST_CNTL, DST_X_DIR | DST_Y_DIR );
+ mach64_out32( mmio, DST_Y_X, (S13( drect->x ) << 16) | S14( drect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (drect->w << 16) | drect->h );
+}
+
+static void mach64DoBlitTex( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ DFBRectangle *srect,
+ DFBRectangle *drect,
+ bool filter )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ u32 scale_3d_cntl = SCALE_3D_FCN_TEXTURE | MIP_MAP_DISABLE | mdev->blit_blend;
+
+ if (mdev->blit_deinterlace) {
+ srect->y /= 2;
+ srect->h /= 2;
+ }
+
+ srect->x <<= 1;
+ srect->y <<= 1;
+ srect->w <<= 1;
+ srect->h <<= 1;
+
+ /* Must add 0.5 to get correct rendering. */
+ srect->x += 0x1;
+ srect->y += 0x1;
+
+ if (filter) {
+ /* Avoid using texels outside of texture. */
+ srect->w -= 0x2;
+ srect->h -= 0x2;
+
+ scale_3d_cntl |= BILINEAR_TEX_EN | TEX_BLEND_FCN_LINEAR_MIPMAP_NEAREST;
+ }
+
+ if (mdev->blit_deinterlace && mdev->field)
+ srect->y += 0x1;
+
+ mach64_waitfifo( mdrv, mdev, 13 );
+
+ mach64_out32( mmio, SCALE_3D_CNTL, scale_3d_cntl );
+ mach64_out32( mmio, TEX_0_OFF + (mdev->tex_size << 2), mdev->tex_offset );
+
+ mach64_out32( mmio, STW_EXP, (1 << 16) | (0 << 8) | (0 << 0) );
+
+ /* This register doesn't seem to have any effect on the result. */
+ mach64_out32( mmio, LOG_MAX_INC, 0 );
+
+ mach64_out32( mmio, S_X_INC, (srect->w << (23 - mdev->tex_pitch)) / drect->w );
+ mach64_out32( mmio, S_Y_INC, 0 );
+ mach64_out32( mmio, S_START, (srect->x << (23 - mdev->tex_pitch)) );
+
+ mach64_out32( mmio, W_X_INC, 0 );
+ mach64_out32( mmio, W_Y_INC, 0 );
+ mach64_out32( mmio, W_START, 1 << 23 );
+
+ mach64_out32( mmio, T_X_INC, 0 );
+ mach64_out32( mmio, T_Y_INC, (srect->h << (23 - mdev->tex_height)) / drect->h );
+ mach64_out32( mmio, T_START, (srect->y << (23 - mdev->tex_height)) );
+
+ mach64_waitfifo( mdrv, mdev, 3 );
+
+ mach64_out32( mmio, DST_CNTL, DST_X_DIR | DST_Y_DIR );
+ mach64_out32( mmio, DST_Y_X, (S13( drect->x ) << 16) | S14( drect->y ) );
+ mach64_out32( mmio, DST_HEIGHT_WIDTH, (drect->w << 16) | drect->h );
+}
+
+static bool mach64Blit2D( void *drv, void *dev,
+ DFBRectangle *rect, int dx, int dy )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ DFBRectangle drect = { dx, dy, rect->w, rect->h };
+
+ mach64DoBlit2D( mdrv, mdev, rect, &drect );
+
+ return true;
+}
+
+static bool mach64BlitScaleOld( void *drv, void *dev,
+ DFBRectangle *rect, int dx, int dy )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ DFBRectangle drect = { dx, dy, rect->w, rect->h };
+
+ mach64DoBlitScaleOld( mdrv, mdev, rect, &drect, mdev->blit_deinterlace );
+
+ return true;
+}
+
+static bool mach64StretchBlitScaleOld( void *drv, void *dev,
+ DFBRectangle *srect, DFBRectangle *drect )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64DoBlitScaleOld( mdrv, mdev, srect, drect, true );
+
+ return true;
+}
+
+static bool mach64BlitScale( void *drv, void *dev,
+ DFBRectangle *rect, int dx, int dy )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ DFBRectangle drect = { dx, dy, rect->w, rect->h };
+
+ mach64DoBlitScale( mdrv, mdev, rect, &drect, mdev->blit_deinterlace );
+
+ return true;
+}
+
+static bool mach64StretchBlitScale( void *drv, void *dev,
+ DFBRectangle *srect, DFBRectangle *drect )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64DoBlitScale( mdrv, mdev, srect, drect, true );
+
+ return true;
+}
+
+static bool mach64BlitTexOld( void *drv, void *dev,
+ DFBRectangle *rect, int dx, int dy )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ DFBRectangle drect = { dx, dy, rect->w, rect->h };
+
+ mach64DoBlitTexOld( mdrv, mdev, rect, &drect, mdev->blit_deinterlace );
+
+ return true;
+}
+
+static bool mach64StretchBlitTexOld( void *drv, void *dev,
+ DFBRectangle *srect, DFBRectangle *drect )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64DoBlitTexOld( mdrv, mdev, srect, drect, true );
+
+ return true;
+}
+
+static bool mach64BlitTex( void *drv, void *dev,
+ DFBRectangle *rect, int dx, int dy )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ DFBRectangle drect = { dx, dy, rect->w, rect->h };
+
+ mach64DoBlitTex( mdrv, mdev, rect, &drect, mdev->blit_deinterlace );
+
+ return true;
+}
+
+static bool mach64StretchBlitTex( void *drv, void *dev,
+ DFBRectangle *srect, DFBRectangle *drect )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) drv;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) dev;
+
+ mach64DoBlitTex( mdrv, mdev, srect, drect, true );
+
+ return true;
+}
+
+/* */
+
+#define MACH64_CFG_CHIP_TYPE( a, b ) (((a) << 8) | (b))
+
+static Mach64ChipType
+mach64_chip_type_vt( Mach64DriverData *mdrv,
+ GraphicsDeviceInfo *device_info )
+{
+ u32 config_chip_id = mach64_in32( mdrv->mmio_base, CONFIG_CHIP_ID );
+ u32 cfg_chip_type = config_chip_id & CFG_CHIP_TYPE;
+
+ switch (cfg_chip_type) {
+ case MACH64_CFG_CHIP_TYPE( 'V', 'T' ):
+ switch ((config_chip_id & CFG_CHIP_MAJOR) >> 24) {
+ case 0:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH,
+ (config_chip_id & CFG_CHIP_MINOR) ? "ATI-264VT2 (%c%c)" : "ATI-264VT (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_264VT;
+ case 1:
+ case 2:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "ATI-264VT3 (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_264VT3;
+ }
+ break;
+ case MACH64_CFG_CHIP_TYPE( 'V', 'U' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "ATI-264VT3 (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_264VT3;
+ case MACH64_CFG_CHIP_TYPE( 'V', 'V' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "ATI-264VT4 (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_264VT4;
+ }
+ D_WARN( "DirectFB/Mach64: Unknown VT chip type %c%c (0x%08x)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF, config_chip_id );
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "Mach64 VT" );
+ return CHIP_UNKNOWN;
+}
+
+static Mach64ChipType
+mach64_chip_type_gt( Mach64DriverData *mdrv,
+ GraphicsDeviceInfo *device_info )
+{
+ u32 config_chip_id = mach64_in32( mdrv->mmio_base, CONFIG_CHIP_ID );
+ u32 cfg_chip_type = config_chip_id & CFG_CHIP_TYPE;
+
+ switch (cfg_chip_type) {
+ case MACH64_CFG_CHIP_TYPE( 'G', 'T' ):
+ switch ((config_chip_id & CFG_CHIP_MAJOR) >> 24) {
+ case 0:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE;
+ case 1:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage II (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_II;
+ case 2:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage II+ (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_IIPLUS;
+ }
+ break;
+ case MACH64_CFG_CHIP_TYPE( 'G', 'U' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage II+ (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_IIPLUS;
+ case MACH64_CFG_CHIP_TYPE( 'L', 'G' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage LT (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_LT;
+ case MACH64_CFG_CHIP_TYPE( 'G', 'V' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'W' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'Y' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'Z' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage IIC (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_IIC;
+ case MACH64_CFG_CHIP_TYPE( 'G', 'B' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'D' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'I' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'P' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'Q' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage Pro (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_PRO;
+ case MACH64_CFG_CHIP_TYPE( 'L', 'B' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'D' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'I' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'P' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'Q' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage LT Pro (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_LT_PRO;
+ case MACH64_CFG_CHIP_TYPE( 'G', 'M' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'O' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'R' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage XL (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_XLXC;
+ case MACH64_CFG_CHIP_TYPE( 'G', 'L' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'N' ):
+ case MACH64_CFG_CHIP_TYPE( 'G', 'S' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage XC (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_XLXC;
+ case MACH64_CFG_CHIP_TYPE( 'L', 'M' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'N' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'R' ):
+ case MACH64_CFG_CHIP_TYPE( 'L', 'S' ):
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "3D Rage Mobility (%c%c)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF );
+ return CHIP_3D_RAGE_MOBILITY;
+ }
+ D_WARN( "DirectFB/Mach64: Unknown GT chip type %c%c (0x%08x)",
+ cfg_chip_type >> 8, cfg_chip_type & 0xFF, config_chip_id );
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "Mach64 GT" );
+ return CHIP_UNKNOWN;
+}
+
+/* exported symbols */
+
+static int
+driver_probe( CoreGraphicsDevice *device )
+{
+ switch (dfb_gfxcard_get_accelerator( device )) {
+ case FB_ACCEL_ATI_MACH64GX:
+ case FB_ACCEL_ATI_MACH64CT:
+ case FB_ACCEL_ATI_MACH64VT:
+ case FB_ACCEL_ATI_MACH64GT:
+ return 1;
+ }
+
+ return 0;
+}
+
+static void
+driver_get_info( CoreGraphicsDevice *device,
+ GraphicsDriverInfo *info )
+{
+ /* fill driver info structure */
+ snprintf( info->name,
+ DFB_GRAPHICS_DRIVER_INFO_NAME_LENGTH,
+ "ATI Mach64 Driver" );
+
+ snprintf( info->vendor,
+ DFB_GRAPHICS_DRIVER_INFO_VENDOR_LENGTH,
+ "Ville Syrjala" );
+
+ info->version.major = 0;
+ info->version.minor = 13;
+
+ info->driver_data_size = sizeof (Mach64DriverData);
+ info->device_data_size = sizeof (Mach64DeviceData);
+}
+
+static DFBResult
+driver_init_driver( CoreGraphicsDevice *device,
+ GraphicsDeviceFuncs *funcs,
+ void *driver_data,
+ void *device_data,
+ CoreDFB *core )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+
+ mdrv->mmio_base = (volatile u8*) dfb_gfxcard_map_mmio( device, 0, -1 );
+ if (!mdrv->mmio_base)
+ return DFB_IO;
+
+ mdrv->device_data = (Mach64DeviceData*) device_data;
+
+ mdrv->accelerator = dfb_gfxcard_get_accelerator( device );
+
+ funcs->EngineReset = mach64EngineReset;
+ funcs->EngineSync = mach64EngineSync;
+ funcs->CheckState = mach64CheckState;
+ funcs->SetState = mach64SetState;
+ funcs->FillRectangle = mach64FillRectangle;
+ funcs->DrawRectangle = mach64DrawRectangle;
+
+ /* Set dynamically: funcs->DrawLine, funcs->Blit, funcs->StretchBlit */
+
+ switch (mdrv->accelerator) {
+ case FB_ACCEL_ATI_MACH64GT:
+ if (!dfb_config->font_format)
+ dfb_config->font_format = DSPF_ARGB;
+ funcs->FlushTextureCache = mach64FlushTextureCache;
+ funcs->CheckState = mach64GTCheckState;
+ funcs->SetState = mach64GTSetState;
+ funcs->FillTriangle = mach64FillTriangle;
+ case FB_ACCEL_ATI_MACH64VT:
+ mdrv->mmio_base += 0x400;
+
+ dfb_layers_register( dfb_screens_at( DSCID_PRIMARY ),
+ driver_data, &mach64OverlayFuncs );
+ break;
+ }
+
+ return DFB_OK;
+}
+
+static DFBResult
+driver_init_device( CoreGraphicsDevice *device,
+ GraphicsDeviceInfo *device_info,
+ void *driver_data,
+ void *device_data )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ /* fill device info */
+ device_info->caps.flags = CCF_CLIPPING;
+
+ switch (mdrv->accelerator) {
+ case FB_ACCEL_ATI_MACH64GT:
+ device_info->caps.drawing = MACH64GT_SUPPORTED_DRAWINGFLAGS;
+ device_info->caps.blitting = MACH64GT_SUPPORTED_BLITTINGFLAGS;
+ device_info->caps.accel = MACH64GT_SUPPORTED_DRAWINGFUNCTIONS |
+ MACH64GT_SUPPORTED_BLITTINGFUNCTIONS;
+ break;
+ default:
+ device_info->caps.drawing = MACH64_SUPPORTED_DRAWINGFLAGS;
+ device_info->caps.blitting = MACH64_SUPPORTED_BLITTINGFLAGS;
+ device_info->caps.accel = MACH64_SUPPORTED_DRAWINGFUNCTIONS |
+ MACH64_SUPPORTED_BLITTINGFUNCTIONS;
+ break;
+ }
+
+ switch (mdrv->accelerator) {
+ case FB_ACCEL_ATI_MACH64GX:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "Mach64 GX" );
+ break;
+ case FB_ACCEL_ATI_MACH64CT:
+ snprintf( device_info->name,
+ DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, "Mach64 CT" );
+ break;
+ case FB_ACCEL_ATI_MACH64VT:
+ mdev->chip = mach64_chip_type_vt( mdrv, device_info );
+ break;
+ case FB_ACCEL_ATI_MACH64GT:
+ mdev->chip = mach64_chip_type_gt( mdrv, device_info );
+
+ /* Max texture size is 1024x1024 */
+ device_info->limits.surface_max_power_of_two_pixelpitch = 1024;
+ device_info->limits.surface_max_power_of_two_height = 1024;
+ break;
+ }
+
+ snprintf( device_info->vendor,
+ DFB_GRAPHICS_DEVICE_INFO_VENDOR_LENGTH, "ATI" );
+
+ device_info->limits.surface_byteoffset_alignment = 8;
+ device_info->limits.surface_bytepitch_alignment = 16;
+ device_info->limits.surface_pixelpitch_alignment = 8;
+
+ /* 3D Rage Pro is the first chip that supports auto fast fill/block write. */
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ mdev->hw_debug = mach64_in32( mmio, HW_DEBUG );
+
+ /* Save original HW_DEBUG. */
+ mdev->hw_debug_orig = mdev->hw_debug;
+
+ /* Enable auto fast fill and fast fill/block write scissoring. */
+ mdev->hw_debug &= ~(AUTO_FF_DIS | INTER_PRIM_DIS);
+
+ if ((mach64_in32( mmio, CONFIG_STAT0 ) & CFG_MEM_TYPE) == CFG_MEM_TYPE_SGRAM) {
+ /* Enable auto block write and auto color register updates. */
+ mdev->hw_debug &= ~(AUTO_BLKWRT_DIS | AUTO_BLKWRT_COLOR_DIS);
+
+ device_info->limits.surface_byteoffset_alignment = 64;
+ device_info->limits.surface_bytepitch_alignment = 64;
+ }
+ }
+
+ return DFB_OK;
+}
+
+static void
+driver_close_device( CoreGraphicsDevice *device,
+ void *driver_data,
+ void *device_data )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64DeviceData *mdev = (Mach64DeviceData*) device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ D_DEBUG( "DirectFB/Mach64: FIFO Performance Monitoring:\n" );
+ D_DEBUG( "DirectFB/Mach64: %9d mach64_waitfifo calls\n",
+ mdev->waitfifo_calls );
+ D_DEBUG( "DirectFB/Mach64: %9d register writes (mach64_waitfifo sum)\n",
+ mdev->waitfifo_sum );
+ D_DEBUG( "DirectFB/Mach64: %9d FIFO wait cycles (depends on CPU)\n",
+ mdev->fifo_waitcycles );
+ D_DEBUG( "DirectFB/Mach64: %9d IDLE wait cycles (depends on CPU)\n",
+ mdev->idle_waitcycles );
+ D_DEBUG( "DirectFB/Mach64: %9d FIFO space cache hits(depends on CPU)\n",
+ mdev->fifo_cache_hits );
+ D_DEBUG( "DirectFB/Mach64: Conclusion:\n" );
+ D_DEBUG( "DirectFB/Mach64: Average register writes/mach64_waitfifo"
+ "call:%.2f\n",
+ mdev->waitfifo_sum/(float)(mdev->waitfifo_calls) );
+ D_DEBUG( "DirectFB/Mach64: Average wait cycles/mach64_waitfifo call:"
+ " %.2f\n",
+ mdev->fifo_waitcycles/(float)(mdev->waitfifo_calls) );
+ D_DEBUG( "DirectFB/Mach64: Average fifo space cache hits: %02d%%\n",
+ (int)(100 * mdev->fifo_cache_hits/
+ (float)(mdev->waitfifo_calls)) );
+
+ switch (mdrv->accelerator) {
+ case FB_ACCEL_ATI_MACH64GT:
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, SCALE_3D_CNTL, 0 );
+ case FB_ACCEL_ATI_MACH64VT:
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, OVERLAY_SCALE_CNTL, 0 );
+ break;
+ }
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ /* Restore original HW_DEBUG. */
+ mach64_out32( mmio, HW_DEBUG, mdev->hw_debug_orig );
+ }
+}
+
+static void
+driver_close_driver( CoreGraphicsDevice *device,
+ void *driver_data )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+
+ switch (mdrv->accelerator) {
+ case FB_ACCEL_ATI_MACH64VT:
+ case FB_ACCEL_ATI_MACH64GT:
+ mdrv->mmio_base -= 0x400;
+ break;
+ }
+
+ dfb_gfxcard_unmap_mmio( device, mdrv->mmio_base, -1 );
+}
diff --git a/Source/DirectFB/gfxdrivers/mach64/mach64.h b/Source/DirectFB/gfxdrivers/mach64/mach64.h
new file mode 100755
index 0000000..86e4b68
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/mach64.h
@@ -0,0 +1,120 @@
+/*
+ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org)
+ (c) Copyright 2000-2004 Convergence (integrated media) GmbH
+
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <dok@directfb.org>,
+ Andreas Hundt <andi@fischlustig.de>,
+ Sven Neumann <neo@directfb.org>,
+ Ville Syrjälä <syrjala@sci.fi> and
+ Claudio Ciccani <klan@users.sf.net>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef ___MACH64_H__
+#define ___MACH64_H__
+
+#include <dfb_types.h>
+#include <core/coretypes.h>
+#include <core/layers.h>
+
+#define S13( val ) ((val) & 0x3FFF)
+#define S14( val ) ((val) & 0x7FFF)
+
+typedef enum {
+ m_source = 0x001,
+ m_source_scale = 0x002,
+ m_color = 0x004,
+ m_color_3d = 0x008,
+ m_color_tex = 0x010,
+ m_srckey = 0x020,
+ m_srckey_scale = 0x040,
+ m_dstkey = 0x080,
+ m_disable_key = 0x100,
+ m_draw_blend = 0x200,
+ m_blit_blend = 0x400,
+} Mach64StateBits;
+
+#define MACH64_VALIDATE(b) (mdev->valid |= (b))
+#define MACH64_INVALIDATE(b) (mdev->valid &= ~(b))
+#define MACH64_IS_VALID(b) (mdev->valid & (b))
+
+typedef enum {
+ CHIP_UNKNOWN = 0,
+ CHIP_264VT,
+ CHIP_3D_RAGE,
+ CHIP_264VT3,
+ CHIP_3D_RAGE_II,
+ CHIP_3D_RAGE_IIPLUS,
+ CHIP_3D_RAGE_LT,
+ CHIP_264VT4,
+ CHIP_3D_RAGE_IIC,
+ CHIP_3D_RAGE_PRO,
+ CHIP_3D_RAGE_LT_PRO,
+ CHIP_3D_RAGE_XLXC,
+ CHIP_3D_RAGE_MOBILITY,
+} Mach64ChipType;
+
+typedef struct {
+ Mach64ChipType chip;
+
+ /* for fifo/performance monitoring */
+ unsigned int fifo_space;
+ unsigned int waitfifo_sum;
+ unsigned int waitfifo_calls;
+ unsigned int fifo_waitcycles;
+ unsigned int idle_waitcycles;
+ unsigned int fifo_cache_hits;
+
+ Mach64StateBits valid;
+
+ u32 hw_debug;
+ u32 hw_debug_orig;
+
+ u32 pix_width;
+
+ u32 draw_blend;
+ u32 blit_blend;
+
+ int tex_offset;
+ int tex_pitch;
+ int tex_height;
+ int tex_size;
+
+ int scale_offset;
+ int scale_pitch;
+
+ CoreSurface *source;
+
+ bool blit_deinterlace;
+ int field;
+
+ DFBRegion clip;
+
+ bool use_scaler_3d;
+} Mach64DeviceData;
+
+typedef struct {
+ int accelerator;
+ volatile u8 *mmio_base;
+ Mach64DeviceData *device_data;
+} Mach64DriverData;
+
+extern DisplayLayerFuncs mach64OverlayFuncs;
+
+#endif
diff --git a/Source/DirectFB/gfxdrivers/mach64/mach64_overlay.c b/Source/DirectFB/gfxdrivers/mach64/mach64_overlay.c
new file mode 100755
index 0000000..11cff28
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/mach64_overlay.c
@@ -0,0 +1,724 @@
+/*
+ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org)
+ (c) Copyright 2000-2004 Convergence (integrated media) GmbH
+
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <dok@directfb.org>,
+ Andreas Hundt <andi@fischlustig.de>,
+ Sven Neumann <neo@directfb.org>,
+ Ville Syrjälä <syrjala@sci.fi> and
+ Claudio Ciccani <klan@users.sf.net>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <direct/messages.h>
+
+#include <core/coredefs.h>
+#include <core/layers.h>
+#include <core/surface.h>
+#include <core/system.h>
+
+#include <gfx/convert.h>
+
+#include <misc/util.h>
+
+#include "regs.h"
+#include "mmio.h"
+#include "mach64.h"
+
+typedef struct {
+ CoreLayerRegionConfig config;
+ bool visible;
+
+ /* overlay registers */
+ struct {
+ u32 overlay_Y_X_START;
+ u32 overlay_Y_X_END;
+ u32 overlay_GRAPHICS_KEY_CLR;
+ u32 overlay_GRAPHICS_KEY_MSK;
+ u32 overlay_VIDEO_KEY_CLR;
+ u32 overlay_VIDEO_KEY_MSK;
+ u32 overlay_KEY_CNTL;
+ u32 overlay_SCALE_INC;
+ u32 overlay_SCALE_CNTL;
+ u32 scaler_HEIGHT_WIDTH;
+ u32 scaler_BUF_PITCH;
+ u32 scaler_BUF0_OFFSET;
+ u32 scaler_BUF1_OFFSET;
+ u32 scaler_BUF0_OFFSET_U;
+ u32 scaler_BUF0_OFFSET_V;
+ u32 scaler_BUF1_OFFSET_U;
+ u32 scaler_BUF1_OFFSET_V;
+ u32 video_FORMAT;
+ u32 capture_CONFIG;
+ } regs;
+} Mach64OverlayLayerData;
+
+static void ov_reset( Mach64DriverData *mdrv );
+static void ov_set_regs( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov );
+static void ov_calc_regs( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config, CoreSurface *surface,
+ CoreSurfaceBufferLock *lock );
+static void ov_set_buffer( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov );
+static void ov_calc_buffer( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config, CoreSurface *surface,
+ CoreSurfaceBufferLock *lock );
+static void ov_set_colorkey( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov );
+static void ov_calc_colorkey( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config );
+static void ov_set_opacity( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov );
+static void ov_calc_opacity( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config );
+static void ov_set_field( Mach64DriverData *mdrv, Mach64OverlayLayerData *mov );
+
+#define OV_SUPPORTED_OPTIONS (DLOP_SRC_COLORKEY | DLOP_DST_COLORKEY | DLOP_DEINTERLACING)
+
+/**********************/
+
+static int
+ovLayerDataSize( void )
+{
+ return sizeof(Mach64OverlayLayerData);
+}
+
+static DFBResult
+ovInitLayer( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ DFBDisplayLayerDescription *description,
+ DFBDisplayLayerConfig *config,
+ DFBColorAdjustment *adjustment )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64DeviceData *mdev = mdrv->device_data;
+
+ /* set capabilities and type */
+ description->caps = DLCAPS_SCREEN_LOCATION | DLCAPS_SURFACE |
+ DLCAPS_DST_COLORKEY | DLCAPS_DEINTERLACING;
+
+ if (mdev->chip >= CHIP_264VT3)
+ description->caps |= DLCAPS_SRC_COLORKEY;
+
+ description->type = DLTF_VIDEO | DLTF_STILL_PICTURE;
+
+ /* set name */
+ snprintf( description->name,
+ DFB_DISPLAY_LAYER_DESC_NAME_LENGTH, "Mach64 Overlay" );
+
+ /* fill out the default configuration */
+ config->flags = DLCONF_WIDTH | DLCONF_HEIGHT |
+ DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE |
+ DLCONF_OPTIONS;
+ config->width = (mdev->chip >= CHIP_264VT3) ? 640 : 320;
+ config->height = (mdev->chip >= CHIP_264VT3) ? 480 : 240;
+ config->pixelformat = DSPF_YUY2;
+ config->buffermode = DLBM_FRONTONLY;
+ config->options = DLOP_NONE;
+
+ adjustment->flags = DCAF_NONE;
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ description->caps |= DLCAPS_BRIGHTNESS | DLCAPS_SATURATION;
+
+ /* fill out default color adjustment,
+ only fields set in flags will be accepted from applications */
+ adjustment->flags |= DCAF_BRIGHTNESS | DCAF_SATURATION;
+ adjustment->brightness = 0x8000;
+ adjustment->saturation = 0x8000;
+ }
+
+ return DFB_OK;
+}
+
+static DFBResult
+ovTestRegion( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ CoreLayerRegionConfig *config,
+ CoreLayerRegionConfigFlags *failed )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64DeviceData *mdev = mdrv->device_data;
+ CoreLayerRegionConfigFlags fail = 0;
+ int max_width, max_height = 1024;
+
+ switch (mdev->chip) {
+ case CHIP_264VT: /* 264VT2 verified */
+ case CHIP_3D_RAGE: /* not verified */
+ max_width = 384;
+ break;
+ case CHIP_264VT3: /* not verified */
+ case CHIP_3D_RAGE_II: /* not verified */
+ case CHIP_3D_RAGE_IIPLUS:
+ case CHIP_264VT4: /* not verified */
+ case CHIP_3D_RAGE_IIC:
+ case CHIP_3D_RAGE_XLXC:
+ case CHIP_3D_RAGE_MOBILITY:
+ max_width = 720;
+ break;
+ case CHIP_3D_RAGE_PRO: /* not verified */
+ case CHIP_3D_RAGE_LT_PRO:
+ max_width = 768;
+ break;
+ default:
+ D_BUG( "unknown chip" );
+ return DFB_UNSUPPORTED;
+ }
+
+ if (config->options & DLOP_DEINTERLACING)
+ max_height = 2048;
+
+ /* check for unsupported options */
+ if (config->options & ~OV_SUPPORTED_OPTIONS)
+ fail |= CLRCF_OPTIONS;
+
+ /*
+ * Video keying doesn't work the same way on 264VT2 as it does
+ * on later chips. If enabled the overlay goes completely black
+ * so clearly it does something but not what we want.
+ */
+ if (mdev->chip < CHIP_264VT3 && config->options & DLOP_SRC_COLORKEY)
+ fail |= CLRCF_OPTIONS;
+
+ /* check pixel format */
+ switch (config->format) {
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ case DSPF_RGB16:
+ case DSPF_RGB32:
+ case DSPF_YUY2:
+ case DSPF_UYVY:
+ break;
+ case DSPF_I420:
+ case DSPF_YV12:
+ if (mdev->chip >= CHIP_3D_RAGE_PRO)
+ break;
+ default:
+ fail |= CLRCF_FORMAT;
+ }
+
+ switch (config->format) {
+ case DSPF_I420:
+ case DSPF_YV12:
+ if (config->height & 1)
+ fail |= CLRCF_HEIGHT;
+ case DSPF_YUY2:
+ case DSPF_UYVY:
+ if (config->width & 1)
+ fail |= CLRCF_WIDTH;
+ default:
+ break;
+ }
+
+ /* check width */
+ if (config->width > max_width || config->width < 1)
+ fail |= CLRCF_WIDTH;
+
+ /* check height */
+ if (config->height > max_height || config->height < 1)
+ fail |= CLRCF_HEIGHT;
+
+ /* write back failing fields */
+ if (failed)
+ *failed = fail;
+
+ /* return failure if any field failed */
+ if (fail)
+ return DFB_UNSUPPORTED;
+
+ return DFB_OK;
+}
+
+static DFBResult
+ovSetRegion( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ void *region_data,
+ CoreLayerRegionConfig *config,
+ CoreLayerRegionConfigFlags updated,
+ CoreSurface *surface,
+ CorePalette *palette,
+ CoreSurfaceBufferLock *lock )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64OverlayLayerData *mov = (Mach64OverlayLayerData*) layer_data;
+
+ /* remember configuration */
+ mov->config = *config;
+
+ if (updated == CLRCF_ALL)
+ ov_reset( mdrv );
+
+ if (updated & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_FORMAT | CLRCF_SOURCE | CLRCF_DEST | CLRCF_OPTIONS)) {
+ ov_calc_buffer( mdrv, mov, config, surface, lock );
+ ov_calc_regs( mdrv, mov, config, surface, lock );
+ ov_set_buffer( mdrv, mov );
+ ov_set_regs( mdrv, mov );
+ }
+
+ if (updated & (CLRCF_OPTIONS | CLRCF_SRCKEY | CLRCF_DSTKEY)) {
+ ov_calc_colorkey( mdrv, mov, config );
+ ov_set_colorkey( mdrv, mov );
+ }
+
+ if (updated & CLRCF_OPTIONS)
+ ov_set_field( mdrv, mov );
+
+ if (updated & (CLRCF_DEST | CLRCF_OPACITY)) {
+ ov_calc_opacity( mdrv, mov, config );
+ ov_set_opacity( mdrv, mov );
+ }
+
+ return DFB_OK;
+}
+
+static DFBResult
+ovRemoveRegion( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ void *region_data )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+
+ /*
+ * On 264VT2 the keyer sometimes remains active
+ * even after the overlay has been disabled.
+ */
+ mach64_out32( mmio, OVERLAY_KEY_CNTL,
+ VIDEO_KEY_FN_FALSE | GRAPHICS_KEY_FN_FALSE | OVERLAY_CMP_MIX_OR );
+
+ mach64_out32( mmio, OVERLAY_SCALE_CNTL, 0 );
+
+ return DFB_OK;
+}
+
+static DFBResult
+ovFlipRegion( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ void *region_data,
+ CoreSurface *surface,
+ DFBSurfaceFlipFlags flags,
+ CoreSurfaceBufferLock *lock )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64OverlayLayerData *mov = (Mach64OverlayLayerData*) layer_data;
+
+ ov_calc_buffer( mdrv, mov, &mov->config, surface, lock );
+ ov_set_buffer( mdrv, mov );
+
+ dfb_surface_flip( surface, false );
+
+ return DFB_OK;
+}
+
+static DFBResult
+ovSetColorAdjustment( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ DFBColorAdjustment *adj )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (mdev->chip < CHIP_3D_RAGE_PRO)
+ return DFB_UNSUPPORTED;
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+
+ mach64_out32( mmio, SCALER_COLOUR_CNTL,
+ (((adj->brightness >> 9) - 64) & 0x0000007F) |
+ ((adj->saturation >> 3) & 0x00001F00) |
+ ((adj->saturation << 5) & 0x001F0000) );
+
+ return DFB_OK;
+}
+
+static DFBResult
+ovSetInputField( CoreLayer *layer,
+ void *driver_data,
+ void *layer_data,
+ void *region_data,
+ int field )
+{
+ Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
+ Mach64OverlayLayerData *mov = (Mach64OverlayLayerData*) layer_data;
+
+ mov->regs.capture_CONFIG = OVL_BUF_MODE_SINGLE | (field ? OVL_BUF_NEXT_BUF1 : OVL_BUF_NEXT_BUF0);
+
+ ov_set_field( mdrv, mov );
+
+ return DFB_OK;
+}
+
+DisplayLayerFuncs mach64OverlayFuncs = {
+ .LayerDataSize = ovLayerDataSize,
+ .InitLayer = ovInitLayer,
+
+ .TestRegion = ovTestRegion,
+ .SetRegion = ovSetRegion,
+ .RemoveRegion = ovRemoveRegion,
+ .FlipRegion = ovFlipRegion,
+ .SetColorAdjustment = ovSetColorAdjustment,
+ .SetInputField = ovSetInputField,
+};
+
+/* internal */
+
+static void ov_reset( Mach64DriverData *mdrv )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ mach64_waitfifo( mdrv, mdev, 6 );
+
+ mach64_out32( mmio, SCALER_H_COEFF0, 0x00002000 );
+ mach64_out32( mmio, SCALER_H_COEFF1, 0x0D06200D );
+ mach64_out32( mmio, SCALER_H_COEFF2, 0x0D0A1C0D );
+ mach64_out32( mmio, SCALER_H_COEFF3, 0x0C0E1A0C );
+ mach64_out32( mmio, SCALER_H_COEFF4, 0x0C14140C );
+ mach64_out32( mmio, SCALER_COLOUR_CNTL, 0x00101000 );
+ }
+
+ if (mdev->chip >= CHIP_264VT3) {
+ mach64_waitfifo( mdrv, mdev, 2 );
+
+ mach64_out32( mmio, OVERLAY_EXCLUSIVE_HORZ, 0 );
+ mach64_out32( mmio, OVERLAY_EXCLUSIVE_VERT, 0 );
+ }
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+
+ mach64_out32( mmio, OVERLAY_SCALE_CNTL, 0 );
+ mach64_out32( mmio, SCALER_TEST, 0 );
+}
+
+static void ov_set_regs( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, (mdev->chip >= CHIP_264VT3) ? 6 : 7 );
+
+ mach64_out32( mmio, VIDEO_FORMAT, mov->regs.video_FORMAT );
+ mach64_out32( mmio, OVERLAY_Y_X_START, mov->regs.overlay_Y_X_START );
+ mach64_out32( mmio, OVERLAY_Y_X_END, mov->regs.overlay_Y_X_END );
+ mach64_out32( mmio, OVERLAY_SCALE_INC, mov->regs.overlay_SCALE_INC );
+ mach64_out32( mmio, SCALER_HEIGHT_WIDTH, mov->regs.scaler_HEIGHT_WIDTH );
+
+ if (mdev->chip >= CHIP_264VT3) {
+ mach64_out32( mmio, SCALER_BUF_PITCH, mov->regs.scaler_BUF_PITCH );
+ } else {
+ mach64_out32( mmio, BUF0_PITCH, mov->regs.scaler_BUF_PITCH );
+ mach64_out32( mmio, BUF1_PITCH, mov->regs.scaler_BUF_PITCH );
+ }
+}
+
+static void ov_set_buffer( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, (mdev->chip >= CHIP_3D_RAGE_PRO) ? 6 : 2 );
+
+ if (mdev->chip >= CHIP_264VT3) {
+ mach64_out32( mmio, SCALER_BUF0_OFFSET, mov->regs.scaler_BUF0_OFFSET );
+ mach64_out32( mmio, SCALER_BUF1_OFFSET, mov->regs.scaler_BUF1_OFFSET );
+ } else {
+ mach64_out32( mmio, BUF0_OFFSET, mov->regs.scaler_BUF0_OFFSET );
+ mach64_out32( mmio, BUF1_OFFSET, mov->regs.scaler_BUF1_OFFSET );
+ }
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ mach64_out32( mmio, SCALER_BUF0_OFFSET_U, mov->regs.scaler_BUF0_OFFSET_U );
+ mach64_out32( mmio, SCALER_BUF0_OFFSET_V, mov->regs.scaler_BUF0_OFFSET_V );
+ mach64_out32( mmio, SCALER_BUF1_OFFSET_U, mov->regs.scaler_BUF1_OFFSET_U );
+ mach64_out32( mmio, SCALER_BUF1_OFFSET_V, mov->regs.scaler_BUF1_OFFSET_V );
+ }
+}
+
+static void ov_set_colorkey( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, 5 );
+
+ mach64_out32( mmio, OVERLAY_GRAPHICS_KEY_CLR, mov->regs.overlay_GRAPHICS_KEY_CLR );
+ mach64_out32( mmio, OVERLAY_GRAPHICS_KEY_MSK, mov->regs.overlay_GRAPHICS_KEY_MSK );
+ mach64_out32( mmio, OVERLAY_VIDEO_KEY_CLR, mov->regs.overlay_VIDEO_KEY_CLR );
+ mach64_out32( mmio, OVERLAY_VIDEO_KEY_MSK, mov->regs.overlay_VIDEO_KEY_MSK );
+ mach64_out32( mmio, OVERLAY_KEY_CNTL, mov->regs.overlay_KEY_CNTL );
+}
+
+static void ov_set_opacity( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+
+ mach64_out32( mmio, OVERLAY_SCALE_CNTL, mov->regs.overlay_SCALE_CNTL );
+}
+
+static void ov_set_field( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+
+ mach64_out32( mmio, CAPTURE_CONFIG, mov->regs.capture_CONFIG );
+}
+
+static void ov_calc_regs( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config,
+ CoreSurface *surface,
+ CoreSurfaceBufferLock *lock )
+{
+ Mach64DeviceData *mdev = mdrv->device_data;
+ volatile u8 *mmio = mdrv->mmio_base;
+ VideoMode *mode = dfb_system_current_mode();
+ int yres = mode->yres;
+ unsigned int pitch = lock->pitch / DFB_BYTES_PER_PIXEL( surface->config.format );
+ DFBRectangle source = config->source;
+ DFBRectangle dest = config->dest;
+
+ DFBRegion dst;
+ int h_inc, v_inc;
+ u32 lcd_gen_ctrl, vert_stretching;
+ u8 ecp_div;
+
+ if (mode->doubled) {
+ dest.y *= 2;
+ dest.h *= 2;
+ yres *= 2;
+ }
+
+ if (config->options & DLOP_DEINTERLACING) {
+ source.y /= 2;
+ source.h /= 2;
+ pitch *= 2;
+ } else
+ mov->regs.capture_CONFIG = OVL_BUF_MODE_SINGLE | OVL_BUF_NEXT_BUF0;
+
+ dst.x1 = dest.x;
+ dst.y1 = dest.y;
+ dst.x2 = dest.x + dest.w - 1;
+ dst.y2 = dest.y + dest.h - 1;
+
+ mov->visible = dfb_region_intersect( &dst, 0, 0, mode->xres - 1, yres - 1 );
+
+ if (mode->laced) {
+ dest.y /= 2;
+ dest.h /= 2;
+ }
+
+ ecp_div = (mach64_in_pll( mmio, PLL_VCLK_CNTL ) & ECP_DIV) >> 4;
+ h_inc = (source.w << (12 + ecp_div)) / dest.w;
+
+ lcd_gen_ctrl = mach64_in_lcd( mdev, mmio, LCD_GEN_CTRL );
+ vert_stretching = mach64_in_lcd( mdev, mmio, VERT_STRETCHING );
+ if ((lcd_gen_ctrl & LCD_ON) && (vert_stretching & VERT_STRETCH_EN))
+ v_inc = (source.h << 2) * (vert_stretching & VERT_STRETCH_RATIO0) / dest.h;
+ else
+ v_inc = (source.h << 12) / dest.h;
+
+ switch (surface->config.format) {
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ mov->regs.video_FORMAT = SCALER_IN_RGB15;
+ break;
+ case DSPF_RGB16:
+ mov->regs.video_FORMAT = SCALER_IN_RGB16;
+ break;
+ case DSPF_RGB32:
+ mov->regs.video_FORMAT = SCALER_IN_RGB32;
+ break;
+ case DSPF_UYVY:
+ mov->regs.video_FORMAT = SCALER_IN_YVYU422;
+ break;
+ case DSPF_YUY2:
+ mov->regs.video_FORMAT = SCALER_IN_VYUY422;
+ break;
+ case DSPF_I420:
+ case DSPF_YV12:
+ mov->regs.video_FORMAT = SCALER_IN_YUV12;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat" );
+ }
+
+ mov->regs.scaler_HEIGHT_WIDTH = (source.w << 16) | source.h;
+ mov->regs.scaler_BUF_PITCH = pitch;
+
+ mov->regs.overlay_Y_X_START = (dst.x1 << 16) | dst.y1 | OVERLAY_LOCK_START;
+ mov->regs.overlay_Y_X_END = (dst.x2 << 16) | dst.y2;
+ mov->regs.overlay_SCALE_INC = (h_inc << 16) | v_inc;
+}
+
+static void ov_calc_buffer( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config,
+ CoreSurface *surface,
+ CoreSurfaceBufferLock *lock )
+{
+ unsigned int pitch = lock->pitch;
+ DFBRectangle source = config->source;
+
+ u32 offset, offset_u, offset_v;
+ int cropleft, croptop;
+
+ if (config->options & DLOP_DEINTERLACING) {
+ source.y /= 2;
+ source.h /= 2;
+ pitch *= 2;
+ }
+
+ /* Source cropping */
+ cropleft = source.x;
+ croptop = source.y;
+
+ /* Add destination cropping */
+ if (config->dest.x < 0)
+ cropleft += -config->dest.x * source.w / config->dest.w;
+ if (config->dest.y < 0)
+ croptop += -config->dest.y * source.h / config->dest.h;
+
+ switch (surface->config.format) {
+ case DSPF_I420:
+ cropleft &= ~15;
+ croptop &= ~1;
+
+ offset_u = lock->offset + surface->config.size.h * lock->pitch;
+ offset_v = offset_u + surface->config.size.h/2 * lock->pitch/2;
+ offset_u += croptop/2 * pitch/2 + cropleft/2;
+ offset_v += croptop/2 * pitch/2 + cropleft/2;
+ break;
+
+ case DSPF_YV12:
+ cropleft &= ~15;
+ croptop &= ~1;
+
+ offset_v = lock->offset + surface->config.size.h * lock->pitch;
+ offset_u = offset_v + surface->config.size.h/2 * lock->pitch/2;
+ offset_v += croptop/2 * pitch/2 + cropleft/2;
+ offset_u += croptop/2 * pitch/2 + cropleft/2;
+ break;
+
+ default:
+ offset_u = 0;
+ offset_v = 0;
+ break;
+ }
+
+ offset = lock->offset;
+ offset += croptop * pitch + cropleft * DFB_BYTES_PER_PIXEL( surface->config.format );
+
+ mov->regs.scaler_BUF0_OFFSET = offset;
+ mov->regs.scaler_BUF0_OFFSET_U = offset_u;
+ mov->regs.scaler_BUF0_OFFSET_V = offset_v;
+
+ mov->regs.scaler_BUF1_OFFSET = offset + lock->pitch;
+ mov->regs.scaler_BUF1_OFFSET_U = offset_u + lock->pitch/2;
+ mov->regs.scaler_BUF1_OFFSET_V = offset_v + lock->pitch/2;
+}
+
+static u32 ovColorKey[] = {
+ VIDEO_KEY_FN_TRUE | GRAPHICS_KEY_FN_TRUE | OVERLAY_CMP_MIX_OR, /* 0 */
+ VIDEO_KEY_FN_NOT_EQUAL | GRAPHICS_KEY_FN_FALSE | OVERLAY_CMP_MIX_OR, /* DLOP_SRC_COLORKEY */
+ VIDEO_KEY_FN_FALSE | GRAPHICS_KEY_FN_EQUAL | OVERLAY_CMP_MIX_OR, /* DLOP_DST_COLORKEY */
+ VIDEO_KEY_FN_NOT_EQUAL | GRAPHICS_KEY_FN_EQUAL | OVERLAY_CMP_MIX_AND /* DLOP_SRC_COLORKEY |
+ DLOP_DST_COLORKEY */
+};
+
+static void ov_calc_colorkey( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config )
+{
+ DFBSurfacePixelFormat primary_format = dfb_primary_layer_pixelformat();
+
+ /* Video key is always RGB24 */
+ mov->regs.overlay_VIDEO_KEY_CLR = PIXEL_RGB32( config->src_key.r,
+ config->src_key.g,
+ config->src_key.b );
+
+ /* The same mask is used for all three components */
+ mov->regs.overlay_VIDEO_KEY_MSK = 0xFF;
+
+ switch (primary_format) {
+ case DSPF_RGB332:
+ mov->regs.overlay_GRAPHICS_KEY_CLR = PIXEL_RGB332( config->dst_key.r,
+ config->dst_key.g,
+ config->dst_key.b );
+ break;
+ case DSPF_RGB555:
+ mov->regs.overlay_GRAPHICS_KEY_CLR = PIXEL_RGB555( config->dst_key.r,
+ config->dst_key.g,
+ config->dst_key.b );
+ break;
+ case DSPF_ARGB1555:
+ mov->regs.overlay_GRAPHICS_KEY_CLR = PIXEL_RGB555( config->dst_key.r,
+ config->dst_key.g,
+ config->dst_key.b );
+ break;
+ case DSPF_RGB16:
+ mov->regs.overlay_GRAPHICS_KEY_CLR = PIXEL_RGB16( config->dst_key.r,
+ config->dst_key.g,
+ config->dst_key.b );
+ break;
+ case DSPF_ARGB:
+ case DSPF_RGB32:
+ mov->regs.overlay_GRAPHICS_KEY_CLR = PIXEL_RGB32( config->dst_key.r,
+ config->dst_key.g,
+ config->dst_key.b );
+ break;
+ default:
+ D_BUG( "unexpected pixelformat" );
+ }
+
+ mov->regs.overlay_GRAPHICS_KEY_MSK = (1 << DFB_COLOR_BITS_PER_PIXEL( primary_format )) - 1;
+
+ mov->regs.overlay_KEY_CNTL = ovColorKey[(config->options >> 3) & 3];
+}
+
+static void ov_calc_opacity( Mach64DriverData *mdrv,
+ Mach64OverlayLayerData *mov,
+ CoreLayerRegionConfig *config )
+{
+ mov->regs.overlay_SCALE_CNTL = SCALE_PIX_EXPAND | SCALE_Y2R_TEMP;
+
+ if (config->opacity && mov->visible)
+ mov->regs.overlay_SCALE_CNTL |= OVERLAY_EN | SCALE_EN;
+}
diff --git a/Source/DirectFB/gfxdrivers/mach64/mach64_state.c b/Source/DirectFB/gfxdrivers/mach64/mach64_state.c
new file mode 100755
index 0000000..8e798cc
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/mach64_state.c
@@ -0,0 +1,654 @@
+/*
+ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org)
+ (c) Copyright 2000-2004 Convergence (integrated media) GmbH
+
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <dok@directfb.org>,
+ Andreas Hundt <andi@fischlustig.de>,
+ Sven Neumann <neo@directfb.org>,
+ Ville Syrjälä <syrjala@sci.fi> and
+ Claudio Ciccani <klan@users.sf.net>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <config.h>
+
+#include <directfb.h>
+
+#include <direct/messages.h>
+#include <direct/util.h>
+
+#include <core/coredefs.h>
+#include <core/coretypes.h>
+
+#include <core/state.h>
+#include <core/gfxcard.h>
+#include <core/surface.h>
+
+#include <gfx/convert.h>
+
+#include "regs.h"
+#include "mmio.h"
+#include "mach64.h"
+
+#include "mach64_state.h"
+
+
+void mach64_set_destination( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *destination = state->destination;
+ unsigned int pitch = state->dst.pitch / DFB_BYTES_PER_PIXEL( destination->config.format );
+
+ mdev->pix_width &= ~DST_PIX_WIDTH;
+ switch (destination->config.format) {
+ case DSPF_RGB332:
+ mdev->pix_width |= DST_PIX_WIDTH_8BPP;
+ break;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ mdev->pix_width |= DST_PIX_WIDTH_15BPP;
+ break;
+ case DSPF_RGB16:
+ mdev->pix_width |= DST_PIX_WIDTH_16BPP;
+ break;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ mdev->pix_width |= DST_PIX_WIDTH_32BPP;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, DST_OFF_PITCH, (state->dst.offset/8) | ((pitch/8) << 22) );
+}
+
+void mach64gt_set_destination( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *destination = state->destination;
+ unsigned int pitch = state->dst.pitch / DFB_BYTES_PER_PIXEL( destination->config.format );
+
+ mdev->pix_width &= ~DST_PIX_WIDTH;
+ switch (destination->config.format) {
+ case DSPF_RGB332:
+ mdev->pix_width |= DST_PIX_WIDTH_RGB332;
+ break;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ mdev->pix_width |= DST_PIX_WIDTH_ARGB1555;
+ break;
+ case DSPF_RGB444:
+ case DSPF_ARGB4444:
+ mdev->pix_width |= DST_PIX_WIDTH_ARGB4444;
+ break;
+ case DSPF_RGB16:
+ mdev->pix_width |= DST_PIX_WIDTH_RGB565;
+ break;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ mdev->pix_width |= DST_PIX_WIDTH_ARGB8888;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+
+ mdev->draw_blend &= ~DITHER_EN;
+ mdev->blit_blend &= ~DITHER_EN;
+ if (DFB_COLOR_BITS_PER_PIXEL( destination->config.format ) < 24) {
+ mdev->draw_blend |= DITHER_EN;
+ mdev->blit_blend |= DITHER_EN;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, DST_OFF_PITCH, (state->dst.offset/8) | ((pitch/8) << 22) );
+}
+
+void mach64_set_source( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *source = state->source;
+ unsigned int pitch = state->src.pitch / DFB_BYTES_PER_PIXEL( source->config.format );
+
+ if (MACH64_IS_VALID( m_source ))
+ return;
+
+ mdev->pix_width &= ~SRC_PIX_WIDTH;
+ switch (source->config.format) {
+ case DSPF_RGB332:
+ mdev->pix_width |= SRC_PIX_WIDTH_8BPP;
+ break;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ mdev->pix_width |= SRC_PIX_WIDTH_15BPP;
+ break;
+ case DSPF_RGB16:
+ mdev->pix_width |= SRC_PIX_WIDTH_16BPP;
+ break;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ mdev->pix_width |= SRC_PIX_WIDTH_32BPP;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, SRC_OFF_PITCH, (state->src.offset/8) | ((pitch/8) << 22) );
+
+ MACH64_VALIDATE( m_source );
+}
+
+void mach64gt_set_source( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *source = state->source;
+ unsigned int pitch = state->src.pitch / DFB_BYTES_PER_PIXEL( source->config.format );
+
+ if (MACH64_IS_VALID( m_source ))
+ return;
+
+ mdev->pix_width &= ~SRC_PIX_WIDTH;
+ switch (source->config.format) {
+ case DSPF_RGB332:
+ mdev->pix_width |= SRC_PIX_WIDTH_RGB332;
+ break;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ mdev->pix_width |= SRC_PIX_WIDTH_ARGB1555;
+ break;
+ case DSPF_RGB444:
+ case DSPF_ARGB4444:
+ mdev->pix_width |= SRC_PIX_WIDTH_ARGB4444;
+ break;
+ case DSPF_RGB16:
+ mdev->pix_width |= SRC_PIX_WIDTH_RGB565;
+ break;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ mdev->pix_width |= SRC_PIX_WIDTH_ARGB8888;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, SRC_OFF_PITCH, (state->src.offset/8) | ((pitch/8) << 22) );
+
+ MACH64_VALIDATE( m_source );
+}
+
+void mach64gt_set_source_scale( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ CoreSurface *source = state->source;
+ unsigned int offset = state->src.offset;
+ unsigned int pitch = state->src.pitch;
+ int height = source->config.size.h;
+
+ if (MACH64_IS_VALID( m_source_scale ))
+ return;
+
+ mdev->pix_width &= ~SCALE_PIX_WIDTH;
+ switch (source->config.format) {
+ case DSPF_RGB332:
+ mdev->pix_width |= SCALE_PIX_WIDTH_RGB332;
+ break;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ mdev->pix_width |= SCALE_PIX_WIDTH_ARGB1555;
+ break;
+ case DSPF_RGB444:
+ case DSPF_ARGB4444:
+ mdev->pix_width |= SCALE_PIX_WIDTH_ARGB4444;
+ break;
+ case DSPF_RGB16:
+ mdev->pix_width |= SCALE_PIX_WIDTH_RGB565;
+ break;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ mdev->pix_width |= SCALE_PIX_WIDTH_ARGB8888;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+
+ mdev->blit_blend &= ~SCALE_PIX_EXPAND;
+ if (DFB_COLOR_BITS_PER_PIXEL( source->config.format ) < 24)
+ mdev->blit_blend |= SCALE_PIX_EXPAND;
+
+ mdev->field = source->field;
+ if (mdev->blit_deinterlace) {
+ if (mdev->field) {
+ if (source->config.caps & DSCAPS_SEPARATED) {
+ offset += height/2 * pitch;
+ } else {
+ offset += pitch;
+ pitch *= 2;
+ }
+ }
+ height /= 2;
+ }
+
+ mdev->source = source;
+
+ mdev->scale_offset = offset;
+ mdev->scale_pitch = pitch;
+
+ mdev->tex_offset = offset;
+ mdev->tex_pitch = direct_log2( pitch / DFB_BYTES_PER_PIXEL( source->config.format ) );
+ mdev->tex_height = direct_log2( height );
+ mdev->tex_size = MAX( mdev->tex_pitch, mdev->tex_height );
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, TEX_SIZE_PITCH, (mdev->tex_pitch << 0) |
+ (mdev->tex_size << 4) |
+ (mdev->tex_height << 8) );
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, TEX_CNTL, TEX_CACHE_FLUSH );
+ }
+
+ MACH64_VALIDATE( m_source_scale );
+}
+
+void mach64_set_clip( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ mach64_waitfifo( mdrv, mdev, 2 );
+ mach64_out32( mmio, SC_LEFT_RIGHT, (S13( state->clip.x2 ) << 16) | S13( state->clip.x1 ) );
+ mach64_out32( mmio, SC_TOP_BOTTOM, (S14( state->clip.y2 ) << 16) | S14( state->clip.y1 ) );
+}
+
+void mach64_set_color( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ DFBColor color = state->color;
+ u32 clr;
+
+ if (MACH64_IS_VALID( m_color ))
+ return;
+
+ if (state->drawingflags & DSDRAW_SRC_PREMULTIPLY) {
+ color.r = (color.r * (color.a + 1)) >> 8;
+ color.g = (color.g * (color.a + 1)) >> 8;
+ color.b = (color.b * (color.a + 1)) >> 8;
+ }
+
+ switch (state->destination->config.format) {
+ case DSPF_RGB332:
+ clr = PIXEL_RGB332( color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_RGB555:
+ clr = PIXEL_RGB555( color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_ARGB1555:
+ clr = PIXEL_ARGB1555( color.a,
+ color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_RGB444:
+ clr = PIXEL_RGB444( color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_ARGB4444:
+ clr = PIXEL_ARGB4444( color.a,
+ color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_RGB16:
+ clr = PIXEL_RGB16( color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_RGB32:
+ clr = PIXEL_RGB32( color.r,
+ color.g,
+ color.b );
+ break;
+ case DSPF_ARGB:
+ clr = PIXEL_ARGB( color.a,
+ color.r,
+ color.g,
+ color.b );
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, DP_FRGD_CLR, clr );
+
+ MACH64_VALIDATE( m_color );
+}
+
+void mach64_set_color_3d( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ DFBColor color = state->color;
+
+ if (MACH64_IS_VALID( m_color_3d ))
+ return;
+
+ if (state->drawingflags & DSDRAW_SRC_PREMULTIPLY) {
+ color.r = (color.r * (color.a + 1)) >> 8;
+ color.g = (color.g * (color.a + 1)) >> 8;
+ color.b = (color.b * (color.a + 1)) >> 8;
+ }
+
+ /* Some 3D color registers scaler registers are shared. */
+ mach64_waitfifo( mdrv, mdev, 7 );
+ mach64_out32( mmio, RED_X_INC, 0 );
+ mach64_out32( mmio, RED_START, color.r << 16 );
+ mach64_out32( mmio, GREEN_X_INC, 0 );
+ mach64_out32( mmio, GREEN_START, color.g << 16 );
+ mach64_out32( mmio, BLUE_X_INC, 0 );
+ mach64_out32( mmio, BLUE_START, color.b << 16 );
+ mach64_out32( mmio, ALPHA_START, color.a << 16 );
+
+ MACH64_INVALIDATE( m_color_tex | m_blit_blend );
+ MACH64_VALIDATE( m_color_3d );
+}
+
+void mach64_set_color_tex( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ DFBColor color = state->color;
+
+ if (MACH64_IS_VALID( m_color_tex ))
+ return;
+
+ if (state->blittingflags & DSBLIT_SRC_PREMULTCOLOR) {
+ if (state->blittingflags & DSBLIT_COLORIZE) {
+ color.r = (color.r * (color.a + 1)) >> 8;
+ color.g = (color.g * (color.a + 1)) >> 8;
+ color.b = (color.b * (color.a + 1)) >> 8;
+ } else {
+ color.r = color.g = color.b = color.a;
+ }
+ }
+
+ /* Some 3D color registers scaler registers are shared. */
+ mach64_waitfifo( mdrv, mdev, 7 );
+ mach64_out32( mmio, RED_X_INC, 0 );
+ mach64_out32( mmio, RED_START, color.r << 16 );
+ mach64_out32( mmio, GREEN_X_INC, 0 );
+ mach64_out32( mmio, GREEN_START, color.g << 16 );
+ mach64_out32( mmio, BLUE_X_INC, 0 );
+ mach64_out32( mmio, BLUE_START, color.b << 16 );
+ mach64_out32( mmio, ALPHA_START, color.a << 16 );
+
+ MACH64_INVALIDATE( m_color_3d | m_blit_blend );
+ MACH64_VALIDATE( m_color_tex );
+}
+
+void mach64_set_src_colorkey( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (MACH64_IS_VALID( m_srckey ))
+ return;
+
+ mach64_waitfifo( mdrv, mdev, 3 );
+ mach64_out32( mmio, CLR_CMP_MSK,
+ (1 << DFB_COLOR_BITS_PER_PIXEL( state->source->config.format )) - 1 );
+ mach64_out32( mmio, CLR_CMP_CLR, state->src_colorkey );
+ mach64_out32( mmio, CLR_CMP_CNTL, CLR_CMP_FN_EQUAL | CLR_CMP_SRC_2D );
+
+ MACH64_VALIDATE( m_srckey );
+ MACH64_INVALIDATE( m_srckey_scale | m_dstkey | m_disable_key );
+}
+
+void mach64_set_src_colorkey_scale( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+ u32 clr, msk;
+
+ if (MACH64_IS_VALID( m_srckey_scale ))
+ return;
+
+ if (mdev->chip < CHIP_3D_RAGE_PRO) {
+ switch (state->source->config.format) {
+ case DSPF_RGB332:
+ clr = ((state->src_colorkey & 0xE0) << 16) |
+ ((state->src_colorkey & 0x1C) << 11) |
+ ((state->src_colorkey & 0x03) << 6);
+ msk = 0xE0E0C0;
+ break;
+ case DSPF_RGB444:
+ case DSPF_ARGB4444:
+ clr = ((state->src_colorkey & 0x0F00) << 12) |
+ ((state->src_colorkey & 0x00F0) << 8) |
+ ((state->src_colorkey & 0x000F) << 4);
+ msk = 0xF0F0F0;
+ break;
+ case DSPF_RGB555:
+ case DSPF_ARGB1555:
+ clr = ((state->src_colorkey & 0x7C00) << 9) |
+ ((state->src_colorkey & 0x03E0) << 6) |
+ ((state->src_colorkey & 0x001F) << 3);
+ msk = 0xF8F8F8;
+ break;
+ case DSPF_RGB16:
+ clr = ((state->src_colorkey & 0xF800) << 8) |
+ ((state->src_colorkey & 0x07E0) << 5) |
+ ((state->src_colorkey & 0x001F) << 3);
+ msk = 0xF8FCF8;
+ break;
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ clr = state->src_colorkey;
+ msk = 0xFFFFFF;
+ break;
+ default:
+ D_BUG( "unexpected pixelformat!" );
+ return;
+ }
+ } else {
+ clr = state->src_colorkey;
+ msk = (1 << DFB_COLOR_BITS_PER_PIXEL( state->source->config.format )) - 1;
+ }
+
+ mach64_waitfifo( mdrv, mdev, 3 );
+ mach64_out32( mmio, CLR_CMP_MSK, msk );
+ mach64_out32( mmio, CLR_CMP_CLR, clr );
+ mach64_out32( mmio, CLR_CMP_CNTL, CLR_CMP_FN_EQUAL | CLR_CMP_SRC_SCALE );
+
+ MACH64_VALIDATE( m_srckey_scale );
+ MACH64_INVALIDATE( m_srckey | m_dstkey | m_disable_key );
+}
+
+void mach64_set_dst_colorkey( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (MACH64_IS_VALID( m_dstkey ))
+ return;
+
+ mach64_waitfifo( mdrv, mdev, 3 );
+ mach64_out32( mmio, CLR_CMP_MSK,
+ (1 << DFB_COLOR_BITS_PER_PIXEL( state->destination->config.format )) - 1 );
+ mach64_out32( mmio, CLR_CMP_CLR, state->dst_colorkey );
+ mach64_out32( mmio, CLR_CMP_CNTL, CLR_CMP_FN_NOT_EQUAL | CLR_CMP_SRC_DEST );
+
+ MACH64_VALIDATE( m_dstkey );
+ MACH64_INVALIDATE( m_srckey | m_srckey_scale | m_disable_key );
+}
+
+void mach64_disable_colorkey( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (MACH64_IS_VALID( m_disable_key ))
+ return;
+
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, CLR_CMP_CNTL, CLR_CMP_FN_FALSE );
+
+ MACH64_VALIDATE( m_disable_key );
+ MACH64_INVALIDATE( m_srckey | m_srckey_scale | m_dstkey );
+}
+
+static u32 mach64SourceBlend[] = {
+ ALPHA_BLND_SRC_ZERO,
+ ALPHA_BLND_SRC_ONE,
+ 0,
+ 0,
+ ALPHA_BLND_SRC_SRCALPHA,
+ ALPHA_BLND_SRC_INVSRCALPHA,
+ ALPHA_BLND_SRC_DSTALPHA,
+ ALPHA_BLND_SRC_INVDSTALPHA,
+ ALPHA_BLND_SRC_DSTCOLOR,
+ ALPHA_BLND_SRC_INVDSTCOLOR,
+ ALPHA_BLND_SAT
+};
+
+static u32 mach64DestBlend[] = {
+ ALPHA_BLND_DST_ZERO,
+ ALPHA_BLND_DST_ONE,
+ ALPHA_BLND_DST_SRCCOLOR,
+ ALPHA_BLND_DST_INVSRCCOLOR,
+ ALPHA_BLND_DST_SRCALPHA,
+ ALPHA_BLND_DST_INVSRCALPHA,
+ ALPHA_BLND_DST_DSTALPHA,
+ ALPHA_BLND_DST_INVDSTALPHA,
+ 0,
+ 0,
+ 0
+};
+
+void mach64_set_draw_blend( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (MACH64_IS_VALID( m_draw_blend ))
+ return;
+
+ mdev->draw_blend &= DITHER_EN;
+ mdev->draw_blend |= ALPHA_FOG_EN_ALPHA |
+ mach64SourceBlend[state->src_blend - 1] |
+ mach64DestBlend [state->dst_blend - 1];
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ /* FIXME: This is wrong. */
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, ALPHA_TST_CNTL, ALPHA_DST_SEL_DSTALPHA );
+ }
+
+ MACH64_VALIDATE( m_draw_blend );
+}
+
+void mach64_set_blit_blend( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state )
+{
+ volatile u8 *mmio = mdrv->mmio_base;
+
+ if (MACH64_IS_VALID( m_blit_blend ))
+ return;
+
+ mdev->blit_blend &= SCALE_PIX_EXPAND | DITHER_EN;
+
+ if (state->blittingflags & (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA)) {
+ /* Disable dithering because it is applied even when
+ * the source pixels are completely transparent.
+ */
+ if (DFB_PIXELFORMAT_HAS_ALPHA( state->source->config.format ))
+ mdev->blit_blend &= ~DITHER_EN;
+
+ mdev->blit_blend |= ALPHA_FOG_EN_ALPHA |
+ mach64SourceBlend[state->src_blend - 1] |
+ mach64DestBlend [state->dst_blend - 1];
+
+ if (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL) {
+ if (DFB_PIXELFORMAT_HAS_ALPHA( state->source->config.format )) {
+ mdev->blit_blend |= TEX_MAP_AEN;
+ } else {
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, ALPHA_START, 0xFF << 16 );
+ MACH64_INVALIDATE( m_color_3d | m_color_tex );
+ }
+ }
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ /* FIXME: This is wrong. */
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, ALPHA_TST_CNTL, ALPHA_DST_SEL_DSTALPHA );
+ }
+ } else {
+ /* This needs to be set even without alpha blending.
+ * Otherwise alpha channel won't get copied.
+ */
+ if (DFB_PIXELFORMAT_HAS_ALPHA( state->source->config.format ))
+ mdev->blit_blend |= TEX_MAP_AEN;
+
+ if (mdev->chip >= CHIP_3D_RAGE_PRO) {
+ /* FIXME: This is wrong. */
+ mach64_waitfifo( mdrv, mdev, 1 );
+ mach64_out32( mmio, ALPHA_TST_CNTL, ALPHA_DST_SEL_SRCALPHA );
+ }
+ }
+
+ if (state->blittingflags & (DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR))
+ mdev->blit_blend |= TEX_LIGHT_FCN_MODULATE;
+
+ MACH64_VALIDATE( m_blit_blend );
+}
diff --git a/Source/DirectFB/gfxdrivers/mach64/mach64_state.h b/Source/DirectFB/gfxdrivers/mach64/mach64_state.h
new file mode 100755
index 0000000..8957d8a
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/mach64_state.h
@@ -0,0 +1,90 @@
+/*
+ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org)
+ (c) Copyright 2000-2004 Convergence (integrated media) GmbH
+
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <dok@directfb.org>,
+ Andreas Hundt <andi@fischlustig.de>,
+ Sven Neumann <neo@directfb.org>,
+ Ville Syrjälä <syrjala@sci.fi> and
+ Claudio Ciccani <klan@users.sf.net>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef ___MACH64_STATE_H__
+#define ___MACH64_STATE_H__
+
+#include "mach64.h"
+
+void mach64_set_destination( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+void mach64gt_set_destination( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_source( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+void mach64gt_set_source( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+void mach64gt_set_source_scale( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_clip( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_color( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_color_3d( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_color_tex( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_src_colorkey( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_src_colorkey_scale( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_dst_colorkey( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_disable_colorkey( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev );
+
+void mach64_set_draw_blend( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+void mach64_set_blit_blend( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ CardState *state );
+
+#endif
diff --git a/Source/DirectFB/gfxdrivers/mach64/mmio.h b/Source/DirectFB/gfxdrivers/mach64/mmio.h
new file mode 100755
index 0000000..c8aed85
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/mmio.h
@@ -0,0 +1,198 @@
+/*
+ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org)
+ (c) Copyright 2000-2004 Convergence (integrated media) GmbH
+
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <dok@directfb.org>,
+ Andreas Hundt <andi@fischlustig.de>,
+ Sven Neumann <neo@directfb.org>,
+ Ville Syrjälä <syrjala@sci.fi> and
+ Claudio Ciccani <klan@users.sf.net>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+
+#ifndef ___MACH64_MMIO_H__
+#define ___MACH64_MMIO_H__
+
+#include <dfb_types.h>
+
+#include "mach64.h"
+
+static inline void
+mach64_out8( volatile u8 *mmioaddr, u32 reg, u8 value )
+{
+ *((volatile u8*)(mmioaddr+reg)) = value;
+}
+
+static inline u8
+mach64_in8( volatile u8 *mmioaddr, u32 reg )
+{
+ return *((volatile u8*)(mmioaddr+reg));
+}
+
+static inline void
+mach64_out32( volatile u8 *mmioaddr, u32 reg, u32 value )
+{
+#ifdef __powerpc__
+ if (reg >= 0x400)
+ asm volatile("stwbrx %0,%1,%2;eieio" : : "r"(value), "b"(reg-0x800),
+ "r"(mmioaddr) : "memory");
+ else
+ asm volatile("stwbrx %0,%1,%2;eieio" : : "r"(value), "b"(reg),
+ "r"(mmioaddr) : "memory");
+#else
+ if (reg >= 0x400)
+ *((volatile u32*)(mmioaddr+reg-0x800)) = value;
+ else
+ *((volatile u32*)(mmioaddr+reg)) = value;
+#endif
+}
+
+static inline u32
+mach64_in32( volatile u8 *mmioaddr, u32 reg )
+{
+#ifdef __powerpc__
+ u32 value;
+
+ if (reg >= 0x400)
+ asm volatile("lwbrx %0,%1,%2;eieio" : "=r"(value) : "b"(reg-0x800), "r"(mmioaddr));
+ else
+ asm volatile("lwbrx %0,%1,%2;eieio" : "=r"(value) : "b"(reg), "r"(mmioaddr));
+
+ return value;
+#else
+ if (reg >= 0x400)
+ return *((volatile u32*)(mmioaddr+reg-0x800));
+ else
+ return *((volatile u32*)(mmioaddr+reg));
+#endif
+}
+
+static const u32 lt_lcd_regs[] = {
+ CONFIG_PANEL_LT,
+ LCD_GEN_CTRL_LT,
+ DSTN_CONTROL_LT,
+ HFB_PITCH_ADDR_LT,
+ HORZ_STRETCHING_LT,
+ VERT_STRETCHING_LT,
+ 0, /* EXT_VERT_STRETCH */
+ LT_GIO_LT,
+ POWER_MANAGEMENT_LT
+};
+
+#if 0
+static inline void
+mach64_in_lcd( Mach64DeviceData *mdev,
+ volatile u8 *mmioaddr, u8 reg, u32 value )
+{
+ if (mdev->chip == CHIP_3D_RAGE_LT) {
+ mach64_out32( mmioaddr, lt_lcd_regs[reg], value );
+ } else if (mdev->chip >= CHIP_3D_RAGE_LT_PRO) {
+ mach64_out8( mmioaddr, LCD_INDEX, reg );
+ mach64_out32( mmioaddr, LCD_DATA, value );
+ }
+}
+#endif
+
+static inline u32
+mach64_in_lcd( Mach64DeviceData *mdev,
+ volatile u8 *mmioaddr, u8 reg )
+{
+ if (mdev->chip == CHIP_3D_RAGE_LT) {
+ return mach64_in32( mmioaddr, lt_lcd_regs[reg] );
+ } else if (mdev->chip >= CHIP_3D_RAGE_LT_PRO) {
+ mach64_out8( mmioaddr, LCD_INDEX, reg );
+ return mach64_in32( mmioaddr, LCD_DATA );
+ } else {
+ return 0;
+ }
+}
+
+#if 0
+static inline void
+mach64_out_pll( volatile u8 *mmioaddr, u8 reg, u8 value )
+{
+ mach64_out8( mmioaddr, CLOCK_CNTL1, (reg << 2) | PLL_WR_EN );
+ mach64_out8( mmioaddr, CLOCK_CNTL2, value );
+}
+#endif
+
+static inline u8
+mach64_in_pll( volatile u8 *mmioaddr, u8 reg )
+{
+ mach64_out8( mmioaddr, CLOCK_CNTL1, reg << 2 );
+ return mach64_in8( mmioaddr, CLOCK_CNTL2 );
+}
+
+static inline void mach64_waitidle( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev )
+{
+ int timeout = 1000000;
+
+ while (timeout--) {
+ if ((mach64_in32( mdrv->mmio_base, FIFO_STAT ) & 0x0000FFFF) == 0)
+ break;
+
+ mdev->idle_waitcycles++;
+ }
+
+ timeout = 1000000;
+
+ while (timeout--) {
+ if ((mach64_in32( mdrv->mmio_base, GUI_STAT ) & GUI_ACTIVE) == 0)
+ break;
+
+ mdev->idle_waitcycles++;
+ }
+
+ mdev->fifo_space = 16;
+}
+
+static inline void mach64_waitfifo( Mach64DriverData *mdrv,
+ Mach64DeviceData *mdev,
+ unsigned int requested_fifo_space )
+{
+ u32 fifo_stat;
+ int timeout = 1000000;
+
+ mdev->waitfifo_sum += requested_fifo_space;
+ mdev->waitfifo_calls++;
+
+ if (mdev->fifo_space < requested_fifo_space) {
+ while (timeout--) {
+ mdev->fifo_waitcycles++;
+
+ fifo_stat = mach64_in32( mdrv->mmio_base, FIFO_STAT ) & 0x0000FFFF;
+ mdev->fifo_space = 16;
+ while (fifo_stat) {
+ mdev->fifo_space--;
+ fifo_stat >>= 1;
+ }
+
+ if (mdev->fifo_space >= requested_fifo_space)
+ break;
+ }
+ }
+ else {
+ mdev->fifo_cache_hits++;
+ }
+ mdev->fifo_space -= requested_fifo_space;
+}
+
+#endif
diff --git a/Source/DirectFB/gfxdrivers/mach64/regs.h b/Source/DirectFB/gfxdrivers/mach64/regs.h
new file mode 100755
index 0000000..d764fea
--- /dev/null
+++ b/Source/DirectFB/gfxdrivers/mach64/regs.h
@@ -0,0 +1,883 @@
+#ifndef __MACH64_REGS_H__
+#define __MACH64_REGS_H__
+
+/* LCD Panel registers */
+#define CONFIG_PANEL 0x00
+#define LCD_GEN_CTRL 0x01
+#define DSTN_CONTROL 0x02
+#define HFB_PITCH_ADDR 0x03
+#define HORZ_STRETCHING 0x04
+#define VERT_STRETCHING 0x05
+#define EXT_VERT_STRETCH 0x06
+#define LT_GIO 0x07
+#define POWER_MANAGEMENT 0x08
+#define ZVGPIO 0x09
+#define ICON_CLR0 0x0A
+#define ICON_CLR1 0x0B
+#define ICON_OFFSET 0x0C
+#define ICON_HORZ_VERT_POSN 0x0D
+#define ICON_HORZ_VERT_OFF 0x0E
+#define ICON2_CLR0 0x0F
+#define ICON2_CLR1 0x10
+#define ICON2_OFFSET 0x11
+#define ICON2_HORZ_VERT_POSN 0x12
+#define ICON2_HORZ_VERT_OFF 0x13
+#define LCD_MISC_CNTL 0x14
+#define TMDS_CNTL 0x15
+#define SCRATCH_PAD_4 0x15
+#define TMDS_SYNC_CHAR_SETA 0x16
+#define SCRATCH_PAD_5 0x16
+#define TMDS_SYNC_CHAR_SETB 0x17
+#define SCRATCH_PAD_6 0x17
+#define TMDS_CRC 0x18
+#define SCRATCH_PAD_7 0x18
+#define PLTSTBLK_GEN_SEED 0x19
+#define SCRATCH_PAD_8 0x19
+#define SYNC_GEN_CNTL 0x1A
+#define PATTERN_GEN_SEED 0x1B
+#define APC_CNTL 0x1C
+#define POWER_MANAGEMENT_2 0x1D
+#define PRI_ERR_PATTERN 0x1E
+#define CUR_ERR_PATTERN 0x1F
+#define PLTSTBLK_RPT 0x20
+#define SYNC_RPT 0x21
+#define CRC_PATTERN_RPT 0x22
+#define PL_TRANSMITTER_CNTL 0x23
+#define PL_PLL_CNTL 0x24
+#define ALPHA_BLENDING 0x25
+#define PORTRAIT_GEN_CNTL 0x26
+#define APC_CTRL_IO 0x27
+#define TEST_IO 0x28
+#define TEST_OUTPUTS 0x29
+#define DP1_MEM_ACCESS 0x2A
+#define DP0_MEM_ACCESS 0x2B
+#define DP0_DEBUG_A 0x2C
+#define DP0_DEBUG_B 0x2D
+#define DP1_DEBUG_A 0x2E
+#define DP1_DEBUG_B 0x2F
+#define DPCTRL_DEBUG_A 0x30
+#define DPCTRL_DEBUG_B 0x31
+#define MEMBLK_DEBUG 0x32
+/* #define SCRATCH_PAD_4 0x33 */
+#define APC_LUT_AB 0x33
+/* #define SCRATCH_PAD_5 0x34 */
+#define APC_LUT_CD 0x34
+/* #define SCRATCH_PAD_6 0x35 */
+#define APC_LUT_EF 0x25
+/* #define SCRATCH_PAD_7 0x36 */
+#define APC_LUT_GH 0x36
+/* #define SCRATCH_PAD_8 0x37 */
+#define APC_LUT_IJ 0x37
+#define APC_LUT_KL 0x38
+#define APC_LUT_MN 0x39
+#define APC_LUT_OP 0x3A
+
+/* LCD_GEN_CTRL */
+#define LCD_ON 0x00000002
+
+/* VERT_STRETCHING */
+#define VERT_STRETCH_RATIO0 0x000003FF
+#define VERT_STRETCH_EN 0x80000000
+
+
+/* PLL registers */
+#define MPLL_CNTL 0x00
+#define VPLL_CNTL 0x01
+#define PLL_REF_DIV 0x02
+#define PLL_GEN_CNTL 0x03
+#define MCLK_FB_DIV 0x04
+#define PLL_VCLK_CNTL 0x05
+#define VCLK_POST_DIV 0x06
+#define VCLK0_FB_DIV 0x07
+#define VCLK1_FB_DIV 0x08
+#define VCLK2_FB_DIV 0x09
+#define VCLK3_FB_DIV 0x0A
+#define PLL_EXT_CNTL 0x0B
+#define DLL_CNTL 0x0C
+#define DLL1_CNTL 0x0C
+#define VFC_CNTL 0x0D
+#define PLL_TEST_CNTL 0x0E
+#define PLL_TEST_COUNT 0x0F
+#define LVDSPLL_CNTL0 0x10
+#define LVDS_CNTL0 0x10
+#define LVDSPLL_CNTL1 0x11
+#define LVDS_CNTL1 0x11
+#define AGP1_CNTL 0x12
+#define AGP2_CNTL 0x13
+#define DLL2_CNTL 0x14
+#define SCLK_FB_DIV 0x15
+#define SPLL_CNTL1 0x16
+#define SPLL_CNTL2 0x17
+#define APLL_STRAPS 0x18
+#define EXT_VPLL_CNTL 0x19
+#define EXT_VPLL_REF_DIV 0x1A
+#define EXT_VPLL_FB_DIV 0x1B
+#define EXT_VPLL_MSB 0x1C
+#define HTOTAL_CNTL 0x1D
+#define BYTE_CLK_CNTL 0x1E
+#define TV_PLL_CNTL1 0x1F
+#define TV_PLL_CNTL2 0x20
+#define TV_PLL_CNTL 0x21
+#define EXT_TV_PLL 0x22
+#define V2PLL_CNTL 0x23
+#define PLL_V2CLK_CNTL 0x24
+#define EXT_V2PLL_REF_DIV 0x25
+#define EXT_V2PLL_FB_DIV 0x26
+#define EXT_V2PLL_MSB 0x27
+#define HTOTAL2_CNTL 0x28
+#define PLL_YCLK_CNTL 0x29
+#define PM_DYN_CLK_CNTL 0x2A
+
+/* PLL_VCLK_CNTL */
+#define ECP_DIV 0x30
+
+
+/* TV Out registers */
+/* 0x00 - 0x0F */
+#define TV_MASTER_CNTL 0x10
+/* 0x11 */
+#define TV_RGB_CNTL 0x12
+/* 0x13 */
+#define TV_SYNC_CNTL 0x14
+/* 0x15 - 1F */
+#define TV_HTOTAL 0x20
+#define TV_HDISP 0x21
+#define TV_HSIZE 0x22
+#define TV_HSTART 0x23
+#define TV_HCOUNT 0x24
+#define TV_VTOTAL 0x25
+#define TV_VDISP 0x26
+#define TV_VCOUNT 0x27
+#define TV_FTOTAL 0x28
+#define TV_FCOUNT 0x29
+#define TV_FRESTART 0x2A
+#define TV_HRESTART 0x2B
+#define TV_VRESTART 0x2C
+/* 0x2D - 0x5F */
+#define TV_HOST_READ_DATA 0x60
+#define TV_HOST_WRITE_DATA 0x61
+#define TV_HOST_RD_WT_CNTL 0x62
+/* 0x63 - 0x6F */
+#define TV_VSCALER_CNTL 0x70
+#define TV_TIMING_CNTL 0x71
+#define TV_GAMMA_CNTL 0x72
+#define TV_Y_FALL_CNTL 0x73
+#define TV_Y_RISE_CNTL 0x74
+#define TV_Y_SAW_TOOTH_CNTL 0x75
+/* 0x76 - 0x7F */
+#define TV_MODULATOR_CNTL1 0x80
+#define TV_MODULATOR_CNTL2 0x81
+/* 0x82 - 0x8F */
+#define TV_PRE_DAC_MUX_CNTL 0x90
+/* 0x91 - 0x9F */
+#define TV_DAC_CNTL 0xA0
+/* 0xA1 - 0xAF */
+#define TV_CRC_CNTL 0xB0
+#define TV_VIDEO_PORT_SIG 0xB1
+/* 0xB2 - 0xB7 */
+#define TV_VBI_CC_CNTL 0xB8
+#define TV_VBI_EDS_CNTL 0xB9
+#define TV_VBI_20BIT_CNTL 0xBA
+/* 0xBB - 0xBC */
+#define TV_VBI_DTO_CNTL 0xBD
+#define TV_VBI_LEVEL_CNTL 0xBE
+/* 0xBF */
+#define TV_UV_ADR 0xC0
+#define TV_FIFO_TEST_CNTL 0xC1
+/* 0xC2 - 0xFF */
+
+
+/* Main registers */
+#define CRTC_H_TOTAL_DISP 0x000
+#define CRTC2_H_TOTAL_DISP 0x000
+#define CRTC_H_SYNC_STRT_WID 0x004
+#define CRTC2_H_SYNC_STRT_WID 0x004
+#define CRTC_V_TOTAL_DISP 0x008
+#define CRTC2_V_TOTAL_DISP 0x008
+#define CRTC_V_SYNC_STRT_WID 0x00C
+#define CRTC2_V_SYNC_STRT_WID 0x00C
+#define CRTC_VLINE_CRNT_VLINE 0x010
+#define CRTC2_VLINE_CRNT_VLINE 0x010
+#define CRTC_OFF_PITCH 0x014
+#define CRTC_INT_CNTL 0x018
+#define CRTC_GEN_CNTL 0x01C
+#define TV_OUT_INDEX 0x01D
+#define DSP_CONFIG 0x020
+#define PM_DSP_CONFIG 0x020
+#define DSP_ON_OFF 0x024
+#define PM_DSP_ON_OFF 0x024
+#define TV_OUT_DATA 0x01D
+#define TIMER_CONFIG 0x028
+#define MEM_BUF_CNTL 0x02C
+#define SHARED_CNTL 0x030
+#define SHARED_MEM_CONFIG 0x034
+#define MEM_ADDR_CONFIG 0x034
+#define CRT_TRAP 0x038
+#define I2C_CNTL_0 0x03C
+#define DSTN_CONTROL_LT 0x03C
+#define OVR_CLR 0x040
+#define OVR2_CLR 0x040
+#define OVR_WID_LEFT_RIGHT 0x044
+#define OVR2_WID_LEFT_RIGHT 0x044
+#define OVR_WID_TOP_BOTTOM 0x048
+#define OVR2_WID_TOP_BOTTOM 0x048
+#define VGA_DSP_CONFIG 0x04C
+#define PM_VGA_DSP_CONFIG 0x04C
+#define VGA_DSP_ON_OFF 0x050
+#define PM_VGA_DSP_ON_OFF 0x050
+#define DSP2_CONFIG 0x054
+#define PM_DSP2_CONFIG 0x054
+#define DSP2_ON_OFF 0x058
+#define PM_DSP2_ON_OFF 0x058
+#define CRTC2_OFF_PITCH 0x05C
+#define CUR_CLR0 0x060
+#define CUR2_CLR0 0x060
+#define CUR_CLR1 0x064
+#define CUR2_CLR1 0x064
+#define CUR_OFFSET 0x068
+#define CUR2_OFFSET 0x068
+#define CUR_HORZ_VERT_POSN 0x06C
+#define CUR2_HORZ_VERT_POSN 0x06C
+#define CUR_HORZ_VERT_OFF 0x070
+#define CUR2_HORZ_VERT_OFF 0x070
+#define CONFIG_PANEL_LT 0x074
+#define GP_IO 0x078
+#define HW_DEBUG 0x07C
+#define SCRATCH_REG0 0x080
+#define SCRATCH_REG1 0x084
+#define SCRATCH_REG2 0x088
+#define SCRATCH_REG3 0x08C
+#define CLOCK_CNTL 0x090
+#define CLOCK_CNTL0 0x090
+#define CLOCK_CNTL1 0x091
+#define CLOCK_CNTL2 0x092
+#define CLOCK_CNTL3 0x093
+#define CONFIG_STAT1 0x094
+#define CONFIG_STAT2 0x098
+/* 0x09C */
+#define BUS_CNTL 0x0A0
+#define LCD_INDEX 0x0A4
+#define LCD_DATA 0x0A8
+#define HFB_PITCH_ADDR_LT 0x0A8
+#define EXT_MEM_CNTL 0x0AC
+#define MEM_CNTL 0x0B0
+#define MEM_VGA_WP_SEL 0x0B4
+#define MEM_VGA_RP_SEL 0x0B8
+#define I2C_CNTL_1 0x0BC
+#define LT_GIO_LT 0x0BC
+#define DAC_REGS 0x0C0
+#define DAC_CNTL 0x0C4
+#define EXT_DAC_REGS 0x0C8
+#define HORZ_STRETCHING_LT 0x0C8
+#define VERT_STRETCHING_LT 0x0CC
+#define GEN_TEST_CNTL 0x0D0
+#define CUSTOM_MACRO_CNTL 0x0D4
+#define LCD_GEN_CTRL_LT 0x0D4
+#define POWER_MANAGEMENT_LT 0x0D8
+#define CONFIG_CNTL 0x0DC
+#define CONFIG_CHIP_ID 0x0E0
+#define CONFIG_STAT0 0x0E4
+#define CRC_SIG 0x0E8
+#define CRC2_SIG 0x0E8
+/* 0x0EC - 0x0FC */
+#define DST_OFF_PITCH 0x100
+#define DST_X 0x104
+#define DST_Y 0x108
+#define DST_Y_X 0x10C
+#define DST_WIDTH 0x110
+#define DST_HEIGHT 0x114
+#define DST_HEIGHT_WIDTH 0x118
+#define DST_X_WIDTH 0x11C
+#define DST_BRES_LNTH 0x120
+/* #define LEAD_BRES_LNTH 0x120 */
+#define DST_BRES_ERR 0x124
+#define LEAD_BRES_ERR 0x124
+#define DST_BRES_INC 0x128
+#define LEAD_BRES_INC 0x128
+#define DST_BRES_DEC 0x12C
+#define LEAD_BRES_DEC 0x12C
+#define DST_CNTL 0x130
+/* #define DST_Y_X 0x134 */
+#define TRAIL_BRES_ERR 0x138
+#define TRAIL_BRES_INC 0x13C
+#define TRAIL_BRES_DEC 0x140
+#define LEAD_BRES_LNTH 0x144
+#define Z_OFF_PITCH 0x148
+#define Z_CNTL 0x14C
+#define ALPHA_TST_CNTL 0x150
+/* 0x154 */
+#define SECONDARY_STW_EXP 0x158
+#define SECONDARY_S_X_INC 0x15C
+#define SECONDARY_S_Y_INC 0x160
+#define SECONDARY_S_START 0x164
+#define SECONDARY_W_X_INC 0x168
+#define SECONDARY_W_Y_INC 0x16C
+#define SECONDARY_W_START 0x170
+#define SECONDARY_T_X_INC 0x174
+#define SECONDARY_T_Y_INC 0x178
+#define SECONDARY_T_START 0x17C
+#define SRC_OFF_PITCH 0x180
+#define SRC_X 0x184
+#define SRC_Y 0x188
+#define SRC_Y_X 0x18C
+#define SRC_WIDTH1 0x190
+#define SRC_HEIGHT1 0x194
+#define SRC_HEIGHT1_WIDTH1 0x198
+#define SRC_X_START 0x19C
+#define SRC_Y_START 0x1A0
+#define SRC_Y_X_START 0x1A4
+#define SRC_WIDTH2 0x1A8
+#define SRC_HEIGHT2 0x1AC
+#define SRC_HEIGHT2_WIDTH2 0x1B0
+#define SRC_CNTL 0x1B4
+/* 0x1B8 - 0x1BC */
+#define SCALE_Y_OFF 0x1C0
+#define SCALE_OFF 0x1C0
+#define TEX_0_OFF 0x1C0
+#define SECONDARY_SCALE_OFF 0x1C4
+#define TEX_1_OFF 0x1C4
+#define TEX_2_OFF 0x1C8
+#define TEX_3_OFF 0x1CC
+#define TEX_4_OFF 0x1D0
+#define TEX_5_OFF 0x1D4
+#define TEX_6_OFF 0x1D8
+#define SCALE_WIDTH 0x1DC
+#define TEX_7_OFF 0x1DC
+#define SCALE_HEIGHT 0x1E0
+#define TEX_8_OFF 0x1E0
+#define TEX_9_OFF 0x1E4
+#define TEX_10_OFF 0x1E8
+#define SCALE_Y_PITCH 0x1EC
+#define SCALE_PITCH 0x1EC
+/* #define S_Y_INC 0x1EC */
+#define SCALE_X_INC 0x1F0
+/* #define RED_X_INC 0x1F0 */
+#define SCALE_Y_INC 0x1F4
+/* #define GREEN_X_INC 0x1F4 */
+#define SCALE_VACC 0x1F8
+#define SCALE_3D_CNTL 0x1FC
+#define HOST_DATA0 0x200
+#define HOST_DATA1 0x204
+#define HOST_DATA2 0x208
+#define HOST_DATA3 0x20C
+#define HOST_DATA4 0x210
+#define HOST_DATA5 0x214
+#define HOST_DATA6 0x218
+#define HOST_DATA7 0x21C
+#define HOST_DATA8 0x220
+#define HOST_DATA9 0x224
+#define HOST_DATAA 0x228
+#define HOST_DATAB 0x22C
+#define HOST_DATAC 0x230
+#define HOST_DATAD 0x234
+#define HOST_DATAE 0x238
+#define HOST_DATAF 0x23C
+#define HOST_CNTL 0x240
+#define BM_HOSTDATA 0x244
+#define BM_ADDR 0x248
+#define BM_DATA 0x248
+#define BM_GUI_TABLE_CMD 0x24C
+/* 0x250 - 0x27C */
+#define PAT_REG0 0x280
+#define PAT_REG1 0x284
+#define PAT_CNTL 0x288
+/* 0x28C - 0x29C */
+#define SC_LEFT 0x2A0
+#define SC_RIGHT 0x2A4
+#define SC_LEFT_RIGHT 0x2A8
+#define SC_TOP 0x2AC
+#define SC_BOTTOM 0x2B0
+#define SC_TOP_BOTTOM 0x2B4
+#define USR1_DST_OFF_PITCH 0x2B8
+#define USR2_DST_OFF_PITCH 0x2BC
+#define DP_BKGD_CLR 0x2C0
+#define DP_FRGD_CLR 0x2C4
+#define DP_FOG_CLR 0x2C4
+#define DP_WRITE_MSK 0x2C8
+#define DP_CHAIN_MSK 0x2CC
+#define DP_PIX_WIDTH 0x2D0
+#define DP_MIX 0x2D4
+#define DP_SRC 0x2D8
+#define DP_FRGD_CLR_MIX 0x2DC
+#define DP_FRGD_BKGD_CLR 0x2E0
+/* 0x2E4 */
+#define DST_X_Y 0x2E8
+#define DST_WIDTH_HEIGHT 0x2EC
+#define USR_DST_PITCH 0x2F0
+/* 0x2F4 */
+#define DP_SET_GUI_ENGINE2 0x2F8
+#define DP_SET_GUI_ENGINE 0x2FC
+#define CLR_CMP_CLR 0x300
+#define CLR_CMP_MSK 0x304
+#define CLR_CMP_CNTL 0x308
+/* 0x30C */
+#define FIFO_STAT 0x310
+/* 0x314 - 0x31C */
+#define CONTEXT_MSK 0x320
+/* 0x324 */
+/* 0x328 */
+#define CONTEXT_LOAD_CNTL 0x32C
+#define GUI_TRAJ_CNTL 0x330
+/* 0x334 */
+#define GUI_STAT 0x338
+/* 0x33C */
+#define S_X_INC2 0x340
+#define TEX_PALETTE_INDEX 0x340
+#define S_Y_INC2 0x344
+#define STW_EXP 0x344
+#define S_XY_INC2 0x348
+#define LOG_MAX_INC 0x348
+#define S_X_INC_START 0x34C
+#define S_X_INC 0x34C
+#define S_Y_INC 0x350
+/* #define SCALE_Y_PITCH 0x350 */
+/* #define SCALE_PITCH 0x350 */
+#define S_START 0x354
+#define T_X_INC2 0x358
+#define W_X_INC 0x358
+#define T_Y_INC2 0x35C
+#define W_Y_INC 0x35C
+#define T_XY_INC2 0x360
+#define W_START 0x360
+#define T_X_INC_START 0x364
+#define T_X_INC 0x364
+#define SECONDARY_SCALE_PITCH 0x368
+#define T_Y_INC 0x368
+#define T_START 0x36C
+#define TEX_SIZE_PITCH 0x370
+#define TEX_CNTL 0x374
+#define SECONDARY_TEX_OFFSET 0x378
+#define TEX_PAL_WR 0x37C
+#define TEX_PALETTE 0x37C
+#define SCALE_PITCH_BOTH 0x380
+#define SECONDARY_SCALE_OFF_ACC 0x384
+#define SCALE_OFF_ACC 0x388
+#define SCALE_DST_Y_X 0x38C
+/* 0x390 - 0x394 */
+#define COMPOSITE_SHADOW_ID 0x398
+#define SECONDARY_SCALE_X_INC 0x39C
+#define SPECULAR_RED_X_INC 0x39C
+#define SPECULAR_RED_Y_INC 0x3A0
+#define SECONDARY_SCALE_HACC 0x3A4
+#define SPECULAR_RED_START 0x3A4
+#define SPECULAR_GREEN_X_INC 0x3A8
+#define SPECULAR_GREEN_Y_INC 0x3AC
+#define SPECULAR_GREEN_START 0x3B0
+#define SPECULAR_BLUE_X_INC 0x3B4
+#define SPECULAR_BLUE_Y_INC 0x3B8
+#define SPECULAR_BLUE_START 0x3BC
+/* #define SCALE_X_INC 0x3C0 */
+#define RED_X_INC 0x3C0
+#define RED_Y_INC 0x3C4
+#define SCALE_HACC 0x3C8
+#define RED_START 0x3C8
+/* #define SCALE_Y_INC 0x3CC */
+#define GREEN_X_INC 0x3CC
+#define SECONDARY_SCALE_Y_INC 0x3D0
+#define GREEN_Y_INC 0x3D0
+#define SECONDARY_SCALE_VACC 0x3D4
+#define GREEN_START 0x3D4
+#define SCALE_XUV_INC 0x3D8
+#define BLUE_X_INC 0x3D8
+#define BLUE_Y_INC 0x3DC
+#define SCALE_UV_HACC 0x3E0
+#define BLUE_START 0x3E0
+#define Z_X_INC 0x3E4
+#define Z_Y_INC 0x3E8
+#define Z_START 0x3EC
+#define ALPHA_X_INC 0x3F0
+#define FOG_X_INC 0x3F0
+#define ALPHA_Y_INC 0x3F4
+#define FOG_Y_INC 0x3F4
+#define ALPHA_START 0x3F8
+#define FOG_START 0x3F8
+/* 0x3FC */
+#define OVERLAY_Y_X_START 0x400
+#define OVERLAY_Y_X_END 0x404
+#define OVERLAY_VIDEO_KEY_CLR 0x408
+#define OVERLAY_VIDEO_KEY_MSK 0x40C
+#define OVERLAY_GRAPHICS_KEY_CLR 0x410
+#define OVERLAY_GRAPHICS_KEY_MSK 0x414
+#define OVERLAY_KEY_CNTL 0x418
+/* 0x41C */
+#define OVERLAY_SCALE_INC 0x420
+#define OVERLAY_SCALE_CNTL 0x424
+#define SCALER_HEIGHT_WIDTH 0x428
+#define SCALER_TEST 0x42C
+/* 0x430 */
+#define SCALER_BUF0_OFFSET 0x434
+#define SCALER_BUF1_OFFSET 0x438
+#define SCALER_BUF_PITCH 0x43C
+#define CAPTURE_START_END 0x440
+#define CAPTURE_X_WIDTH 0x444
+#define VIDEO_FORMAT 0x448
+#define VBI_START_END 0x44C
+#define CAPTURE_CONFIG 0x450
+#define TRIG_CNTL 0x454
+#define OVERLAY_EXCLUSIVE_HORZ 0x458
+#define OVERLAY_EXCLUSIVE_VERT 0x45C
+#define VBI_WIDTH 0x460
+#define CAPTURE_DEBUG 0x464
+#define VIDEO_SYNC_TEST 0x468
+/* 0x46C */
+#define SNAPSHOT_VH_COUNTS 0x470
+#define SNAPSHOT_F_COUNT 0x474
+#define N_VIF_COUNT 0x478
+#define SNAPSHOT_VIF_COUNT 0x47C
+#define BUF0_OFFSET 0x480
+#define CAPTURE_BUF0_OFFSET 0x480
+#define CAPTURE_BUF1_OFFSET 0x484
+#define ONESHOT_BUF_OFFSET 0x488
+#define CAPTURE_BUF_PITCH 0x488
+#define BUF0_PITCH 0x48C
+/* 0x490 - 0x494 */
+#define BUF1_OFFSET 0x498
+/* 0x49C - 0x4A0 */
+#define BUF1_PITCH 0x4A4
+/* 0x4A8 */
+#define BUF0_CAP_OFFSET 0x4AC
+#define BUF1_CAP_OFFSET 0x4B0
+#define SNAPSHOT2_VH_COUNTS 0x4B0
+#define SNAPSHOT2_F_COUNT 0x4B4
+#define N_VIF2_COUNT 0x4B8
+#define SNAPSHOT2_VIF_COUNT 0x4BC
+#define MPP_CONFIG 0x4C0
+#define MPP_STROBE_SEQ 0x4C4
+#define MPP_ADDR 0x4C8
+#define MPP_DATA 0x4CC
+#define TVO_CNTL 0x500
+/* 0x504 - 0x540 */
+#define CRT_HORZ_VERT_LOAD 0x544
+#define AGP_BASE 0x548
+#define AGP_CNTL 0x54C
+#define SCALER_COLOUR_CNTL 0x550
+#define SCALER_H_COEFF0 0x554
+#define SCALER_H_COEFF1 0x558
+#define SCALER_H_COEFF2 0x55C
+#define SCALER_H_COEFF3 0x560
+#define SCALER_H_COEFF4 0x564
+/* 0x568 - 0x56C */
+#define GUI_CMDFIFO_DEBUG 0x570
+#define GUI_CMDFIFO_DATA 0x574
+#define GUI_CNTL 0x578
+/* 0x57C */
+#define BM_FRAME_BUF_OFFSET 0x580
+#define BM_SYSTEM_MEM_ADDR 0x584
+#define BM_COMMAND 0x588
+#define BM_STATUS 0x58C
+/* 0x590 - 0x5B4 */
+#define BM_GUI_TABLE 0x5B8
+#define BM_SYSTEM_TABLE 0x5BC
+/* 0x5D0 */
+#define SCALER_BUF0_OFFSET_U 0x5D4
+#define SCALER_BUF0_OFFSET_V 0x5D8
+#define SCALER_BUF1_OFFSET_U 0x5DC
+#define SCALER_BUF1_OFFSET_V 0x5E0
+/* 0x5E4 - 0x63C */
+#define VERTEX_1_S 0x640
+#define VERTEX_1_T 0x644
+#define VERTEX_1_W 0x648
+#define VERTEX_1_SPEC_ARGB 0x64C
+#define VERTEX_1_Z 0x650
+#define VERTEX_1_ARGB 0x654
+#define VERTEX_1_X_Y 0x658
+/* #define ONE_OVER_AREA 0x65C */
+#define VERTEX_2_S 0x660
+#define VERTEX_2_T 0x664
+#define VERTEX_2_W 0x668
+#define VERTEX_2_SPEC_ARGB 0x66C
+#define VERTEX_2_Z 0x670
+#define VERTEX_2_ARGB 0x674
+#define VERTEX_2_X_Y 0x678
+/* #define ONE_OVER_AREA 0x67C */
+#define VERTEX_3_S 0x680
+#define VERTEX_3_T 0x684
+#define VERTEX_3_W 0x688
+#define VERTEX_3_SPEC_ARGB 0x68C
+#define VERTEX_3_Z 0x690
+#define VERTEX_3_ARGB 0x694
+#define VERTEX_3_X_Y 0x698
+#define ONE_OVER_AREA 0x69C
+#define VERTEX_3_SECONDARY_S 0x6A0
+#define VERTEX_3_SECONDARY_T 0x6A4
+#define VERTEX_3_SECONDARY_W 0x6A8
+/* #define VERTEX_1_S 0x6AC */
+/* #define VERTEX_1_T 0x6B0 */
+/* #define VERTEX_1_W 0x6B4 */
+/* #define VERTEX_2_S 0x6B8 */
+/* #define VERTEX_2_T 0x6BC */
+/* #define VERTEX_2_W 0x6C0 */
+/* #define VERTEX_3_S 0x6C4 */
+/* #define VERTEX_3_T 0x6C8 */
+/* #define VERTEX_3_W 0x6CC */
+/* #define VERTEX_1_SPEC_ARGB 0x6D0 */
+/* #define VERTEX_2_SPEC_ARGB 0x6D4 */
+/* #define VERTEX_3_SPEC_ARGB 0x6D8 */
+/* #define VERTEX_1_Z 0x6DC */
+/* #define VERTEX_2_Z 0x6E0 */
+/* #define VERTEX_3_Z 0x6E4 */
+/* #define VERTEX_1_ARGB 0x6E8 */
+/* #define VERTEX_2_ARGB 0x6EC */
+/* #define VERTEX_3_ARGB 0x6F0 */
+/* #define VERTEX_1_X_Y 0x6F4 */
+/* #define VERTEX_2_X_Y 0x6F8 */
+/* #define VERTEX_3_X_Y 0x6FC */
+#define ONE_OVER_AREA_UC 0x700
+#define SETUP_CNTL 0x704
+/* 0x708 - 0x724 */
+#define VERTEX_1_SECONDARY_S 0x728
+#define VERTEX_1_SECONDARY_T 0x72C
+#define VERTEX_1_SECONDARY_W 0x730
+#define VERTEX_2_SECONDARY_S 0x734
+#define VERTEX_2_SECONDARY_T 0x738
+#define VERTEX_2_SECONDARY_W 0x73C
+/* 0x740 - 0x7FC */
+
+
+/* HW_DEBUG */
+#define INTER_PRIM_DIS 0x00000040
+#define AUTO_BLKWRT_COLOR_DIS 0x00000100
+#define AUTO_FF_DIS 0x00001000
+#define AUTO_BLKWRT_DIS 0x00002000
+
+/* CLOCK_CNTL1 */
+#define PLL_WR_EN 0x02
+
+/* CONFIG_CHIP_ID */
+#define CFG_CHIP_TYPE 0x0000FFFF
+#define CFG_CHIP_CLASS 0x00FF0000
+#define CFG_CHIP_MAJOR 0x07000000
+#define CFG_CHIP_FND_ID 0x38000000
+#define CFG_CHIP_MINOR 0xC0000000
+
+/* CONFIG_STAT0 */
+#define CFG_MEM_TYPE 0x00000007
+#define CFG_MEM_TYPE_SGRAM 0x00000005
+
+/* DST_BRES_LNTH */
+#define DRAW_TRAP 0x00008000
+#define LINE_DIS 0x80000000
+
+/* DST_CNTL */
+#define DST_X_DIR 0x00000001
+#define DST_Y_DIR 0x00000002
+#define DST_Y_MAJOR 0x00000004
+#define DST_X_TILE 0x00000008
+#define DST_Y_TILE 0x00000010
+#define DST_LAST_PEL 0x00000020
+#define DST_POLYGON_EN 0x00000040
+#define DST_24_ROTATION_EN 0x00000080
+#define TRAIL_X_DIR 0x00002000
+#define TRAP_FILL_DIR 0x00004000
+
+/* ALPHA_TST_CNTL */
+#define ALPHA_DST_SEL_ZERO 0x00000000
+#define ALPHA_DST_SEL_ONE 0x00000100
+#define ALPHA_DST_SEL_SRCALPHA 0x00000400
+#define ALPHA_DST_SEL_INVSRCALPHA 0x00000500
+#define ALPHA_DST_SEL_DSTALPHA 0x00000600
+#define ALPHA_DST_SEL_INVDSTALPHA 0x00000700
+
+/* SRC_CNTL */
+#define SRC_PATTERN_EN 0x00000001
+#define SRC_ROTATION_EN 0x00000002
+#define SRC_LINEAR_EN 0x00000004
+#define SRC_BYTE_ALIGN 0x00000008
+#define SRC_LINE_X_DIR 0x00000010
+#define FAST_FILL_EN 0x00000040
+#define COLOR_REG_WRITE_EN 0x00002000
+#define BLOCK_WRITE_EN 0x00004000
+
+/* DP_PIX_WIDTH (GT) */
+#define DST_PIX_WIDTH_MONO 0x00000000
+#define DST_PIX_WIDTH_CI8 0x00000002
+#define DST_PIX_WIDTH_ARGB1555 0x00000003
+#define DST_PIX_WIDTH_RGB565 0x00000004
+#define DST_PIX_WIDTH_RGB888 0x00000005
+#define DST_PIX_WIDTH_ARGB8888 0x00000006
+#define DST_PIX_WIDTH_RGB332 0x00000007
+#define DST_PIX_WIDTH_Y8 0x00000008
+#define DST_PIX_WIDTH_RGB8 0x00000009
+#define DST_PIX_WIDTH_VYUY 0x0000000B
+#define DST_PIX_WIDTH_YVYU 0x0000000C
+#define DST_PIX_WIDTH_AYUV8888 0x0000000E
+#define DST_PIX_WIDTH_ARGB4444 0x0000000F
+#define SRC_PIX_WIDTH_MONO 0x00000000
+#define SRC_PIX_WIDTH_CI8 0x00000200
+#define SRC_PIX_WIDTH_ARGB1555 0x00000300
+#define SRC_PIX_WIDTH_RGB565 0x00000400
+#define SRC_PIX_WIDTH_ARGB8888 0x00000600
+#define SRC_PIX_WIDTH_RGB332 0x00000700
+#define SRC_PIX_WIDTH_Y8 0x00000800
+#define SRC_PIX_WIDTH_VYUY 0x00000B00
+#define SRC_PIX_WIDTH_YVYU 0x00000C00
+#define SRC_PIX_WIDTH_AYUV8888 0x00000E00
+#define SRC_PIX_WIDTH_ARGB4444 0x00000F00
+#define SCALE_PIX_WIDTH_CI8 0x20000000
+#define SCALE_PIX_WIDTH_ARGB1555 0x30000000
+#define SCALE_PIX_WIDTH_RGB565 0x40000000
+#define SCALE_PIX_WIDTH_ARGB8888 0x60000000
+#define SCALE_PIX_WIDTH_RGB332 0x70000000
+#define SCALE_PIX_WIDTH_Y8 0x80000000
+#define SCALE_PIX_WIDTH_RGB8 0x90000000
+#define SCALE_PIX_WIDTH_VYUY 0xB0000000
+#define SCALE_PIX_WIDTH_YVYU 0xC0000000
+#define SCALE_PIX_WIDTH_AYUV8888 0xE0000000
+#define SCALE_PIX_WIDTH_ARGB4444 0xF0000000
+
+/* DP_PIX_WIDTH (GX/CT/VT) */
+#define DST_PIX_WIDTH_8BPP 0x00000002
+#define DST_PIX_WIDTH_15BPP 0x00000003
+#define DST_PIX_WIDTH_16BPP 0x00000004
+#define DST_PIX_WIDTH_32BPP 0x00000006
+#define SRC_PIX_WIDTH_8BPP 0x00000200
+#define SRC_PIX_WIDTH_15BPP 0x00000300
+#define SRC_PIX_WIDTH_16BPP 0x00000400
+#define SRC_PIX_WIDTH_32BPP 0x00000600
+
+/* DP_PIX_WIDTH masks */
+#define DST_PIX_WIDTH 0x0000000F
+#define SRC_PIX_WIDTH 0x00000F00
+#define SCALE_PIX_WIDTH 0xF0000000
+
+/* DP_MIX */
+#define BKGD_MIX_DST 0x00000003
+#define BKGD_MIX_SRC 0x00000007
+#define FRGD_MIX_DST 0x00030000
+#define FRGD_MIX_SRC 0x00070000
+
+/* DP_SRC */
+#define BKGD_SRC_BKGD_CLR 0x00000000
+#define BKGD_SRC_FRGD_CLR 0x00000001
+#define BKGD_SRC_HOST 0x00000002
+#define BKGD_SRC_BLIT 0x00000003
+#define BKGD_SRC_PATTERN 0x00000004
+#define BKGD_SRC_SCALE 0x00000005
+#define FRGD_SRC_BKGD_CLR 0x00000000
+#define FRGD_SRC_FRGD_CLR 0x00000100
+#define FRGD_SRC_HOST 0x00000200
+#define FRGD_SRC_BLIT 0x00000300
+#define FRGD_SRC_PATTERN 0x00000400
+#define FRGD_SRC_SCALE 0x00000500
+#define MONO_SRC_ONE 0x00000000
+#define MONO_SRC_PATTERN 0x00010000
+#define MONO_SRC_HOST 0x00020000
+#define MONO_SRC_BLIT 0x00030000
+
+/* CLR_CMP_CNTL */
+#define CLR_CMP_FN_FALSE 0x00000000
+#define CLR_CMP_FN_TRUE 0x00000001
+#define CLR_CMP_FN_NOT_EQUAL 0x00000004
+#define CLR_CMP_FN_EQUAL 0x00000005
+#define CLR_CMP_SRC_DEST 0x00000000
+#define CLR_CMP_SRC_2D 0x01000000
+#define CLR_CMP_SRC_SCALE 0x02000000
+
+/* GUI_STAT */
+#define GUI_ACTIVE 0x00000001
+
+/* SCALE_3D_CNTL */
+#define SCALE_PIX_EXPAND 0x00000001
+#define SCALE_DITHER 0x00000002
+#define DITHER_EN 0x00000004
+#define DITHER_INIT 0x00000008
+#define ROUND_EN 0x00000010
+#define TEX_CACHE_DIS 0x00000020
+#define SCALE_3D_FCN_NOP 0x00000000
+#define SCALE_3D_FCN_SCALE 0x00000040
+#define SCALE_3D_FCN_TEXTURE 0x00000080
+#define SCALE_3D_FCN_SHADE 0x000000C0
+#define SCALE_PIX_REP 0x00000100
+#define NEAREST_TEX_VIS 0x00000200
+#define TEX_CACHE_SPLIT 0x00000200
+#define APPLE_YUV_MODE 0x00000400
+#define ALPHA_FOG_EN_DIS 0x00000000
+#define ALPHA_FOG_EN_ALPHA 0x00000800
+#define ALPHA_FOG_EN_FOG 0x00001000
+#define COLOR_OVERRIDE 0x00002000
+#define ALPHA_BLND_SAT 0x00002000
+#define RED_DITHER_MAX 0x00004000
+#define SIGNED_DST_CLAMP 0x00008000
+#define ALPHA_BLND_SRC_ZERO 0x00000000
+#define ALPHA_BLND_SRC_ONE 0x00010000
+#define ALPHA_BLND_SRC_DSTCOLOR 0x00020000
+#define ALPHA_BLND_SRC_INVDSTCOLOR 0x00030000
+#define ALPHA_BLND_SRC_SRCALPHA 0x00040000
+#define ALPHA_BLND_SRC_INVSRCALPHA 0x00050000
+#define ALPHA_BLND_SRC_DSTALPHA 0x00060000
+#define ALPHA_BLND_SRC_INVDSTALPHA 0x00070000
+#define ALPHA_BLND_DST_ZERO 0x00000000
+#define ALPHA_BLND_DST_ONE 0x00080000
+#define ALPHA_BLND_DST_SRCCOLOR 0x00100000
+#define ALPHA_BLND_DST_INVSRCCOLOR 0x00180000
+#define ALPHA_BLND_DST_SRCALPHA 0x00200000
+#define ALPHA_BLND_DST_INVSRCALPHA 0x00280000
+#define ALPHA_BLND_DST_DSTALPHA 0x00300000
+#define ALPHA_BLND_DST_INVDSTALPHA 0x00380000
+#define TEX_LIGHT_FCN_REPLACE 0x00000000
+#define TEX_LIGHT_FCN_MODULATE 0x00400000
+#define TEX_LIGHT_FCN_ALPHA_DECAL 0x00800000
+#define MIP_MAP_DISABLE 0x01000000
+#define BILINEAR_TEX_EN 0x02000000
+#define TEX_BLEND_FCN_NEAREST_MIPMAP_NEAREST 0x00000000
+#define TEX_BLEND_FCN_NEAREST_MIPMAP_LINEAR 0x04000000
+#define TEX_BLEND_FCN_LINEAR_MIPMAP_NEAREST 0x08000000
+#define TEX_BLEND_FCN_LINEAR_MIPMAP_LINEAR 0x0C000000
+#define TEX_AMASK_AEN 0x10000000
+#define TEX_AMASK_MODE 0x20000000
+#define TEX_MAP_AEN 0x40000000
+#define SRC_3D_SEL 0x80000000
+
+/* TEX_CNTL */
+#define TEX_CACHE_FLUSH 0x00800000
+
+/* OVERLAY_Y_X_START */
+#define OVERLAY_LOCK_START 0x80000000
+
+/* OVERLAY_Y_X_END */
+#define OVERLAY_LOCK_END 0x80000000
+
+/* OVERLAY_KEY_CNTL */
+#define VIDEO_KEY_FN_FALSE 0x00000000
+#define VIDEO_KEY_FN_TRUE 0x00000001
+#define VIDEO_KEY_FN_NOT_EQUAL 0x00000004
+#define VIDEO_KEY_FN_EQUAL 0x00000005
+#define GRAPHICS_KEY_FN_FALSE 0x00000000
+#define GRAPHICS_KEY_FN_TRUE 0x00000010
+#define GRAPHICS_KEY_FN_NOT_EQUAL 0x00000040
+#define GRAPHICS_KEY_FN_EQUAL 0x00000050
+#define OVERLAY_CMP_MIX_OR 0x00000000
+#define OVERLAY_CMP_MIX_AND 0x00000100
+
+/* OVERLAY_SCALE_CNTL */
+/* #define SCALE_PIX_EXPAND 0x00000001 */
+#define SCALE_Y2R_TEMP 0x00000002
+#define SCALE_HORZ_MODE 0x00000004
+#define SCALE_VERT_MODE 0x00000008
+#define SCALE_SIGNED_UV 0x00000010
+#define SCALE_GAMMA_SEL 0x00000060
+#define SCALE_BANDWITH 0x04000000
+#define SCALE_DIS_LIMIT 0x08000000
+#define SCALE_CLK_FORCE_ON 0x20000000
+#define OVERLAY_EN 0x40000000
+#define SCALE_EN 0x80000000
+
+/* VIDEO_FORMAT */
+#define VIDEO_IN_VYUY422 0x0000000B
+#define VIDEO_IN_YVYU422 0x0000000C
+#define VIDEO_SIGNED_UV 0x00000010
+#define SCALER_IN_RGB15 0x00030000
+#define SCALER_IN_RGB16 0x00040000
+#define SCALER_IN_RGB32 0x00060000
+#define SCALER_IN_YUV9 0x00090000
+#define SCALER_IN_YUV12 0x000A0000
+#define SCALER_IN_VYUY422 0x000B0000
+#define SCALER_IN_YVYU422 0x000C0000
+
+/* CAPTURE_CONFIG */
+#define OVL_BUF_MODE_SINGLE 0x00000000
+#define OVL_BUF_MODE_DOUBLE 0x10000000
+#define OVL_BUF_NEXT_BUF0 0x00000000
+#define OVL_BUF_NEXT_BUF1 0x20000000
+
+#endif