diff options
Diffstat (limited to 'Source/DirectFB/gfxdrivers/mach64')
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/Makefile.am | 39 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/Makefile.in | 603 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/mach64.c | 1640 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/mach64.h | 120 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/mach64_overlay.c | 724 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/mach64_state.c | 654 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/mach64_state.h | 90 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/mmio.h | 198 | ||||
-rwxr-xr-x | Source/DirectFB/gfxdrivers/mach64/regs.h | 883 |
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 |