From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/gfxdrivers/nvidia/Makefile.am | 45 + Source/DirectFB/gfxdrivers/nvidia/Makefile.in | 614 ++++++ Source/DirectFB/gfxdrivers/nvidia/nvidia.c | 2046 ++++++++++++++++++++ Source/DirectFB/gfxdrivers/nvidia/nvidia.h | 238 +++ Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.c | 549 ++++++ Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.h | 48 + Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.c | 522 +++++ Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.h | 36 + Source/DirectFB/gfxdrivers/nvidia/nvidia_accel.h | 246 +++ Source/DirectFB/gfxdrivers/nvidia/nvidia_objects.h | 160 ++ Source/DirectFB/gfxdrivers/nvidia/nvidia_overlay.c | 566 ++++++ Source/DirectFB/gfxdrivers/nvidia/nvidia_primary.c | 189 ++ Source/DirectFB/gfxdrivers/nvidia/nvidia_regs.h | 1636 ++++++++++++++++ Source/DirectFB/gfxdrivers/nvidia/nvidia_state.c | 730 +++++++ Source/DirectFB/gfxdrivers/nvidia/nvidia_state.h | 58 + 15 files changed, 7683 insertions(+) create mode 100755 Source/DirectFB/gfxdrivers/nvidia/Makefile.am create mode 100755 Source/DirectFB/gfxdrivers/nvidia/Makefile.in create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia.c create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia.h create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.c create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.h create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.c create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.h create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_accel.h create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_objects.h create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_overlay.c create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_primary.c create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_regs.h create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_state.c create mode 100755 Source/DirectFB/gfxdrivers/nvidia/nvidia_state.h (limited to 'Source/DirectFB/gfxdrivers/nvidia') diff --git a/Source/DirectFB/gfxdrivers/nvidia/Makefile.am b/Source/DirectFB/gfxdrivers/nvidia/Makefile.am new file mode 100755 index 0000000..8b495e9 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/Makefile.am @@ -0,0 +1,45 @@ +## Makefile.am for DirectFB/src/core/gfxcards/nvidia + +INCLUDES = \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/lib \ + -I$(top_srcdir)/lib \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/systems + +nvidia_LTLIBRARIES = libdirectfb_nvidia.la + +if BUILD_STATIC +nvidia_DATA = $(nvidia_LTLIBRARIES:.la=.o) +endif + +nvidiadir = $(MODULEDIR)/gfxdrivers + +libdirectfb_nvidia_la_SOURCES = \ + nvidia.c \ + nvidia_state.c \ + nvidia_2d.c \ + nvidia_3d.c \ + nvidia_primary.c \ + nvidia_overlay.c \ + nvidia.h \ + nvidia_regs.h \ + nvidia_accel.h \ + nvidia_objects.h \ + nvidia_state.h \ + nvidia_2d.h \ + nvidia_3d.h + +libdirectfb_nvidia_la_LDFLAGS = \ + -module \ + -avoid-version \ + $(DFB_LDFLAGS) + +libdirectfb_nvidia_la_LIBADD = -lm \ + $(top_builddir)/lib/direct/libdirect.la \ + $(top_builddir)/lib/fusion/libfusion.la \ + $(top_builddir)/src/libdirectfb.la + + +include $(top_srcdir)/rules/libobject.make diff --git a/Source/DirectFB/gfxdrivers/nvidia/Makefile.in b/Source/DirectFB/gfxdrivers/nvidia/Makefile.in new file mode 100755 index 0000000..472373c --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/Makefile.in @@ -0,0 +1,614 @@ +# 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/nvidia +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)$(nvidiadir)" "$(DESTDIR)$(nvidiadir)" +nvidiaLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(nvidia_LTLIBRARIES) +libdirectfb_nvidia_la_DEPENDENCIES = \ + $(top_builddir)/lib/direct/libdirect.la \ + $(top_builddir)/lib/fusion/libfusion.la \ + $(top_builddir)/src/libdirectfb.la +am_libdirectfb_nvidia_la_OBJECTS = nvidia.lo nvidia_state.lo \ + nvidia_2d.lo nvidia_3d.lo nvidia_primary.lo nvidia_overlay.lo +libdirectfb_nvidia_la_OBJECTS = $(am_libdirectfb_nvidia_la_OBJECTS) +libdirectfb_nvidia_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libdirectfb_nvidia_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_nvidia_la_SOURCES) +DIST_SOURCES = $(libdirectfb_nvidia_la_SOURCES) +nvidiaDATA_INSTALL = $(INSTALL_DATA) +DATA = $(nvidia_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)/src \ + -I$(top_srcdir)/systems + +nvidia_LTLIBRARIES = libdirectfb_nvidia.la +@BUILD_STATIC_TRUE@nvidia_DATA = $(nvidia_LTLIBRARIES:.la=.o) +nvidiadir = $(MODULEDIR)/gfxdrivers +libdirectfb_nvidia_la_SOURCES = \ + nvidia.c \ + nvidia_state.c \ + nvidia_2d.c \ + nvidia_3d.c \ + nvidia_primary.c \ + nvidia_overlay.c \ + nvidia.h \ + nvidia_regs.h \ + nvidia_accel.h \ + nvidia_objects.h \ + nvidia_state.h \ + nvidia_2d.h \ + nvidia_3d.h + +libdirectfb_nvidia_la_LDFLAGS = \ + -module \ + -avoid-version \ + $(DFB_LDFLAGS) + +libdirectfb_nvidia_la_LIBADD = -lm \ + $(top_builddir)/lib/direct/libdirect.la \ + $(top_builddir)/lib/fusion/libfusion.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/nvidia/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu gfxdrivers/nvidia/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-nvidiaLTLIBRARIES: $(nvidia_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(nvidiadir)" || $(MKDIR_P) "$(DESTDIR)$(nvidiadir)" + @list='$(nvidia_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(nvidiaLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(nvidiadir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(nvidiaLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(nvidiadir)/$$f"; \ + else :; fi; \ + done + +uninstall-nvidiaLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(nvidia_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(nvidiadir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(nvidiadir)/$$p"; \ + done + +clean-nvidiaLTLIBRARIES: + -test -z "$(nvidia_LTLIBRARIES)" || rm -f $(nvidia_LTLIBRARIES) + @list='$(nvidia_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_nvidia.la: $(libdirectfb_nvidia_la_OBJECTS) $(libdirectfb_nvidia_la_DEPENDENCIES) + $(libdirectfb_nvidia_la_LINK) -rpath $(nvidiadir) $(libdirectfb_nvidia_la_OBJECTS) $(libdirectfb_nvidia_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nvidia.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nvidia_2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nvidia_3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nvidia_overlay.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nvidia_primary.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nvidia_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-nvidiaDATA: $(nvidia_DATA) + @$(NORMAL_INSTALL) + test -z "$(nvidiadir)" || $(MKDIR_P) "$(DESTDIR)$(nvidiadir)" + @list='$(nvidia_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(nvidiaDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(nvidiadir)/$$f'"; \ + $(nvidiaDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(nvidiadir)/$$f"; \ + done + +uninstall-nvidiaDATA: + @$(NORMAL_UNINSTALL) + @list='$(nvidia_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(nvidiadir)/$$f'"; \ + rm -f "$(DESTDIR)$(nvidiadir)/$$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)$(nvidiadir)" "$(DESTDIR)$(nvidiadir)"; 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-nvidiaLTLIBRARIES \ + 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-nvidiaDATA install-nvidiaLTLIBRARIES + +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-nvidiaDATA uninstall-nvidiaLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-nvidiaLTLIBRARIES 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-man \ + install-nvidiaDATA install-nvidiaLTLIBRARIES 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-nvidiaDATA \ + uninstall-nvidiaLTLIBRARIES + +%.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/nvidia/nvidia.c b/Source/DirectFB/gfxdrivers/nvidia/nvidia.c new file mode 100755 index 0000000..6ecb17f --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia.c @@ -0,0 +1,2046 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 + +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +DFB_GRAPHICS_DRIVER( nvidia ) + +#include "nvidia.h" +#include "nvidia_regs.h" +#include "nvidia_accel.h" +#include "nvidia_objects.h" +#include "nvidia_state.h" +#include "nvidia_2d.h" +#include "nvidia_3d.h" + + +/* Riva TNT */ +#define NV4_SUPPORTED_DRAWINGFLAGS \ + (DSDRAW_BLEND) + +#define NV4_SUPPORTED_DRAWINGFUNCTIONS \ + (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | \ + DFXL_FILLTRIANGLE | DFXL_DRAWLINE) + +#define NV4_SUPPORTED_BLITTINGFLAGS \ + (DSBLIT_BLEND_COLORALPHA | DSBLIT_BLEND_ALPHACHANNEL | \ + DSBLIT_DEINTERLACE) + +#define NV4_SUPPORTED_BLITTINGFUNCTIONS \ + (DFXL_BLIT | DFXL_STRETCHBLIT | DFXL_TEXTRIANGLES) + +/* Riva TNT2 */ +#define NV5_SUPPORTED_DRAWINGFLAGS \ + (DSDRAW_BLEND) + +#define NV5_SUPPORTED_DRAWINGFUNCTIONS \ + (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | \ + DFXL_FILLTRIANGLE | DFXL_DRAWLINE) + +#define NV5_SUPPORTED_BLITTINGFLAGS \ + (DSBLIT_BLEND_COLORALPHA | DSBLIT_BLEND_ALPHACHANNEL | \ + DSBLIT_COLORIZE | DSBLIT_DEINTERLACE) + +#define NV5_SUPPORTED_BLITTINGFUNCTIONS \ + (DFXL_BLIT | DFXL_STRETCHBLIT | DFXL_TEXTRIANGLES) + +/* GeForce1/GeForce2/GeForce4 */ +#define NV10_SUPPORTED_DRAWINGFLAGS \ + (DSDRAW_BLEND) + +#define NV10_SUPPORTED_DRAWINGFUNCTIONS \ + (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | \ + DFXL_FILLTRIANGLE | DFXL_DRAWLINE) + +#define NV10_SUPPORTED_BLITTINGFLAGS \ + (DSBLIT_BLEND_COLORALPHA | DSBLIT_BLEND_ALPHACHANNEL | \ + DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR | \ + DSBLIT_DEINTERLACE) + +#define NV10_SUPPORTED_BLITTINGFUNCTIONS \ + (DFXL_BLIT | DFXL_STRETCHBLIT | DFXL_TEXTRIANGLES) + +/* GeForce3/GeForce4Ti */ +#define NV20_SUPPORTED_DRAWINGFLAGS \ + (DSDRAW_BLEND) + +#define NV20_SUPPORTED_DRAWINGFUNCTIONS \ + (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | \ + DFXL_FILLTRIANGLE | DFXL_DRAWLINE) + +#define NV20_SUPPORTED_BLITTINGFLAGS \ + (DSBLIT_BLEND_COLORALPHA | DSBLIT_BLEND_ALPHACHANNEL | \ + DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR | \ + DSBLIT_DEINTERLACE) + +#define NV20_SUPPORTED_BLITTINGFUNCTIONS \ + (DFXL_BLIT | DFXL_STRETCHBLIT) + +/* GeForceFX */ +#define NV30_SUPPORTED_DRAWINGFLAGS \ + (DSDRAW_BLEND) + +#define NV30_SUPPORTED_DRAWINGFUNCTIONS \ + (DFXL_FILLRECTANGLE | DFXL_DRAWRECTANGLE | \ + DFXL_FILLTRIANGLE | DFXL_DRAWLINE) + +#define NV30_SUPPORTED_BLITTINGFLAGS \ + (DSBLIT_NOFX) + +#define NV30_SUPPORTED_BLITTINGFUNCTIONS \ + (DFXL_BLIT) + + +#define DSBLIT_MODULATE_ALPHA \ + (DSBLIT_BLEND_COLORALPHA | DSBLIT_BLEND_ALPHACHANNEL) + +#define DSBLIT_MODULATE_COLOR \ + (DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR) + +#define DSBLIT_MODULATE \ + (DSBLIT_MODULATE_ALPHA | DSBLIT_MODULATE_COLOR) + + + + +static void nvAfterSetVar( void *driver_data, + void *device_data ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) device_data; + volatile u8 *mmio = nvdrv->mmio_base; + int i; + + nv_waitidle( nvdrv, nvdev ); + + /* reconfigure PFIFO for selected mode (DMA/PIO) */ + nv_out32( mmio, PFIFO_CACHES, PFIFO_CACHES_REASSIGN_DISABLED ); + if (nvdev->use_dma) { + nv_out32( mmio, PFIFO_MODE, PFIFO_MODE_CHANNEL_0_DMA ); + nv_out32( mmio, PFIFO_NEXT_CHANNEL, PFIFO_NEXT_CHANNEL_MODE_DMA ); + } else { + nv_out32( mmio, PFIFO_MODE, PFIFO_MODE_CHANNEL_0_PIO ); + nv_out32( mmio, PFIFO_NEXT_CHANNEL, PFIFO_NEXT_CHANNEL_MODE_PIO ); + } + nv_out32( mmio, PFIFO_CACHE1_PUSH0, PFIFO_CACHE1_PULL1_ENGINE_SW ); + nv_out32( mmio, PFIFO_CACHE1_PULL0, PFIFO_CACHE1_PULL0_ACCESS_DISABLED ); + if (nvdev->use_dma) { + nv_out32( mmio, PFIFO_CACHE1_PUSH1, PFIFO_CACHE1_PUSH1_MODE_DMA ); + } else { + nv_out32( mmio, PFIFO_CACHE1_PUSH1, PFIFO_CACHE1_PUSH1_MODE_PIO ); + } + nv_out32( mmio, PFIFO_CACHE1_DMA_PUT, 0 ); + nv_out32( mmio, PFIFO_CACHE1_DMA_GET, 0 ); + if (nvdev->use_dma) { + nv_out32( mmio, PFIFO_CACHE1_DMA_INSTANCE, ADDR_DMA_OUT ); + } else { + nv_out32( mmio, PFIFO_CACHE1_DMA_INSTANCE, 0 ); + } + nv_out32( mmio, PFIFO_CACHE0_PUSH0, PFIFO_CACHE0_PUSH0_ACCESS_DISABLED ); + nv_out32( mmio, PFIFO_CACHE0_PULL0, PFIFO_CACHE0_PULL0_ACCESS_DISABLED ); + nv_out32( mmio, PFIFO_RAMHT, 0x00000100 | + PFIFO_RAMHT_SIZE_4K | + PFIFO_RAMHT_SEARCH_128 ); + nv_out32( mmio, PFIFO_RAMFC, 0x00000110 ); + nv_out32( mmio, PFIFO_RAMRO, 0x00000112 | PFIFO_RAMRO_SIZE_512 ); + nv_out32( mmio, PFIFO_SIZE, 0x0000FFFF ); + nv_out32( mmio, PFIFO_CACHE1_HASH, 0x0000FFFF ); + nv_out32( mmio, PFIFO_INTR_EN, PFIFO_INTR_EN_DISABLED ); + nv_out32( mmio, PFIFO_INTR, PFIFO_INTR_RESET ); + nv_out32( mmio, PFIFO_CACHE0_PULL1, PFIFO_CACHE0_PULL1_ENGINE_GRAPHICS ); + if (nvdev->use_dma) { + if (nvdev->use_agp) { + nv_out32( mmio, PFIFO_CACHE1_DMA_CTL, + PFIFO_CACHE1_DMA_CTL_PAGE_TABLE_PRESENT | + PFIFO_CACHE1_DMA_CTL_PAGE_ENTRY_LINEAR | + PFIFO_CACHE1_DMA_CTL_TARGET_NODE_AGP ); + } else { + nv_out32( mmio, PFIFO_CACHE1_DMA_CTL, + PFIFO_CACHE1_DMA_CTL_PAGE_TABLE_PRESENT | + PFIFO_CACHE1_DMA_CTL_PAGE_ENTRY_LINEAR | + PFIFO_CACHE1_DMA_CTL_TARGET_NODE_NVM ); + } + nv_out32( mmio, PFIFO_CACHE1_DMA_LIMIT, nvdev->dma_size - 4 ); + nv_out32( mmio, PFIFO_CACHE1_ENGINE, PFIFO_CACHE1_ENGINE_0_SW ); +#ifdef WORDS_BIGENDIAN + nv_out32( mmio, PFIFO_CACHE1_DMA_FETCH, + PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES | + PFIFO_CACHE1_DMA_FETCH_MAX_REQS_15 | + PFIFO_CACHE1_BIG_ENDIAN ); +#else + nv_out32( mmio, PFIFO_CACHE1_DMA_FETCH, + PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES | + PFIFO_CACHE1_DMA_FETCH_MAX_REQS_15 | + PFIFO_CACHE1_LITTLE_ENDIAN ); +#endif + nv_out32( mmio, PFIFO_CACHE1_DMA_PUSH, + PFIFO_CACHE1_DMA_PUSH_ACCESS_ENABLED ); + } else { + nv_out32( mmio, PFIFO_CACHE1_DMA_PUSH, + PFIFO_CACHE1_DMA_PUSH_ACCESS_DISABLED ); + } + nv_out32( mmio, PFIFO_CACHE1_PUSH0, PFIFO_CACHE1_PUSH0_ACCESS_ENABLED ); + nv_out32( mmio, PFIFO_CACHE1_PULL0, PFIFO_CACHE1_PULL0_ACCESS_ENABLED ); + nv_out32( mmio, PFIFO_CACHE1_PULL1, PFIFO_CACHE1_PULL1_ENGINE_GRAPHICS ); + nv_out32( mmio, PFIFO_CACHES, PFIFO_CACHES_REASSIGN_ENABLED ); + nv_out32( mmio, PFIFO_INTR_EN, PFIFO_INTR_EN_CACHE_ERROR_ENABLED ); + + if (nvdev->arch == NV_ARCH_10) { + nv_out32( mmio, PGRAPH_DEBUG_1, 0x00118701 ); + nv_out32( mmio, PGRAPH_DEBUG_2, 0x24F82AD9 ); + + for (i = 0; i < 8; i++) { + nv_out32( mmio, NV10_PGRAPH_WINDOWCLIP_HORIZONTAL+i*4, 0x07FF0800 ); + nv_out32( mmio, NV10_PGRAPH_WINDOWCLIP_VERTICAL +i*4, 0x07FF0800 ); + } + + nv_out32( mmio, NV10_PGRAPH_XFMODE0, 0x10000000 ); + nv_out32( mmio, NV10_PGRAPH_XFMODE1, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006740 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006750 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x40000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x40000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x40000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x40000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006760 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006770 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC5000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC5000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006780 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x000067A0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006AB0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006AC0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006C10 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xBF800000 ); + + for (i = 0; i < 8; i++) { + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x7030+i*16 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x7149F2CA ); + } + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006A80 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006AA0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00000040 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000005 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006400 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x4B7FFFFF ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006410 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC5000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC5000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006420 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x00006430 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x000064C0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x477FFFFF ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x3F800000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x000064D0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC5000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC5000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x000064E0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC4FFF000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0xC4FFF000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_PIPE_ADDRESS, 0x000064F0 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + nv_out32( mmio, NV10_PGRAPH_PIPE_DATA, 0x00000000 ); + + nv_out32( mmio, NV10_PGRAPH_XFMODE0, 0x30000000 ); + nv_out32( mmio, NV10_PGRAPH_XFMODE1, 0x00000004 ); + nv_out32( mmio, NV10_PGRAPH_GLOBALSTATE0, 0x10000000 ); + nv_out32( mmio, NV10_PGRAPH_GLOBALSTATE1, 0x00000000 ); + } + + nvdev->dma_max = nvdev->dma_size/4 - 1; + nvdev->dma_cur = 0; + nvdev->dma_free = nvdev->dma_max; + nvdev->dma_put = 0; + nvdev->dma_get = 0; + nvdev->fifo_free = 0; +} + +static void nvEngineReset( void *drv, void *dev ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + int i; + + /* reput objects into subchannels */ + for (i = 0; i < 8; i++) { + nv_assign_object( nvdrv, nvdev, i, + nvdev->subchannel_object[i], true ); + } + + nvdev->set = 0; + nvdev->dst_format = DSPF_UNKNOWN; + nvdev->dst_pitch = 0; + nvdev->src_pitch = 0; + nvdev->beta1_set = false; + nvdev->beta4_set = false; +} + +static DFBResult nvEngineSync( void *drv, void *dev ) +{ + nv_waitidle( (NVidiaDriverData*)drv, (NVidiaDeviceData*)dev ); + + return DFB_OK; +} + +static void nvFlushTextureCache( void *drv, void *dev ) +{ + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + /* invalidate source texture */ + nvdev->set &= ~SMF_SOURCE_TEXTURE; +} + +static void nvEmitCommands( void *drv, void *dev ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + if (nvdev->use_dma) + nv_emitdma( nvdrv, nvdev ); +} + +static void nv4CheckState( void *drv, void *dev, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + CoreSurface *destination = state->destination; + CoreSurface *source = state->source; + + switch (destination->config.format) { + case DSPF_A8: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel != DFXL_BLIT || state->blittingflags || + source->config.format != destination->config.format) + return; + } else { + if (state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel & ~(DFXL_BLIT | DFXL_STRETCHBLIT) || + state->blittingflags != DSBLIT_NOFX || + source->config.format != destination->config.format) + return; + } else { + if (accel & (DFXL_FILLTRIANGLE | DFXL_DRAWLINE) || + state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + default: + return; + } + + if (DFB_BLITTING_FUNCTION( accel )) { + /* check unsupported blitting flags */ + if (accel & ~NV4_SUPPORTED_BLITTINGFUNCTIONS || + state->blittingflags & ~NV4_SUPPORTED_BLITTINGFLAGS) + return; + + if (accel == DFXL_TEXTRIANGLES) { + u32 size = 1 << (direct_log2(source->config.size.w) + + direct_log2(source->config.size.h)); + + if (size > nvdev->max_texture_size) + return; + } + else { + if (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL) { + if (state->src_blend != DSBF_SRCALPHA || + state->dst_blend != DSBF_INVSRCALPHA) + return; + } + if (state->render_options & DSRO_MATRIX && + (state->matrix[0] < 0 || state->matrix[1] || + state->matrix[3] || state->matrix[4] < 0)) + return; + } + + switch (source->config.format) { + case DSPF_LUT8: + case DSPF_ALUT44: + if (destination->config.format != source->config.format || + !dfb_palette_equal( source->palette, + destination->palette )) + return; + break; + + case DSPF_A8: + case DSPF_RGB332: + if (destination->config.format != source->config.format) + return; + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB32: + case DSPF_ARGB: + break; + + case DSPF_RGB16: + switch (accel) { + case DFXL_BLIT: + if (state->blittingflags != DSBLIT_NOFX || + destination->config.format != DSPF_RGB16) + return; + break; + case DFXL_STRETCHBLIT: + return; + default: + break; + } + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (accel == DFXL_TEXTRIANGLES) + return; + break; + + default: + return; + } + + state->accel |= accel; + } + else { + /* check unsupported drawing flags */ + if (accel & ~NV4_SUPPORTED_DRAWINGFUNCTIONS || + state->drawingflags & ~NV4_SUPPORTED_DRAWINGFLAGS) + return; + + state->accel |= NV4_SUPPORTED_DRAWINGFUNCTIONS; + } +} + +static void nv5CheckState( void *drv, void *dev, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + CoreSurface *destination = state->destination; + CoreSurface *source = state->source; + + switch (destination->config.format) { + case DSPF_A8: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel != DFXL_BLIT || state->blittingflags || + source->config.format != destination->config.format) + return; + } else { + if (state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel & ~(DFXL_BLIT | DFXL_STRETCHBLIT) || + state->blittingflags != DSBLIT_NOFX || + source->config.format != destination->config.format) + return; + } else { + if (accel & (DFXL_FILLTRIANGLE | DFXL_DRAWLINE) || + state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + default: + return; + } + + if (DFB_BLITTING_FUNCTION( accel )) { + /* check unsupported blitting flags */ + if (accel & ~NV5_SUPPORTED_BLITTINGFUNCTIONS || + state->blittingflags & ~NV5_SUPPORTED_BLITTINGFLAGS) + return; + + if (accel == DFXL_TEXTRIANGLES) { + u32 size = 1 << (direct_log2(source->config.size.w) + + direct_log2(source->config.size.h)); + + if (size > nvdev->max_texture_size) + return; + } + else { + if (state->blittingflags & DSBLIT_MODULATE) { + if (state->blittingflags & DSBLIT_MODULATE_ALPHA && + state->blittingflags & DSBLIT_MODULATE_COLOR) + return; + + if (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL) { + if (state->src_blend != DSBF_SRCALPHA || + state->dst_blend != DSBF_INVSRCALPHA) + return; + } + } + if (state->render_options & DSRO_MATRIX && + (state->matrix[0] < 0 || state->matrix[1] || + state->matrix[3] || state->matrix[4] < 0)) + return; + } + + switch (source->config.format) { + case DSPF_LUT8: + case DSPF_ALUT44: + if (destination->config.format != source->config.format || + /*state->src.buffer->policy == CSP_SYSTEMONLY ||*/ + !dfb_palette_equal( source->palette, + destination->palette )) + return; + break; + + case DSPF_A8: + case DSPF_RGB332: + if (destination->config.format != source->config.format /*|| + state->src.buffer->policy == CSP_SYSTEMONLY*/) + return; + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + /* disable host-to-video blit for simple blits */ + /*if (state->src.buffer->policy == CSP_SYSTEMONLY && + accel == DFXL_BLIT && !state->blittingflags && + source->config.format == destination->config.format) + return;*/ + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (accel & ~(DFXL_BLIT | DFXL_STRETCHBLIT) /*|| + state->src.buffer->policy == CSP_SYSTEMONLY*/) + return; + break; + + default: + return; + } + + state->accel |= accel; + } + else { + /* check unsupported drawing flags */ + if (accel & ~NV5_SUPPORTED_DRAWINGFUNCTIONS || + state->drawingflags & ~NV5_SUPPORTED_DRAWINGFLAGS) + return; + + state->accel |= NV5_SUPPORTED_DRAWINGFUNCTIONS; + } +} + +static void nv10CheckState( void *drv, void *dev, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + CoreSurface *destination = state->destination; + CoreSurface *source = state->source; + + switch (destination->config.format) { + case DSPF_A8: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel != DFXL_BLIT || state->blittingflags || + source->config.format != destination->config.format) + return; + } else { + if (state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel & ~(DFXL_BLIT | DFXL_STRETCHBLIT) || + state->blittingflags != DSBLIT_NOFX || + source->config.format != destination->config.format) + return; + } else { + if (accel & (DFXL_FILLTRIANGLE | DFXL_DRAWLINE) || + state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + default: + return; + } + + if (DFB_BLITTING_FUNCTION( accel )) { + /* check unsupported blitting flags */ + if (accel & ~NV10_SUPPORTED_BLITTINGFUNCTIONS || + state->blittingflags & ~NV10_SUPPORTED_BLITTINGFLAGS) + return; + + if (accel == DFXL_TEXTRIANGLES) { + u32 size = 1 << (direct_log2(source->config.size.w) + + direct_log2(source->config.size.h)); + + if (size > nvdev->max_texture_size) + return; + } + else { + if (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL) { + if (state->blittingflags & DSBLIT_MODULATE_COLOR) { + if (source->config.format == DSPF_ARGB && + state->src_blend != DSBF_ONE) + return; + } + + if (state->src_blend != DSBF_ONE && + state->src_blend != DSBF_SRCALPHA) + return; + + if (state->dst_blend != DSBF_INVSRCALPHA) + return; + } + + if (state->render_options & DSRO_MATRIX && + (state->matrix[0] < 0 || state->matrix[1] || + state->matrix[3] || state->matrix[4] < 0)) + return; + } + + switch (source->config.format) { + case DSPF_A8: + if (DFB_BYTES_PER_PIXEL(destination->config.format) != 4 /*|| + state->src.buffer->policy == CSP_SYSTEMONLY*/) + return; + break; + + case DSPF_LUT8: + case DSPF_ALUT44: + if (destination->config.format != source->config.format || + /*state->src.buffer->policy == CSP_SYSTEMONLY ||*/ + !dfb_palette_equal( source->palette, + destination->palette )) + return; + break; + + case DSPF_RGB332: + if (destination->config.format != source->config.format /*|| + state->src.buffer->policy == CSP_SYSTEMONLY*/) + return; + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + /* disable host-to-video blit for simple blits */ + /*if (state->src.buffer->policy == CSP_SYSTEMONLY && + accel == DFXL_BLIT && !state->blittingflags && + source->config.format == destination->config.format) + return;*/ + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (accel & ~(DFXL_BLIT | DFXL_STRETCHBLIT) /*|| + state->src.buffer->policy == CSP_SYSTEMONLY*/) + return; + break; + + default: + return; + } + + state->accel |= accel; + } + else { + /* check unsupported drawing flags */ + if (accel & ~NV10_SUPPORTED_DRAWINGFUNCTIONS || + state->drawingflags & ~NV10_SUPPORTED_DRAWINGFLAGS) + return; + + state->accel |= NV10_SUPPORTED_DRAWINGFUNCTIONS; + } +} + +static void nv20CheckState( void *drv, void *dev, + CardState *state, DFBAccelerationMask accel ) +{ + CoreSurface *destination = state->destination; + CoreSurface *source = state->source; + + switch (destination->config.format) { + case DSPF_A8: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + if (DFB_BLITTING_FUNCTION( accel )) { + if (state->blittingflags != DSBLIT_NOFX || + source->config.format != destination->config.format) + return; + } else { + if (state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (DFB_BLITTING_FUNCTION( accel )) { + if (accel & ~(DFXL_BLIT | DFXL_STRETCHBLIT) || + state->blittingflags != DSBLIT_NOFX || + source->config.format != destination->config.format) + return; + } else { + if (accel & (DFXL_FILLTRIANGLE | DFXL_DRAWLINE) || + state->drawingflags != DSDRAW_NOFX) + return; + } + break; + + default: + return; + } + + if (DFB_BLITTING_FUNCTION( accel )) { + /* check unsupported blitting functions/flags */ + if (accel & ~NV20_SUPPORTED_BLITTINGFUNCTIONS || + state->blittingflags & ~NV20_SUPPORTED_BLITTINGFLAGS) + return; + + if (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL) { + if (state->blittingflags & DSBLIT_MODULATE_COLOR) { + if (source->config.format == DSPF_ARGB && state->src_blend != DSBF_ONE) + return; + } + + if (state->src_blend != DSBF_ONE && + state->src_blend != DSBF_SRCALPHA) + return; + + if (state->dst_blend != DSBF_INVSRCALPHA) + return; + } + + if (state->render_options & DSRO_MATRIX && + (state->matrix[0] < 0 || state->matrix[1] || + state->matrix[3] || state->matrix[4] < 0)) + return; + + switch (source->config.format) { + case DSPF_A8: + /*if (state->src.buffer->policy == CSP_SYSTEMONLY) + return;*/ + break; + + case DSPF_LUT8: + case DSPF_ALUT44: + if (destination->config.format != source->config.format || + /*state->src.buffer->policy == CSP_SYSTEMONLY ||*/ + !dfb_palette_equal( source->palette, + destination->palette )) + return; + break; + + case DSPF_RGB332: + if (destination->config.format != source->config.format /*|| + state->src.buffer->policy == CSP_SYSTEMONLY*/) + return; + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + /* disable host-to-video blit for simple blits */ + /*if (state->src.buffer->policy == CSP_SYSTEMONLY && + accel == DFXL_BLIT && !state->blittingflags && + source->config.format == destination->config.format) + return;*/ + break; + + case DSPF_YUY2: + case DSPF_UYVY: + /*if (state->src.buffer->policy == CSP_SYSTEMONLY) + return;*/ + break; + + default: + return; + } + + state->accel |= accel; + } + else { + /* check unsupported drawing flags */ + if (accel & ~NV20_SUPPORTED_DRAWINGFUNCTIONS || + state->drawingflags & ~NV20_SUPPORTED_DRAWINGFLAGS) + return; + + if (state->drawingflags & DSDRAW_BLEND && + state->src_blend != DSBF_SRCALPHA && + state->dst_blend != DSBF_INVSRCALPHA) + return; + + state->accel |= NV20_SUPPORTED_DRAWINGFUNCTIONS; + } +} + +static void nv30CheckState( void *drv, void *dev, + CardState *state, DFBAccelerationMask accel ) +{ + CoreSurface *destination = state->destination; + CoreSurface *source = state->source; + + switch (destination->config.format) { + case DSPF_A8: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + if (DFB_DRAWING_FUNCTION( accel ) && + state->drawingflags != DSDRAW_NOFX) + return; + break; + + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + break; + + case DSPF_YUY2: + case DSPF_UYVY: + if (accel & (DFXL_FILLTRIANGLE | DFXL_DRAWLINE) || + state->drawingflags != DSDRAW_NOFX) + return; + break; + + default: + return; + } + + if (DFB_BLITTING_FUNCTION( accel )) { + /* check unsupported blitting functions/flags */ + if (accel & ~NV30_SUPPORTED_BLITTINGFUNCTIONS || + state->blittingflags & ~NV30_SUPPORTED_BLITTINGFLAGS) + return; + + if (state->render_options & DSRO_MATRIX && + (state->matrix[0] != 0x10000 || state->matrix[1] || + state->matrix[3] || state->matrix[4] != 0x10000)) + return; + + switch (source->config.format) { + case DSPF_LUT8: + case DSPF_ALUT44: + if (!dfb_palette_equal( source->palette, + destination->palette )) + return; + case DSPF_A8: + case DSPF_RGB332: + case DSPF_RGB555: + case DSPF_ARGB1555: + case DSPF_RGB16: + case DSPF_RGB32: + case DSPF_ARGB: + case DSPF_YUY2: + case DSPF_UYVY: + if (/*state->src.buffer->policy == CSP_SYSTEMONLY ||*/ + source->config.format != destination->config.format) + return; + break; + + default: + return; + } + + state->accel |= accel; + } + else { + /* check unsupported drawing flags */ + if (accel & ~NV30_SUPPORTED_DRAWINGFUNCTIONS || + state->drawingflags & ~NV30_SUPPORTED_DRAWINGFLAGS) + return; + + if (state->drawingflags & DSDRAW_BLEND && + state->src_blend != DSBF_SRCALPHA && + state->dst_blend != DSBF_INVSRCALPHA) + return; + + state->accel |= NV30_SUPPORTED_DRAWINGFUNCTIONS; + } +} + +#define M_IDENTITY(m) ((m)[0] == 0x10000 && (m)[1] == 0 && (m)[2] == 0 && \ + (m)[3] == 0 && (m)[4] == 0x10000 && (m)[5] == 0) + +static void nv4SetState( void *drv, void *dev, + GraphicsDeviceFuncs *funcs, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + nvdev->set &= ~state->mod_hw; + if (state->mod_hw & SMF_COLOR) + nvdev->set &= ~(SMF_DRAWING_COLOR | SMF_BLITTING_COLOR); + + nv_set_destination( nvdrv, nvdev, state ); + nv_set_clip( nvdrv, nvdev, state ); + + if (state->render_options & DSRO_MATRIX && !M_IDENTITY(state->matrix)) + nvdev->matrix = state->matrix; + else + nvdev->matrix = NULL; + + switch (accel) { + case DFXL_FILLRECTANGLE: + case DFXL_FILLTRIANGLE: + case DFXL_DRAWRECTANGLE: + case DFXL_DRAWLINE: + nv_set_drawing_color( nvdrv, nvdev, state ); + if (state->drawingflags & DSDRAW_BLEND) + nv_set_blend_function( nvdrv, nvdev, state ); + nv_set_drawingflags( nvdrv, nvdev, state ); + + if ((state->drawingflags & DSDRAW_BLEND || nvdev->matrix) && nvdev->enabled_3d) { + nvdev->state3d[0].modified = true; + + funcs->FillRectangle = nvFillRectangle3D; + funcs->FillTriangle = nvFillTriangle3D; + funcs->DrawRectangle = nvDrawRectangle3D; + funcs->DrawLine = nvDrawLine3D; + } else { + funcs->FillRectangle = nvFillRectangle2D; + funcs->FillTriangle = nvFillTriangle2D; + funcs->DrawRectangle = nvDrawRectangle2D; + funcs->DrawLine = nvDrawLine2D; + } + + state->set = DFXL_FILLRECTANGLE | + DFXL_FILLTRIANGLE | + DFXL_DRAWRECTANGLE | + DFXL_DRAWLINE; + break; + + case DFXL_BLIT: + case DFXL_STRETCHBLIT: + case DFXL_TEXTRIANGLES: + nv_set_source( nvdrv, nvdev, state ); + + if (state->blittingflags & DSBLIT_MODULATE_ALPHA) { + nv_set_blend_function( nvdrv, nvdev, state ); + nv_set_blitting_color( nvdrv, nvdev, state ); + } + + nv_set_blittingflags( nvdrv, nvdev, state ); + + if (accel == DFXL_TEXTRIANGLES) { + if (nvdev->src_texture != state->src.buffer) + nvdev->set &= ~SMF_SOURCE_TEXTURE; + + nvdev->src_texture = state->src.buffer; + nvdev->state3d[1].modified = true; + + state->set = DFXL_TEXTRIANGLES; + } else { + state->set = DFXL_BLIT | + DFXL_STRETCHBLIT; + } + break; + + default: + D_BUG( "unexpected drawing/blitting function" ); + break; + } + + state->mod_hw = 0; +} + +static void nv5SetState( void *drv, void *dev, + GraphicsDeviceFuncs *funcs, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + nvdev->set &= ~state->mod_hw; + if (state->mod_hw & SMF_COLOR) + nvdev->set &= ~(SMF_DRAWING_COLOR | SMF_BLITTING_COLOR); + + nv_set_destination( nvdrv, nvdev, state ); + nv_set_clip( nvdrv, nvdev, state ); + + if (state->render_options & DSRO_MATRIX && !M_IDENTITY(state->matrix)) + nvdev->matrix = state->matrix; + else + nvdev->matrix = NULL; + + switch (accel) { + case DFXL_FILLRECTANGLE: + case DFXL_FILLTRIANGLE: + case DFXL_DRAWRECTANGLE: + case DFXL_DRAWLINE: + nv_set_drawing_color( nvdrv, nvdev, state ); + if (state->drawingflags & DSDRAW_BLEND) + nv_set_blend_function( nvdrv, nvdev, state ); + nv_set_drawingflags( nvdrv, nvdev, state ); + + if ((state->drawingflags & DSDRAW_BLEND || nvdev->matrix) && nvdev->enabled_3d) { + nvdev->state3d[0].modified = true; + + funcs->FillRectangle = nvFillRectangle3D; + funcs->FillTriangle = nvFillTriangle3D; + funcs->DrawRectangle = nvDrawRectangle3D; + funcs->DrawLine = nvDrawLine3D; + } else { + funcs->FillRectangle = nvFillRectangle2D; + funcs->FillTriangle = nvFillTriangle2D; + funcs->DrawRectangle = nvDrawRectangle2D; + funcs->DrawLine = nvDrawLine2D; + } + + state->set = DFXL_FILLRECTANGLE | + DFXL_FILLTRIANGLE | + DFXL_DRAWRECTANGLE | + DFXL_DRAWLINE; + break; + + case DFXL_BLIT: + case DFXL_STRETCHBLIT: + case DFXL_TEXTRIANGLES: + nv_set_source( nvdrv, nvdev, state ); + + if (state->blittingflags & DSBLIT_MODULATE) { + nv_set_blend_function( nvdrv, nvdev, state ); + nv_set_blitting_color( nvdrv, nvdev, state ); + } + + nv_set_blittingflags( nvdrv, nvdev, state ); + + if (accel == DFXL_TEXTRIANGLES) { + if (nvdev->src_texture != state->src.buffer) + nvdev->set &= ~SMF_SOURCE_TEXTURE; + + nvdev->src_texture = state->src.buffer; + nvdev->state3d[1].modified = true; + + state->set = DFXL_TEXTRIANGLES; + } else { + if (nvdev->src_system) { + funcs->Blit = nvBlitFromCPU; + funcs->StretchBlit = nvStretchBlitFromCPU; + } else { + funcs->Blit = nvBlit; + funcs->StretchBlit = nvStretchBlit; + } + + state->set = DFXL_BLIT | + DFXL_STRETCHBLIT; + } + break; + + default: + D_BUG( "unexpected drawing/blitting function" ); + break; + } + + state->mod_hw = 0; +} + +static void nv10SetState( void *drv, void *dev, + GraphicsDeviceFuncs *funcs, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + nvdev->set &= ~state->mod_hw; + if (state->mod_hw & SMF_COLOR) + nvdev->set &= ~(SMF_DRAWING_COLOR | SMF_BLITTING_COLOR); + + nv_set_destination( nvdrv, nvdev, state ); + nv_set_clip( nvdrv, nvdev, state ); + + if (state->render_options & DSRO_MATRIX && !M_IDENTITY(state->matrix)) + nvdev->matrix = state->matrix; + else + nvdev->matrix = NULL; + + switch (accel) { + case DFXL_FILLRECTANGLE: + case DFXL_FILLTRIANGLE: + case DFXL_DRAWRECTANGLE: + case DFXL_DRAWLINE: + nv_set_drawing_color( nvdrv, nvdev, state ); + if (state->drawingflags & DSDRAW_BLEND) + nv_set_blend_function( nvdrv, nvdev, state ); + nv_set_drawingflags( nvdrv, nvdev, state ); + + if ((state->drawingflags & DSDRAW_BLEND || nvdev->matrix) && nvdev->enabled_3d) { + nvdev->state3d[0].modified = true; + + funcs->FillRectangle = nvFillRectangle3D; + funcs->FillTriangle = nvFillTriangle3D; + funcs->DrawRectangle = nvDrawRectangle3D; + funcs->DrawLine = nvDrawLine3D; + } else { + funcs->FillRectangle = nvFillRectangle2D; + funcs->FillTriangle = nvFillTriangle2D; + funcs->DrawRectangle = nvDrawRectangle2D; + funcs->DrawLine = nvDrawLine2D; + } + + state->set = DFXL_FILLRECTANGLE | + DFXL_FILLTRIANGLE | + DFXL_DRAWRECTANGLE | + DFXL_DRAWLINE; + break; + + case DFXL_BLIT: + case DFXL_STRETCHBLIT: + case DFXL_TEXTRIANGLES: + nv_set_source( nvdrv, nvdev, state ); + + if (state->blittingflags & DSBLIT_MODULATE) { + nv_set_blend_function( nvdrv, nvdev, state ); + nv_set_blitting_color( nvdrv, nvdev, state ); + } + + nv_set_blittingflags( nvdrv, nvdev, state ); + + if (accel == DFXL_TEXTRIANGLES) { + if (nvdev->src_texture != state->src.buffer) + nvdev->set &= ~SMF_SOURCE_TEXTURE; + + nvdev->src_texture = state->src.buffer; + nvdev->state3d[1].modified = true; + + state->set = DFXL_TEXTRIANGLES; + } else { + if (nvdev->src_system) { + funcs->Blit = nvBlitFromCPU; + funcs->StretchBlit = nvStretchBlitFromCPU; + } else { + funcs->Blit = nvBlit; + funcs->StretchBlit = nvStretchBlit; + } + + state->set = DFXL_BLIT | + DFXL_STRETCHBLIT; + } + break; + + default: + D_BUG( "unexpected drawing/blitting function" ); + break; + } + + state->mod_hw = 0; +} + +static void nv20SetState( void *drv, void *dev, + GraphicsDeviceFuncs *funcs, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + nvdev->set &= ~state->mod_hw; + if (state->mod_hw & SMF_COLOR) + nvdev->set &= ~(SMF_DRAWING_COLOR | SMF_BLITTING_COLOR); + + nv_set_destination( nvdrv, nvdev, state ); + nv_set_clip( nvdrv, nvdev, state ); + + if (state->render_options & DSRO_MATRIX && !M_IDENTITY(state->matrix)) + nvdev->matrix = state->matrix; + else + nvdev->matrix = NULL; + + switch (accel) { + case DFXL_FILLRECTANGLE: + case DFXL_FILLTRIANGLE: + case DFXL_DRAWRECTANGLE: + case DFXL_DRAWLINE: + nv_set_drawing_color( nvdrv, nvdev, state ); + nv_set_drawingflags( nvdrv, nvdev, state ); + + state->set = DFXL_FILLRECTANGLE | + DFXL_FILLTRIANGLE | + DFXL_DRAWRECTANGLE | + DFXL_DRAWLINE; + break; + + case DFXL_BLIT: + case DFXL_STRETCHBLIT: + nv_set_source( nvdrv, nvdev, state ); + + if (state->blittingflags & DSBLIT_MODULATE) { + if (state->modified & SMF_SRC_BLEND) + nvdev->set &= ~SMF_BLITTING_FLAGS; + nv_set_blitting_color( nvdrv, nvdev, state ); + } + + nv_set_blittingflags( nvdrv, nvdev, state ); + + if (nvdev->src_system) { + funcs->Blit = nvBlitFromCPU; + funcs->StretchBlit = nvStretchBlitFromCPU; + } + else { + if (DFB_BITS_PER_PIXEL(nvdev->dst_format) == 8) + nvdev->scaler_filter = SCALER_IN_FORMAT_ORIGIN_CORNER | + SCALER_IN_FORMAT_FILTER_NEAREST; + else + nvdev->scaler_filter = SCALER_IN_FORMAT_ORIGIN_CENTER | + SCALER_IN_FORMAT_FILTER_LINEAR; + + funcs->Blit = nvBlit; + funcs->StretchBlit = nvStretchBlit; + } + + state->set = DFXL_BLIT | + DFXL_STRETCHBLIT; + break; + + default: + D_BUG( "unexpected drawing/blitting function" ); + break; + } + + state->mod_hw = 0; +} + +static void nv30SetState( void *drv, void *dev, + GraphicsDeviceFuncs *funcs, + CardState *state, DFBAccelerationMask accel ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + nvdev->set &= ~state->mod_hw; + if (state->mod_hw & SMF_COLOR) + nvdev->set &= ~(SMF_DRAWING_COLOR | SMF_BLITTING_COLOR); + + nv_set_destination( nvdrv, nvdev, state ); + nv_set_clip( nvdrv, nvdev, state ); + + if (state->render_options & DSRO_MATRIX && !M_IDENTITY(state->matrix)) + nvdev->matrix = state->matrix; + else + nvdev->matrix = NULL; + + switch (accel) { + case DFXL_FILLRECTANGLE: + case DFXL_FILLTRIANGLE: + case DFXL_DRAWRECTANGLE: + case DFXL_DRAWLINE: + nv_set_drawing_color( nvdrv, nvdev, state ); + nv_set_drawingflags( nvdrv, nvdev, state ); + + state->set = DFXL_FILLRECTANGLE | + DFXL_FILLTRIANGLE | + DFXL_DRAWRECTANGLE | + DFXL_DRAWLINE; + break; + + case DFXL_BLIT: + nv_set_source( nvdrv, nvdev, state ); + + state->set = DFXL_BLIT; + break; + + default: + D_BUG( "unexpected drawing/blitting function" ); + break; + } + + state->mod_hw = 0; +} + + +/* exported symbols */ + +static int +driver_probe( CoreGraphicsDevice *device ) +{ + switch (dfb_gfxcard_get_accelerator( device )) { + case FB_ACCEL_NV4: + case FB_ACCEL_NV5: + case FB_ACCEL_NV_10: + case FB_ACCEL_NV_20: + case FB_ACCEL_NV_30: + case FB_ACCEL_NV_40: + 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, + "nVidia NV4/NV5/NV10/NV20/NV30 Driver" ); + + snprintf( info->vendor, + DFB_GRAPHICS_DRIVER_INFO_VENDOR_LENGTH, + "directfb.org" ); + + snprintf( info->url, + DFB_GRAPHICS_DRIVER_INFO_URL_LENGTH, + "http://www.directfb.org" ); + + snprintf( info->license, + DFB_GRAPHICS_DRIVER_INFO_LICENSE_LENGTH, + "LGPL" ); + + info->version.major = 0; + info->version.minor = 6; + + info->driver_data_size = sizeof(NVidiaDriverData); + info->device_data_size = sizeof(NVidiaDeviceData); +} + +static void +nv_find_architecture( NVidiaDriverData *nvdrv, u32 *ret_chip, u32 *ret_arch ) +{ + unsigned int vendor_id; + unsigned int device_id; + unsigned int arch = 0; + + device_id = nv_in32( nvdrv->mmio_base, 0x00 ) >> 16; /* id:rev */ + if (!device_id) { + dfb_system_get_deviceid( &vendor_id, &device_id ); + if (vendor_id != 0x10DE) { + D_ERROR( "DirectFB/NVidia: Could not detect device id!\n" + " -> Please, specify the bus location of" + " the card by using the 'busid' option.\n" ); + vendor_id = device_id = 0; + } + } + + switch (device_id & 0xFFF0) { + case 0x0020: /* Riva TNT/TNT2 */ + arch = (device_id == 0x0020) ? NV_ARCH_04 : NV_ARCH_05; + break; + case 0x0100: /* GeForce */ + case 0x0110: /* GeForce2 MX */ + case 0x0150: /* GeForce2 GTS/Ti/Ultra */ + case 0x0170: /* GeForce4 MX/Go */ + case 0x0180: /* GeForce4 MX/Go AGP8X */ + //case 0x01A0: /* GeForce2 Integrated GPU */ + //case 0x01F0: /* GeForce4 MX Integrated GPU */ + arch = NV_ARCH_10; + break; + case 0x0200: /* GeForce3 */ + case 0x0250: /* GeForce4 Ti */ + case 0x0280: /* GeForce4 Ti AGP8X */ + case 0x02A0: /* GeForce3 Integrated GPU (XBox) */ + arch = NV_ARCH_20; + break; + case 0x0300: /* GeForce FX 5800 */ + case 0x0310: /* GeForce FX 5600 */ + case 0x0320: /* GeForce FX 5200 */ + case 0x0330: /* GeForce FX 5900 */ + case 0x0340: /* GeForce FX 5700 */ + arch = NV_ARCH_30; + break; + default: + break; + } + + if (ret_chip) + *ret_chip = device_id; + if (ret_arch) + *ret_arch = arch; +} + +static DFBResult +driver_init_driver( CoreGraphicsDevice *device, + GraphicsDeviceFuncs *funcs, + void *driver_data, + void *device_data, + CoreDFB *core ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) device_data; + u32 arch = 0; + + nvdrv->device = device; + nvdrv->device_data = device_data; + + nvdrv->fb_base = (volatile void*) dfb_gfxcard_memory_virtual( device, 0 ); + nvdrv->agp_base = (volatile void*) dfb_gfxcard_auxmemory_virtual( device, 0 ); + + nvdrv->mmio_base = (volatile void*) dfb_gfxcard_map_mmio( device, 0, -1 ); + if (!nvdrv->mmio_base) + return DFB_IO; + + if (nvdev->use_dma) { + nvdrv->dma_base = nvdev->use_agp ? nvdrv->agp_base : nvdrv->fb_base; + nvdrv->dma_base += nvdev->dma_offset; + } + + funcs->AfterSetVar = nvAfterSetVar; + funcs->EngineReset = nvEngineReset; + funcs->EngineSync = nvEngineSync; + funcs->EmitCommands = nvEmitCommands; + funcs->FillRectangle = nvFillRectangle2D; // dynamic + funcs->FillTriangle = nvFillTriangle2D; // dynamic + funcs->DrawRectangle = nvDrawRectangle2D; // dynamic + funcs->DrawLine = nvDrawLine2D; // dynamic + funcs->Blit = nvBlit; // dynamic + + nv_find_architecture( nvdrv, NULL, &arch ); + + switch (arch) { + case NV_ARCH_04: + funcs->FlushTextureCache = nvFlushTextureCache; + funcs->CheckState = nv4CheckState; + funcs->SetState = nv4SetState; + funcs->StretchBlit = nvStretchBlit; + funcs->TextureTriangles = nvTextureTriangles; + break; + case NV_ARCH_05: + funcs->FlushTextureCache = nvFlushTextureCache; + funcs->CheckState = nv5CheckState; + funcs->SetState = nv5SetState; + funcs->StretchBlit = nvStretchBlit; + funcs->TextureTriangles = nvTextureTriangles; + break; + case NV_ARCH_10: + funcs->FlushTextureCache = nvFlushTextureCache; + funcs->CheckState = nv10CheckState; + funcs->SetState = nv10SetState; + funcs->StretchBlit = nvStretchBlit; + funcs->TextureTriangles = nvTextureTriangles; + break; + case NV_ARCH_20: + funcs->CheckState = nv20CheckState; + funcs->SetState = nv20SetState; + funcs->StretchBlit = nvStretchBlit; + break; + case NV_ARCH_30: + funcs->CheckState = nv30CheckState; + funcs->SetState = nv30SetState; + break; + default: + funcs->AfterSetVar = NULL; + funcs->EngineReset = NULL; + break; + } + + dfb_screens_hook_primary( device, driver_data, + &nvidiaPrimaryScreenFuncs, + &OldPrimaryScreenFuncs, + &OldPrimaryScreenDriverData ); + + dfb_layers_hook_primary( device, driver_data, + &nvidiaPrimaryLayerFuncs, + &OldPrimaryLayerFuncs, + &OldPrimaryLayerDriverData ); + + dfb_layers_register( dfb_screens_at( DSCID_PRIMARY ), + driver_data, &nvidiaOverlayFuncs ); + + return DFB_OK; +} + +static DFBResult +driver_init_device( CoreGraphicsDevice *device, + GraphicsDeviceInfo *device_info, + void *driver_data, + void *device_data ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) device_data; + int ram_total = dfb_system_videoram_length(); + int ram_used = dfb_gfxcard_memory_length(); + + nv_find_architecture( nvdrv, &nvdev->chip, &nvdev->arch ); + + snprintf( device_info->name, + DFB_GRAPHICS_DEVICE_INFO_NAME_LENGTH, + "NV%02X (%04x)", (nvdev->chip >> 4) & 0xFF, nvdev->chip ); + + snprintf( device_info->vendor, + DFB_GRAPHICS_DEVICE_INFO_VENDOR_LENGTH, "nVidia" ); + + switch (nvdev->arch) { + case NV_ARCH_04: + device_info->caps.flags = CCF_CLIPPING | CCF_RENDEROPTS; + device_info->caps.accel = NV4_SUPPORTED_DRAWINGFUNCTIONS | + NV4_SUPPORTED_BLITTINGFUNCTIONS; + device_info->caps.drawing = NV4_SUPPORTED_DRAWINGFLAGS; + device_info->caps.blitting = NV4_SUPPORTED_BLITTINGFLAGS; + break; + case NV_ARCH_05: + device_info->caps.flags = CCF_CLIPPING | CCF_RENDEROPTS /*| CCF_READSYSMEM*/; + device_info->caps.accel = NV5_SUPPORTED_DRAWINGFUNCTIONS | + NV5_SUPPORTED_BLITTINGFUNCTIONS; + device_info->caps.drawing = NV5_SUPPORTED_DRAWINGFLAGS; + device_info->caps.blitting = NV5_SUPPORTED_BLITTINGFLAGS; + break; + case NV_ARCH_10: + device_info->caps.flags = CCF_CLIPPING | CCF_RENDEROPTS /*| CCF_READSYSMEM*/; + device_info->caps.accel = NV10_SUPPORTED_DRAWINGFUNCTIONS | + NV10_SUPPORTED_BLITTINGFUNCTIONS; + device_info->caps.drawing = NV10_SUPPORTED_DRAWINGFLAGS; + device_info->caps.blitting = NV10_SUPPORTED_BLITTINGFLAGS; + break; + case NV_ARCH_20: + device_info->caps.flags = CCF_CLIPPING | CCF_RENDEROPTS /* | CCF_READSYSMEM*/; /* Crash reported when the flag is on. */ + device_info->caps.accel = NV20_SUPPORTED_DRAWINGFUNCTIONS | + NV20_SUPPORTED_BLITTINGFUNCTIONS; + device_info->caps.drawing = NV20_SUPPORTED_DRAWINGFLAGS; + device_info->caps.blitting = NV20_SUPPORTED_BLITTINGFLAGS; + break; + case NV_ARCH_30: + device_info->caps.flags = CCF_CLIPPING | CCF_RENDEROPTS; + device_info->caps.accel = NV30_SUPPORTED_DRAWINGFUNCTIONS | + NV30_SUPPORTED_BLITTINGFUNCTIONS; + device_info->caps.drawing = NV30_SUPPORTED_DRAWINGFLAGS; + device_info->caps.blitting = NV30_SUPPORTED_BLITTINGFLAGS; + break; + default: + device_info->caps.flags = 0; + device_info->caps.accel = 0; + device_info->caps.drawing = 0; + device_info->caps.blitting = 0; + break; + } + + device_info->limits.surface_byteoffset_alignment = 64; + device_info->limits.surface_pixelpitch_alignment = 32; + + dfb_config->pollvsync_after = 1; + + /* GeForce3 Intergrated GPU (XBox) */ + if (nvdev->chip == 0x02A0) { + nvdev->fb_offset = (long)nvdrv->fb_base & 0x0FFFFFFF; + ram_total += nvdev->fb_offset; + } + + nvdev->fb_size = 1 << direct_log2( ram_total ); + + /* skip if unsupported arch (NV40) */ + if (!nvdev->arch) + return DFB_OK; + + nvdev->agp_offset = dfb_gfxcard_auxmemory_physical( nvdrv->device, 0 ); + + if (dfb_config->dma) { + int offset = -1; + + if (dfb_gfxcard_auxmemory_length() >= 64*1024) { + offset = dfb_gfxcard_reserve_auxmemory( nvdrv->device, 64*1024 ); + if (offset < 0) { + D_ERROR( "DirectFB/NVidia: " + "couldn't reserve 64Kb of agp memory!\n" ); + } + else { + nvdev->use_agp = true; + nvdev->use_dma = true; + nvdev->dma_size = 64*1024; + nvdev->dma_offset = offset; + nvdrv->dma_base = nvdrv->agp_base + offset; + } + } + + if (offset < 0) { + int len; + + len = 32*1024 + ((ram_used - 32*1024) & 0x1FFFF); + offset = dfb_gfxcard_reserve_memory( nvdrv->device, len ); + if (offset < 0) { + D_ERROR( "DirectFB/NVidia: " + "couldn't reserve %d bytes of video memory!\n", len ); + } + else { + nvdev->use_dma = true; + nvdev->dma_size = 32*1024; + nvdev->dma_offset = offset; + nvdrv->dma_base = nvdrv->fb_base + offset; + + ram_used -= len; + } + } + + D_INFO ( "DirectFB/NVidia: DMA acceleration %s.\n", + nvdev->use_dma ? "enabled" : "disabled" ); + D_DEBUG( "DirectFB/NVidia: DMA target is %s.\n", + nvdev->use_agp ? "AGP" : "NVM" ); + } + + /* reserve memory for textures/color buffers */ + if (device_info->caps.accel & DFXL_TEXTRIANGLES) { + unsigned tex_size; + int len, offset; + + /* if we have more than 32MB of video memory, use a 1024x1024 texture */ + if (ram_used > (32 << 20)) + tex_size = 1024*1024; + /* if we have more than 16MB of video memory, use a 1024x512 texture */ + else if (ram_used > (16 << 20)) + tex_size = 1024*512; + /* otherwise use a 512x512 texture */ + else + tex_size = 512*512; + + len = tex_size*2 + 8; + len += (ram_used - len) & 0xFF; + offset = dfb_gfxcard_reserve_memory( nvdrv->device, len ); + + if (offset < 0) { + /* if video memory allocation failed, disable 3d acceleration */ + D_ERROR( "DirectFB/NVidia: " + "couldn't reserve %d bytes of video memory!\n", len ); + D_INFO( "DirectFB/NVidia: 3D acceleration disabled.\n" ); + device_info->caps.accel &= ~DFXL_TEXTRIANGLES; + } + else { + D_DEBUG( "DirectFB/NVidia: " + "reserved %d bytes for 3D buffers at offset 0x%08x.\n", + len, offset ); + + nvdev->enabled_3d = true; + nvdev->buf_offset[0] = offset + tex_size*2; // color + nvdev->buf_offset[1] = offset; // texture + nvdev->max_texture_size = tex_size; + } + } + + if (nvdev->enabled_3d) { + /* set default 3d state for drawing functions */ + nvdev->state3d[0].modified = true; + nvdev->state3d[0].colorkey = 0; + nvdev->state3d[0].offset = nvdev->fb_offset + nvdev->buf_offset[0]; + nvdev->state3d[0].format = TXTRI_FORMAT_CONTEXT_DMA_A | + TXTRI_FORMAT_ORIGIN_ZOH_CORNER | + TXTRI_FORMAT_ORIGIN_FOH_CORNER | + TXTRI_FORMAT_COLOR_R5G6B5 | + TXTRI_FORMAT_U_WRAP | + TXTRI_FORMAT_V_WRAP | + 0x00111000; // 2x2 + nvdev->state3d[0].filter = TXTRI_FILTER_TEXTUREMIN_NEAREST | + TXTRI_FILTER_TEXTUREMAG_NEAREST; + nvdev->state3d[0].blend = TXTRI_BLEND_TEXTUREMAPBLEND_MODULATEALPHA | + TXTRI_BLEND_OPERATION_MUX_TALPHAMSB | + TXTRI_BLEND_SHADEMODE_FLAT | + TXTRI_BLEND_SRCBLEND_ONE | + TXTRI_BLEND_DESTBLEND_ZERO; + nvdev->state3d[0].control = TXTRI_CONTROL_ALPHAFUNC_ALWAYS | + TXTRI_CONTROL_ORIGIN_CORNER | + TXTRI_CONTROL_ZFUNC_ALWAYS | + TXTRI_CONTROL_CULLMODE_NONE | + TXTRI_CONTROL_Z_FORMAT_FIXED; + nvdev->state3d[0].fog = 0; + + /* set default 3d state for blitting functions */ + nvdev->state3d[1].modified = true; + nvdev->state3d[1].colorkey = 0; + nvdev->state3d[1].offset = nvdev->fb_offset + nvdev->buf_offset[1]; + nvdev->state3d[1].format = TXTRI_FORMAT_CONTEXT_DMA_A | + TXTRI_FORMAT_ORIGIN_ZOH_CORNER | + TXTRI_FORMAT_ORIGIN_FOH_CORNER | + TXTRI_FORMAT_COLOR_R5G6B5 | + TXTRI_FORMAT_U_CLAMP | + TXTRI_FORMAT_V_CLAMP | + 0x00001000; + nvdev->state3d[1].filter = TXTRI_FILTER_TEXTUREMIN_LINEAR | + TXTRI_FILTER_TEXTUREMAG_LINEAR; + nvdev->state3d[1].blend = TXTRI_BLEND_TEXTUREMAPBLEND_COPY | + TXTRI_BLEND_OPERATION_MUX_TALPHAMSB | + TXTRI_BLEND_SHADEMODE_GOURAUD | + TXTRI_BLEND_TEXTUREPERSPECTIVE_ENABLE | + TXTRI_BLEND_SRCBLEND_ONE | + TXTRI_BLEND_DESTBLEND_ZERO; + nvdev->state3d[1].control = TXTRI_CONTROL_ALPHAFUNC_ALWAYS | + TXTRI_CONTROL_ORIGIN_CENTER | + TXTRI_CONTROL_ZFUNC_ALWAYS | + TXTRI_CONTROL_CULLMODE_NONE | + TXTRI_CONTROL_DITHER_ENABLE | + TXTRI_CONTROL_Z_FORMAT_FIXED; + nvdev->state3d[1].fog = 0; + + /* clear color buffer */ + memset( dfb_gfxcard_memory_virtual( device, + nvdev->buf_offset[0] ), 0xFF, 8 ); + } + + /* write dma objects configuration */ + nv_store_dma( nvdrv, OBJ_DMA_IN, ADDR_DMA_IN, 0x00, + DMA_FLAG_PAGE_TABLE | DMA_FLAG_PAGE_ENTRY_LINEAR | + DMA_FLAG_ACCESS_RDWR | DMA_FLAG_TARGET_NVM, + nvdev->fb_size, 0x00000000, DMA_FRAME_ACCESS_RDWR ); + + if (nvdev->use_dma) { + if (nvdev->use_agp) { + nv_store_dma( nvdrv, OBJ_DMA_OUT, ADDR_DMA_OUT, 0x02, + DMA_FLAG_PAGE_TABLE | DMA_FLAG_PAGE_ENTRY_LINEAR | + DMA_FLAG_ACCESS_RDWR | DMA_FLAG_TARGET_AGP, + nvdev->dma_size, nvdev->agp_offset+nvdev->dma_offset, + DMA_FRAME_ACCESS_RDWR ); + } + else { + nv_store_dma( nvdrv, OBJ_DMA_OUT, ADDR_DMA_OUT, 0x02, + DMA_FLAG_PAGE_TABLE | DMA_FLAG_PAGE_ENTRY_LINEAR | + DMA_FLAG_ACCESS_RDWR | DMA_FLAG_TARGET_NVM, + nvdev->dma_size, nvdev->fb_offset+nvdev->dma_offset, + DMA_FRAME_ACCESS_RDWR ); + } + } + + /* write graphics objects configuration */ + nv_store_object( nvdrv, OBJ_SURFACES2D, ADDR_SURFACES2D, 0x42, 0, 0, 0 ); + nv_store_object( nvdrv, OBJ_CLIP, ADDR_CLIP, 0x19, 0, 0, 0 ); + nv_store_object( nvdrv, OBJ_BETA1, ADDR_BETA1, 0x12, 0, 0, 0 ); + nv_store_object( nvdrv, OBJ_BETA4, ADDR_BETA4, 0x72, 0, 0, 0 ); + + nv_store_object( nvdrv, OBJ_RECTANGLE, ADDR_RECTANGLE, 0x5E, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_TRIANGLE, ADDR_TRIANGLE, 0x5D, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_LINE, ADDR_LINE, 0x5C, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH, ADDR_DMA_IN, ADDR_DMA_IN ); + + switch (nvdev->arch) { + case NV_ARCH_04: + nv_store_object( nvdrv, OBJ_SCREENBLT, ADDR_SCREENBLT, 0x1F, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SCALEDIMAGE, ADDR_SCALEDIMAGE, 0x37, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_COPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_TEXTRIANGLE, ADDR_TEXTRIANGLE, 0x54, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_COPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SURFACES3D, ADDR_SURFACES3D, 0x53, 0, 0, 0 ); + break; + + case NV_ARCH_05: + nv_store_object( nvdrv, OBJ_SCREENBLT, ADDR_SCREENBLT, 0x5F, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_IMAGEBLT, ADDR_IMAGEBLT, 0x65, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SCALEDIMAGE, ADDR_SCALEDIMAGE, 0x63, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_STRETCHEDIMAGE, ADDR_STRETCHEDIMAGE, 0x66, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_TEXTRIANGLE, ADDR_TEXTRIANGLE, 0x54, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SURFACES3D, ADDR_SURFACES3D, 0x53, 0, 0, 0 ); + break; + + case NV_ARCH_10: + nv_store_object( nvdrv, OBJ_SCREENBLT, ADDR_SCREENBLT, 0x5F, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_IMAGEBLT, ADDR_IMAGEBLT, 0x65, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SCALEDIMAGE, ADDR_SCALEDIMAGE, 0x89, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_STRETCHEDIMAGE, ADDR_STRETCHEDIMAGE, 0x66, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_TEXTRIANGLE, ADDR_TEXTRIANGLE, 0x94, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SURFACES3D, ADDR_SURFACES3D, 0x93, 0, 0, 0 ); + break; + + case NV_ARCH_20: + case NV_ARCH_30: + default: + nv_store_object( nvdrv, OBJ_SCREENBLT, ADDR_SCREENBLT, 0x9F, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_IMAGEBLT, ADDR_IMAGEBLT, 0x65, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SCALEDIMAGE, ADDR_SCALEDIMAGE, 0x89, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_STRETCHEDIMAGE, ADDR_STRETCHEDIMAGE, 0x66, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CONVERSION_DITHER | + CTX_FLAG_CTX_SURFACE0, ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_TEXTRIANGLE, ADDR_TEXTRIANGLE, 0x94, + CTX_FLAG_USER_CLIP | CTX_FLAG_PATCH_SRCCOPY | + CTX_FLAG_PATCH | CTX_FLAG_CTX_SURFACE0, + ADDR_DMA_IN, ADDR_DMA_IN ); + nv_store_object( nvdrv, OBJ_SURFACES3D, ADDR_SURFACES3D, 0x93, 0, 0, 0 ); + break; + } + + /* assign default objects to subchannels */ + nvdev->subchannel_object[SUBC_SURFACES2D] = OBJ_SURFACES2D; + nvdev->subchannel_object[SUBC_CLIP] = OBJ_CLIP; + nvdev->subchannel_object[SUBC_RECTANGLE] = OBJ_RECTANGLE; + nvdev->subchannel_object[SUBC_TRIANGLE] = OBJ_TRIANGLE; + nvdev->subchannel_object[SUBC_LINE] = OBJ_LINE; + nvdev->subchannel_object[SUBC_SCREENBLT] = OBJ_SCREENBLT; + nvdev->subchannel_object[SUBC_SCALEDIMAGE] = OBJ_SCALEDIMAGE; + nvdev->subchannel_object[SUBC_TEXTRIANGLE] = OBJ_TEXTRIANGLE; + + if (nvdev->arch == NV_ARCH_04) { + nvdev->drawing_operation = OPERATION_COPY; + nvdev->scaler_operation = OPERATION_COPY; + nvdev->scaler_filter = 0; + nvdev->system_operation = OPERATION_COPY; + } else { + nvdev->drawing_operation = OPERATION_SRCCOPY; + nvdev->scaler_operation = OPERATION_SRCCOPY; + nvdev->scaler_filter = SCALER_IN_FORMAT_ORIGIN_CENTER | + SCALER_IN_FORMAT_FILTER_LINEAR; + nvdev->system_operation = OPERATION_SRCCOPY; + } + + nvAfterSetVar( driver_data, device_data ); + + return DFB_OK; +} + +static void +driver_close_device( CoreGraphicsDevice *device, + void *driver_data, + void *device_data ) +{ + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) device_data; + + D_DEBUG( "DirectFB/NVidia: Performance Monitoring:\n" ); + D_DEBUG( "DirectFB/NVidia: %9d nv_wait* calls\n", + nvdev->waitfree_calls ); + D_DEBUG( "DirectFB/NVidia: %9d register writes\n", + nvdev->waitfree_sum ); + D_DEBUG( "DirectFB/NVidia: %9d FIFO/DMA wait cycles (depends on CPU)\n", + nvdev->free_waitcycles ); + D_DEBUG( "DirectFB/NVidia: %9d IDLE wait cycles (depends on CPU)\n", + nvdev->idle_waitcycles ); + D_DEBUG( "DirectFB/NVidia: %9d FIFO/DMA space cache hits (depends on CPU)\n", + nvdev->cache_hits ); + D_DEBUG( "DirectFB/NVidia: Conclusion:\n" ); + D_DEBUG( "DirectFB/NVidia: Average register writes/nv_wait* call:%.2f\n", + nvdev->waitfree_sum/(float)(nvdev->waitfree_calls ? : 1) ); + D_DEBUG( "DirectFB/NVidia: Average wait cycles/nv_wait* call: %.2f\n", + nvdev->free_waitcycles/(float)(nvdev->waitfree_calls ? : 1) ); + D_DEBUG( "DirectFB/NVidia: Average FIFO/DMA space cache hits: %02d%%\n", + (int)(100 * nvdev->cache_hits/ + (float)(nvdev->waitfree_calls ? : 1)) ); + + /* reset channel mode to PIO to avoid crash in rivafb */ + if (nvdev->use_dma) { + nvdev->use_dma = false; + nvAfterSetVar( driver_data, device_data ); + } +} + +static void +driver_close_driver( CoreGraphicsDevice *device, + void *driver_data ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + + dfb_gfxcard_unmap_mmio( device, nvdrv->mmio_base, -1 ); +} + diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia.h new file mode 100755 index 0000000..9b9062c --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia.h @@ -0,0 +1,238 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 __NVIDIA_H__ +#define __NVIDIA_H__ + +#include + +#include +#include +#include + + +/* + * Object's identifier + */ +enum { + OBJ_DMA_IN = 0x00800000, + OBJ_SURFACES2D = 0x00800001, + OBJ_SURFACES3D = 0x00800002, + OBJ_CLIP = 0x00800003, + OBJ_BETA1 = 0x00800004, + OBJ_BETA4 = 0x00800005, + OBJ_RECTANGLE = 0x00800010, + OBJ_TRIANGLE = 0x00800011, + OBJ_LINE = 0x00800012, + OBJ_SCREENBLT = 0x00800013, + OBJ_IMAGEBLT = 0x00800014, + OBJ_SCALEDIMAGE = 0x00800015, + OBJ_STRETCHEDIMAGE = 0x00800016, + OBJ_TEXTRIANGLE = 0x00800017, + OBJ_DMA_OUT = 0x00800018 +}; + +/* + * Object's offset into context table [PRAMIN + (address)*16] + */ +enum { + ADDR_DMA_IN = 0x1160, + ADDR_SURFACES2D = 0x1162, + ADDR_SURFACES3D = 0x1163, + ADDR_CLIP = 0x1164, + ADDR_BETA1 = 0x1165, + ADDR_BETA4 = 0x1166, + ADDR_RECTANGLE = 0x1167, + ADDR_TRIANGLE = 0x1168, + ADDR_LINE = 0x1169, + ADDR_SCREENBLT = 0x116A, + ADDR_IMAGEBLT = 0x116B, + ADDR_SCALEDIMAGE = 0x116C, + ADDR_STRETCHEDIMAGE = 0x116D, + ADDR_TEXTRIANGLE = 0x116E, + ADDR_DMA_OUT = 0x116F +}; + +/* + * Object's subchannel + */ +enum { + SUBC_SURFACES2D = 0, + SUBC_SURFACES3D = 0, + SUBC_BETA1 = 0, + SUBC_BETA4 = 0, + SUBC_CLIP = 1, + SUBC_RECTANGLE = 2, + SUBC_TRIANGLE = 3, + SUBC_LINE = 4, + SUBC_SCREENBLT = 5, + SUBC_IMAGEBLT = 5, + SUBC_SCALEDIMAGE = 6, + SUBC_STRETCHEDIMAGE = 6, + SUBC_TEXTRIANGLE = 7 +}; + + +#define SMF_DRAWING_COLOR (SMF_COLOR << 16) +#define SMF_BLITTING_COLOR (SMF_COLOR << 17) +#define SMF_SOURCE_TEXTURE (SMF_SOURCE << 1) + +typedef struct { + StateModificationFlags set; + + u32 fb_offset; + u32 fb_size; + u32 agp_offset; + + DFBSurfacePixelFormat dst_format; + u32 dst_offset; + u32 dst_pitch; + bool dst_422; + + DFBSurfacePixelFormat src_format; + u32 src_offset; + u8 *src_address; + u32 src_pitch; + u32 src_width; + u32 src_height; + bool src_system; + bool src_interlaced; + CoreSurfaceBufferLock *src_lock; + + DFBRectangle clip; + + u32 color2d; + u32 color3d; + + DFBSurfaceDrawingFlags drawingflags; + DFBSurfaceBlittingFlags blittingflags; + + const s32 *matrix; + + /* NVRectangle/NVTriangle/NVLine registers */ + u32 drawing_operation; // SetOperation + + /* NVScaledImage registers */ + u32 scaler_operation; // SetOperation + u32 scaler_format; // SetColorFormat + u32 scaler_filter; // SetImageInFormat + + /* NVImageBlt/NVStretchedImage registers */ + u32 system_operation; // SetOperation + u32 system_format; // SetColorFormat + + /* Remember value of NVBeta1 & NVBeta4 */ + bool beta1_set; + u32 beta1_val; + bool beta4_set; + u32 beta4_val; + + /* 3D stuff */ + bool enabled_3d; // 3d engine enabled + u32 buf_offset[2]; // reserved buffers + CoreSurfaceBuffer *src_texture; // current source for TextureTriangles + u32 max_texture_size; + + struct { + bool modified; + u32 colorkey; + u32 offset; + u32 format; + u32 filter; + u32 blend; + u32 control; + u32 fog; + } state3d[2]; // 0 => drawing | 1 => blitting + + /* Remember subchannels configuration */ + u32 subchannel_object[8]; + + /* Chipsets informations */ + u32 chip; + u32 arch; + + /* AGP control */ + bool use_agp; + int agp_key; + unsigned int agp_aper_base; + unsigned int agp_aper_size; + + /* DMA control */ + bool use_dma; + unsigned int dma_size; + unsigned int dma_offset; + unsigned int dma_max; + unsigned int dma_cur; + unsigned int dma_free; + unsigned int dma_put; + unsigned int dma_get; + volatile u32 *cmd_ptr; + + /* FIFO control */ + unsigned int fifo_free; + + /* for performance monitoring */ + unsigned int waitfree_sum; + unsigned int waitfree_calls; + unsigned int free_waitcycles; + unsigned int idle_waitcycles; + unsigned int cache_hits; +} NVidiaDeviceData; + + +enum { + NV_ARCH_04 = 0x04, + NV_ARCH_05 = 0x05, + NV_ARCH_10 = 0x10, + NV_ARCH_20 = 0x20, + NV_ARCH_30 = 0x30 +}; + +typedef struct { + CoreGraphicsDevice *device; + NVidiaDeviceData *device_data; + + volatile void *fb_base; + volatile void *agp_base; + volatile void *mmio_base; + volatile void *dma_base; +} NVidiaDriverData; + + +extern ScreenFuncs nvidiaPrimaryScreenFuncs; +extern ScreenFuncs OldPrimaryScreenFuncs; +extern void *OldPrimaryScreenDriverData; + +extern DisplayLayerFuncs nvidiaPrimaryLayerFuncs; +extern DisplayLayerFuncs OldPrimaryLayerFuncs; +extern void *OldPrimaryLayerDriverData; + +extern DisplayLayerFuncs nvidiaOverlayFuncs; + + +#endif /* __NVIDIA_H__ */ diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.c b/Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.c new file mode 100755 index 0000000..63e1728 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.c @@ -0,0 +1,549 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 + +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include +#include + +#include "nvidia.h" +#include "nvidia_regs.h" +#include "nvidia_accel.h" +#include "nvidia_2d.h" + + +static void +nv_copy32( volatile u32 *dst, u8 *src, int n ) +{ + u32 *D = (u32*) dst; + u32 *S = (u32*) src; + +#ifdef ARCH_X86 + __asm__ __volatile__( + "rep; movsl" + : "=&D" (D), "=&S" (S) + : "c" (n), "0" (D), "1" (S) + : "memory" ); +#else + do { + *D++ = *S++; + } while (--n); +#endif +} + +static void +nv_copy16( volatile u32 *dst, u8 *src, int n ) +{ + u32 *D = (u32*) dst; + u16 *S = (u16*) src; + +#ifdef ARCH_X86 + __asm__ __volatile__( + "rep; movsl" + : "=&D" (D), "=&S" (S) + : "c" (n/2), "0" (D), "1" (S) + : "memory" ); +#else + for (; n > 1; n -= 2) { + *D++ = *((u32*)S); + S += 2; + } +#endif + + if (n & 1) + *D = *S; +} + +static inline bool +nv_clip_source( DFBRectangle *rect, u32 width, u32 height ) +{ + if (rect->x >= width || rect->y >= height) + return false; + + if (rect->x < 0) { + rect->w += rect->x; + rect->x = 0; + } + if (rect->y < 0) { + rect->h += rect->y; + rect->y = 0; + } + + rect->w = MIN( rect->w, width - rect->x ); + rect->h = MIN( rect->h, height - rect->y ); + + return (rect->w > 0 && rect->h > 0); +} + + +#define M_TRANSFORM(x, y, retx, rety, m) { \ + s32 _x, _y; \ + _x = ((s64)(x) * (m)[0] + (y) * (m)[1] + (m)[2] + 0x8000) >> 16; \ + _y = ((s64)(x) * (m)[3] + (y) * (m)[4] + (m)[5] + 0x8000) >> 16; \ + retx = _x; \ + rety = _y; \ +} + + +bool nvFillRectangle2D( void *drv, void *dev, DFBRectangle *rect ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + if (nvdev->dst_422) { + rect->x /= 2; + rect->w = (rect->w+1) >> 1; + } + + if (nvdev->matrix) { + int x1 = rect->x, x2 = rect->x+rect->w; + int y1 = rect->y, y2 = rect->y+rect->h; + int x, y; + + nv_begin( SUBC_TRIANGLE, TRI_COLOR, 1 ); + nv_outr( nvdev->color2d ); + + nv_begin( SUBC_TRIANGLE, TRI_POINT0, 3 ); + M_TRANSFORM( x1, y1, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x2, y1, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x1, y2, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + + nv_begin( SUBC_TRIANGLE, TRI_POINT0, 3 ); + M_TRANSFORM( x2, y1, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x2, y2, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x1, y2, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + } + else { + nv_begin( SUBC_RECTANGLE, RECT_COLOR, 1 ); + nv_outr( nvdev->color2d ); + + nv_begin( SUBC_RECTANGLE, RECT_TOP_LEFT, 2 ); + nv_outr( (rect->y << 16) | (rect->x & 0xFFFF) ); + nv_outr( (rect->h << 16) | (rect->w & 0xFFFF) ); + } + + return true; +} + +bool nvFillTriangle2D( void *drv, void *dev, DFBTriangle *tri ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + if (nvdev->matrix) { + M_TRANSFORM( tri->x1, tri->y1, tri->x1, tri->y1, nvdev->matrix ); + M_TRANSFORM( tri->x2, tri->y3, tri->x2, tri->y2, nvdev->matrix ); + M_TRANSFORM( tri->x3, tri->y3, tri->x3, tri->y3, nvdev->matrix ); + } + + nv_begin( SUBC_TRIANGLE, TRI_COLOR, 1 ); + nv_outr( nvdev->color2d ); + + nv_begin( SUBC_TRIANGLE, TRI_POINT0, 3 ); + nv_outr( (tri->y1 << 16) | (tri->x1 & 0xFFFF) ); + nv_outr( (tri->y2 << 16) | (tri->x2 & 0xFFFF) ); + nv_outr( (tri->y3 << 16) | (tri->x3 & 0xFFFF) ); + + return true; +} + +bool nvDrawRectangle2D( void *drv, void *dev, DFBRectangle *rect ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + if (nvdev->dst_422) { + rect->x /= 2; + rect->w = (rect->w+1) >> 1; + } + + if (nvdev->matrix) { + int x1 = rect->x, x2 = rect->x+rect->w; + int y1 = rect->y, y2 = rect->y+rect->h; + int x, y; + + nv_begin( SUBC_LINE, LINE_COLOR, 1 ); + nv_outr( nvdev->color2d ); + + nv_begin( SUBC_LINE, LINE_POINT0, 8 ); + /* top */ + M_TRANSFORM( x1, y1, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x2, y1, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + /* right */ + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x2, y2, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + /* bottom */ + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x1, y2, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + /* left */ + nv_outr( (y << 16) | (x & 0xFFFF) ); + M_TRANSFORM( x1, y1, x, y, nvdev->matrix ); + nv_outr( (y << 16) | (x & 0xFFFF) ); + } + else { + nv_begin( SUBC_RECTANGLE, RECT_COLOR, 1 ); + nv_outr( nvdev->color2d ); + + nv_begin( SUBC_RECTANGLE, RECT_TOP_LEFT, 8 ); + /* top */ + nv_outr( (rect->y << 16) | (rect->x & 0xFFFF) ); + nv_outr( (1 << 16) | (rect->w & 0xFFFF) ); + /* bottom */ + nv_outr( ((rect->y + rect->h - 1) << 16) | (rect->x & 0xFFFF) ); + nv_outr( (1 << 16) | (rect->w & 0xFFFF) ); + /* left */ + nv_outr( ((rect->y + 1) << 16) | (rect->x & 0xFFFF) ); + nv_outr( ((rect->h - 2) << 16) | 1 ); + /* right */ + nv_outr( ((rect->y + 1) << 16) | ((rect->x + rect->w - 1) & 0xFFFF) ); + nv_outr( ((rect->h - 2) << 16) | 1 ); + } + + return true; +} + +bool nvDrawLine2D( void *drv, void *dev, DFBRegion *line ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + if (nvdev->matrix) { + M_TRANSFORM( line->x1, line->y1, line->x1, line->y1, nvdev->matrix ); + M_TRANSFORM( line->x2, line->y2, line->x2, line->y2, nvdev->matrix ); + } + + nv_begin( SUBC_LINE, LINE_COLOR, 1 ); + nv_outr( nvdev->color2d ); + + nv_begin( SUBC_LINE, LINE_POINT0, 2 ); + nv_outr( (line->y1 << 16) | (line->x1 & 0xFFFF) ); + nv_outr( (line->y2 << 16) | (line->x2 & 0xFFFF) ); + + return true; +} + +bool nvBlit( void *drv, void *dev, DFBRectangle *rect, int dx, int dy ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + + if (nvdev->blittingflags & DSBLIT_DEINTERLACE || nvdev->matrix) { + DFBRectangle dr = { dx, dy, rect->w, rect->h }; + return nvStretchBlit( drv, dev, rect, &dr ); + } + + if (nvdev->dst_422) { + dx /= 2; + rect->x /= 2; + rect->w = (rect->w+1) >> 1; + } + + if (nvdev->blittingflags || nvdev->src_format != nvdev->dst_format) { + DFBRectangle *clip = &nvdev->clip; + u32 src_width = (nvdev->src_width + 1) & ~1; + u32 src_height = (nvdev->src_height + 1) & ~1; + u32 filter = 0; + + if (nvdev->dst_422) + src_width >>= 1; + + if (nvdev->arch > NV_ARCH_04) + filter = SCALER_IN_FORMAT_ORIGIN_CORNER | + SCALER_IN_FORMAT_FILTER_NEAREST; + + nv_begin( SUBC_SCALEDIMAGE, SCALER_COLOR_FORMAT, 1 ); + nv_outr( nvdev->scaler_format ); + + nv_begin( SUBC_SCALEDIMAGE, SCALER_CLIP_POINT, 6 ); + nv_outr( (clip->y << 16) | (clip->x & 0xFFFF) ); + nv_outr( (clip->h << 16) | (clip->w & 0xFFFF) ); + nv_outr( (dy << 16) | (dx & 0xFFFF) ); + nv_outr( (rect->h << 16) | (rect->w & 0xFFFF) ); + nv_outr( 0x100000 ); + nv_outr( 0x100000 ); + + nv_begin( SUBC_SCALEDIMAGE, SCALER_IN_SIZE, 4 ); + nv_outr( (src_height << 16) | (src_width & 0xFFFF) ); + nv_outr( (nvdev->src_pitch & 0xFFFF) | filter ); + nv_outr( nvdev->src_offset ); + nv_outr( (rect->y << 20) | ((rect->x<<4) & 0xFFFF) ); + } + else { + nv_begin( SUBC_SCREENBLT, BLIT_TOP_LEFT_SRC, 3 ); + nv_outr( (rect->y << 16) | (rect->x & 0xFFFF) ); + nv_outr( (dy << 16) | (dx & 0xFFFF) ); + nv_outr( (rect->h << 16) | (rect->w & 0xFFFF) ); + } + + return true; +} + +bool nvBlitFromCPU( void *drv, void *dev, DFBRectangle *rect, int dx, int dy ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + u8 *src = nvdev->src_address; + u32 src_w; + u32 src_h; + int w, h, n; + + if (nvdev->blittingflags & DSBLIT_DEINTERLACE || nvdev->matrix) { + DFBRectangle dr = { dx, dy, rect->x, rect->y }; + return nvStretchBlitFromCPU( drv, dev, rect, &dr ); + } + + if (!nv_clip_source( rect, nvdev->src_width, nvdev->src_height )) + return true; + + src_w = (DFB_BYTES_PER_PIXEL(nvdev->src_format) == 2) + ? ((rect->w + 1) & ~1) : rect->w; + src_h = rect->h; + + nv_begin( SUBC_IMAGEBLT, IBLIT_COLOR_FORMAT, 1 ); + nv_outr( nvdev->system_format ); + + nv_begin( SUBC_IMAGEBLT, IBLIT_POINT, 3 ); + nv_outr( (dy << 16) | (dx & 0xFFFF) ); + nv_outr( (rect->h << 16) | (rect->w & 0xFFFF) ); + nv_outr( (src_h << 16) | (src_w & 0xFFFF) ); + + n = nvdev->use_dma ? 256 : 128; + + switch (nvdev->src_format) { + case DSPF_ARGB1555: + case DSPF_RGB16: + src += rect->y * nvdev->src_pitch + rect->x * 2; + for (h = rect->h; h--;) { + u8 *s = src; + + for (w = rect->w; w >= n*2; w -= n*2) { + nv_begin( SUBC_IMAGEBLT, IBLIT_PIXEL0, n ); + direct_memcpy( (void*)nvdev->cmd_ptr, s, n*4 ); + s += n*4; + } + if (w > 0) { + nv_begin( SUBC_IMAGEBLT, IBLIT_PIXEL0, (w+1)>>1 ); + nv_copy16( nvdev->cmd_ptr, s, w ); + } + + src += nvdev->src_pitch; + } + break; + + default: + src += rect->y * nvdev->src_pitch + rect->x * 4; + for (h = rect->h; h--;) { + u8 *s = src; + + for (w = rect->w; w >= n; w -= n) { + nv_begin( SUBC_IMAGEBLT, IBLIT_PIXEL0, n ); + direct_memcpy( (void*)nvdev->cmd_ptr, s, n*4 ); + s += n*4; + } + if (w > 0) { + nv_begin( SUBC_IMAGEBLT, IBLIT_PIXEL0, w ); + nv_copy32( nvdev->cmd_ptr, s, w ); + } + + src += nvdev->src_pitch; + } + break; + } + + return true; +} + +bool nvStretchBlit( void *drv, void *dev, DFBRectangle *sr, DFBRectangle *dr ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + DFBRectangle *cr = &nvdev->clip; + u32 src_width = (nvdev->src_width + 1) & ~1; + u32 src_height = (nvdev->src_height + 1) & ~1; + + if (nvdev->dst_422) { + sr->x /= 2; + sr->w = (sr->w+1) >> 1; + dr->x /= 2; + dr->w = (dr->w+1) >> 1; + src_width >>= 1; + } + + if (nvdev->blittingflags & DSBLIT_DEINTERLACE) { + sr->y /= 2; + sr->h = (sr->h+1) / 2; + } + + if (nvdev->matrix) { + int x1, y1, x2, y2; + + if (!nvdev->matrix[0] || !nvdev->matrix[4]) + return true; + + M_TRANSFORM( dr->x, dr->y, x1, y1, nvdev->matrix ); + M_TRANSFORM( dr->x+dr->w, dr->y+dr->h, x2, y2, nvdev->matrix ); + + dr->x = x1; dr->w = x2-x1; + dr->y = y1; dr->h = y2-y1; + } + + nv_begin( SUBC_SCALEDIMAGE, SCALER_COLOR_FORMAT, 1 ); + nv_outr( nvdev->scaler_format ); + + nv_begin( SUBC_SCALEDIMAGE, SCALER_CLIP_POINT, 6 ); + nv_outr( (cr->y << 16) | (cr->x & 0xFFFF) ); + nv_outr( (cr->h << 16) | (cr->w & 0xFFFF) ); + nv_outr( (dr->y << 16) | (dr->x & 0xFFFF) ); + nv_outr( (dr->h << 16) | (dr->w & 0xFFFF) ); + nv_outr( (sr->w << 20) / dr->w ); + nv_outr( (sr->h << 20) / dr->h ); + + nv_begin( SUBC_SCALEDIMAGE, SCALER_IN_SIZE, 4 ); + nv_outr( (src_height << 16) | (src_width & 0xFFFF) ); + nv_outr( (nvdev->src_pitch & 0xFFFF) | nvdev->scaler_filter ); + nv_outr( nvdev->src_offset ); + nv_outr( (sr->y << 20) | ((sr->x << 4) & 0xFFFF) ); + + return true; +} + +bool nvStretchBlitFromCPU( void *drv, void *dev, + DFBRectangle *sr, DFBRectangle *dr ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + DFBRectangle *cr = &nvdev->clip; + u8 *src = nvdev->src_address; + u32 src_w; + u32 src_h; + int w, h, n; + + if (!nv_clip_source( sr, nvdev->src_width, nvdev->src_height )) + return true; + + if (nvdev->blittingflags & DSBLIT_DEINTERLACE) { + sr->y /= 2; + sr->h /= 2; + } + + if (nvdev->matrix) { + int x1, y1, x2, y2; + + if (!nvdev->matrix[0] || !nvdev->matrix[4]) + return true; + + M_TRANSFORM( dr->x, dr->y, x1, y1, nvdev->matrix ); + M_TRANSFORM( dr->x+dr->w, dr->y+dr->h, x2, y2, nvdev->matrix ); + + dr->x = x1; dr->w = x2-x1; + dr->y = y1; dr->h = y2-y1; + } + + src_w = (DFB_BYTES_PER_PIXEL(nvdev->src_format) == 2) + ? ((sr->w + 1) & ~1) : sr->w; + src_h = sr->h; + + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_COLOR_FORMAT, 1 ); + nv_outr( nvdev->system_format ); + + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_IN_SIZE, 6 ); + nv_outr( (src_h << 16) | (src_w & 0xFFFF) ); + nv_outr( (dr->w << 20) / src_w ); + nv_outr( (dr->h << 20) / src_h ); + nv_outr( (cr->y << 16) | (cr->x & 0xFFFF) ); + nv_outr( (cr->h << 16) | (cr->w & 0xFFFF) ); + nv_outr( (dr->y << 20) | ((dr->x<<4) & 0xFFFF) ); + + n = nvdev->use_dma ? 256 : 128; + + switch (nvdev->src_format) { + case DSPF_ARGB1555: + case DSPF_RGB16: + src += sr->y * nvdev->src_pitch + sr->x * 2; + for (h = sr->h; h--;) { + u8 *s = src; + + for (w = sr->w; w >= n*2; w -= n*2) { + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_PIXEL0, n ); + direct_memcpy( (void*)nvdev->cmd_ptr, s, n*4 ); + s += n*4; + } + if (w > 0) { + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_PIXEL0, (w+1)>>1 ); + nv_copy16( nvdev->cmd_ptr, s, w ); + } + + src += nvdev->src_pitch; + } + break; + + default: + src += sr->y * nvdev->src_pitch + sr->x * 4; + for (h = sr->h; h--;) { + u8 *s= src; + + for (w = sr->w; w >= n; w -= n) { + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_PIXEL0, n ); + direct_memcpy( (void*)nvdev->cmd_ptr, s, n*4 ); + s += n*4; + } + if (w > 0) { + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_PIXEL0, w ); + nv_copy32( nvdev->cmd_ptr, s, w ); + } + + src += nvdev->src_pitch; + } + break; + } + + return true; +} + diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.h new file mode 100755 index 0000000..b195aef --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_2d.h @@ -0,0 +1,48 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 __NVIDIA_2D_H__ +#define __NVIDIA_2D_H__ + +bool nvFillRectangle2D( void *drv, void *dev, DFBRectangle *rect ); + +bool nvFillTriangle2D( void *drv, void *dev, DFBTriangle *tri ); + +bool nvDrawRectangle2D( void *drv, void *dev, DFBRectangle *rect ); + +bool nvDrawLine2D( void *drv, void *dev, DFBRegion *line ); + +bool nvBlit( void *drv, void *dev, DFBRectangle *rect, int dx, int dy ); + +bool nvBlitFromCPU( void *drv, void *dev, DFBRectangle *rect, int dx, int dy ); + +bool nvStretchBlit( void *drv, void *dev, DFBRectangle *sr, DFBRectangle *dr ); + +bool nvStretchBlitFromCPU( void *drv, void *dev, DFBRectangle *sr, DFBRectangle *dr ); + +#endif /* __NVIDIA_2D_H__ */ diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.c b/Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.c new file mode 100755 index 0000000..ae8dffc --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.c @@ -0,0 +1,522 @@ +/* + Copyright (C) 2004-2006 Claudio Ciccani + + 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 + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include "nvidia.h" +#include "nvidia_regs.h" +#include "nvidia_accel.h" +#include "nvidia_3d.h" + + +static __inline__ u32 +f2d( float f ) { + union { + float f; + u32 d; + } t; + t.f = f; + return t.d; +} + +#define nv_setstate3d( state3d ) { \ + if ((state3d)->modified) { \ + nv_begin( SUBC_TEXTRIANGLE, TXTRI_COLOR_KEY, 7 ); \ + nv_outr( (state3d)->colorkey ); \ + nv_outr( (state3d)->offset ); \ + nv_outr( (state3d)->format ); \ + nv_outr( (state3d)->filter ); \ + nv_outr( (state3d)->blend ); \ + nv_outr( (state3d)->control ); \ + nv_outr( (state3d)->fog ); \ + \ + (state3d)->modified = false; \ + } \ +} + +#define nv_putvertex( i, x, y, z, w, col, spc, s, t ) { \ + nv_begin( SUBC_TEXTRIANGLE, TXTRI_VERTEX0+(i)*32, 8 ); \ + nv_outr( f2d( x ) ); \ + nv_outr( f2d( y ) ); \ + nv_outr( f2d( z ) ); \ + nv_outr( f2d( w ) ); \ + nv_outr( col ); \ + nv_outr( spc ); \ + nv_outr( f2d( s ) ); \ + nv_outr( f2d( t ) ); \ +} + +#define nv_emit_vertices( i, v0, v1, v2, v3, v4, v5, v6, v7 ) { \ + nv_begin( SUBC_TEXTRIANGLE, TXTRI_PRIMITIVE0+(i)*4, 1 ); \ + nv_outr( ((v7) << 28) | ((v6) << 24) | \ + ((v5) << 20) | ((v4) << 16) | \ + ((v3) << 12) | ((v2) << 8) | \ + ((v1) << 4) | (v0) ); \ +} + + +static void nv_load_texture( NVidiaDriverData *nvdrv, NVidiaDeviceData *nvdev ); + + +#define M_TRANSFORM(x, y, retx, rety, m) { \ + float _x, _y; \ + _x = ((x) * (m)[0] + (y) * (m)[1] + (m)[2]) / 65536.f; \ + _y = ((x) * (m)[3] + (y) * (m)[4] + (m)[5]) / 65536.f; \ + retx = _x; \ + rety = _y; \ +} + + +bool nvFillRectangle3D( void *drv, void *dev, DFBRectangle *rect ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + float x1, y1; + float x2, y2; + + x1 = rect->x; x2 = rect->x+rect->w; + y1 = rect->y; y2 = rect->y+rect->h; + + nv_setstate3d( &nvdev->state3d[0] ); + + if (nvdev->matrix) { + float x, y; + + M_TRANSFORM( x1, y1, x, y, nvdev->matrix ); + nv_putvertex( 0, x, y, 0, 1, nvdev->color3d, 0, 0, 0 ); + M_TRANSFORM( x2, y1, x, y, nvdev->matrix ); + nv_putvertex( 1, x, y, 0, 1, nvdev->color3d, 0, 0, 0 ); + M_TRANSFORM( x2, y2, x, y, nvdev->matrix ); + nv_putvertex( 2, x, y, 0, 1, nvdev->color3d, 0, 0, 0 ); + M_TRANSFORM( x1, y2, x, y, nvdev->matrix ); + nv_putvertex( 3, x, y, 0, 1, nvdev->color3d, 0, 0, 0 ); + } + else { + nv_putvertex( 0, x1, y1, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 1, x2, y1, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 2, x2, y2, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 3, x1, y2, 0, 1, nvdev->color3d, 0, 0, 0 ); + } + + nv_emit_vertices( 0, 0, 1, 2, 0, 2, 3, 0, 0 ); + + return true; +} + +bool nvFillTriangle3D( void *drv, void *dev, DFBTriangle *tri ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + float x1, y1; + float x2, y2; + float x3, y3; + + x1 = tri->x1; x2 = tri->x2; x3 = tri->x3; + y1 = tri->y1; y2 = tri->y2; y3 = tri->y3; + if (nvdev->matrix) { + M_TRANSFORM( x1, y1, x1, y1, nvdev->matrix ); + M_TRANSFORM( x2, y2, x2, y2, nvdev->matrix ); + M_TRANSFORM( x3, y3, x3, y3, nvdev->matrix ); + } + + nv_setstate3d( &nvdev->state3d[0] ); + + nv_putvertex( 0, x1, y1, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 1, x2, y2, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 2, x3, y3, 0, 1, nvdev->color3d, 0, 0, 0 ); + + nv_emit_vertices( 0, 0, 1, 2, 0, 0, 0, 0, 0 ); + + return true; +} + +bool nvDrawRectangle3D( void *drv, void *dev, DFBRectangle *rect ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + DFBRegion r[4]; + int i; + + if (nvdev->matrix) { + DFBRegion line; + + /* top */ + line = (DFBRegion) { rect->x, rect->y, rect->x+rect->w, rect->y }; + nvDrawLine3D( drv, dev, &line ); + /* right */ + line = (DFBRegion) { rect->x+rect->w, rect->y, rect->x+rect->w, rect->y+rect->h }; + nvDrawLine3D( drv, dev, &line ); + /* bottom */ + line = (DFBRegion) { rect->x, rect->y+rect->h, rect->x+rect->w, rect->y+rect->h }; + nvDrawLine3D( drv, dev, &line ); + /* left */ + line = (DFBRegion) { rect->x, rect->y, rect->x, rect->y+rect->h }; + nvDrawLine3D( drv, dev, &line ); + + return true; + } + + /* top */ + r[0].x1 = rect->x; + r[0].y1 = rect->y; + r[0].x2 = rect->x + rect->w; + r[0].y2 = rect->y + 1; + + /* right */ + r[1].x1 = rect->x + rect->w - 1; + r[1].y1 = rect->y + 1; + r[1].x2 = rect->x + rect->w; + r[1].y2 = rect->y + rect->h - 1; + + /* bottom */ + r[2].x1 = rect->x; + r[2].y1 = rect->y + rect->h - 1; + r[2].x2 = rect->x + rect->w; + r[2].y2 = rect->y + rect->h; + + /* left */ + r[3].x1 = rect->x; + r[3].y1 = rect->y + 1; + r[3].x2 = rect->x + 1; + r[3].y2 = rect->y + rect->h - 1; + + nv_setstate3d( &nvdev->state3d[0] ); + + for (i = 0; i < 4; i++) { + nv_putvertex( 0, r[i].x1, r[i].y1, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 1, r[i].x2, r[i].y1, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 2, r[i].x2, r[i].y2, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 3, r[i].x1, r[i].y2, 0, 1, nvdev->color3d, 0, 0, 0 ); + + nv_emit_vertices( 0, 0, 1, 2, 0, 2, 3, 0, 0 ); + } + + return true; +} + +bool nvDrawLine3D( void *drv, void *dev, DFBRegion *line ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + float xinc, yinc; + float x1, y1; + float x2, y2; + float dx, dy; + + x1 = line->x1; x2 = line->x2; + y1 = line->y1; y2 = line->y2; + if (nvdev->matrix) { + M_TRANSFORM( x1, y1, x1, y1, nvdev->matrix ); + M_TRANSFORM( x2, y2, x2, y2, nvdev->matrix ); + + dx = fabs(x2 - x1); + dy = fabs(y2 - y1); + } + else { + dx = abs(line->x2 - line->x1); + dy = abs(line->y2 - line->y1); + } + + if (dx > dy) { /* more horizontal */ + xinc = 0.0; + yinc = 0.5; + } else { /* more vertical */ + xinc = 0.5; + yinc = 0.0; + } + + nv_setstate3d( &nvdev->state3d[0] ); + + nv_putvertex( 0, x1 - xinc, y1 - yinc, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 1, x1 + xinc, y1 + yinc, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 2, x2 + xinc, y2 + yinc, 0, 1, nvdev->color3d, 0, 0, 0 ); + nv_putvertex( 3, x2 - xinc, y2 - yinc, 0, 1, nvdev->color3d, 0, 0, 0 ); + + nv_emit_vertices( 0, 2, 0, 1, 3, 0, 2, 0, 0 ); + + return true; +} + +bool nvTextureTriangles( void *drv, void *dev, DFBVertex *ve, + int num, DFBTriangleFormation formation ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) drv; + NVidiaDeviceData *nvdev = (NVidiaDeviceData*) dev; + float s_scale; + float t_scale; + int i; + + /* load source texture into texture buffer */ + nv_load_texture( nvdrv, nvdev ); + + s_scale = (float)nvdev->src_width / + (float)(1 << ((nvdev->state3d[1].format >> 16) & 0xF)); + t_scale = (float)nvdev->src_height / + (float)(1 << ((nvdev->state3d[1].format >> 20) & 0xF)); + + for (i = 0; i < num; i++) { + if (nvdev->matrix) + M_TRANSFORM( ve[i].x, ve[i].y, ve[i].x, ve[i].y, nvdev->matrix ); + ve[i].x += 0.5; + ve[i].y += 0.5; + ve[i].s *= s_scale; + ve[i].t *= t_scale; + } + + nv_setstate3d( &nvdev->state3d[1] ); + + switch (formation) { + case DTTF_LIST: + for (i = 0; i < num; i += 3) { + nv_putvertex( 0, ve[i].x, ve[i].y, ve[i].z, ve[i].w, + nvdev->color3d, 0, ve[i].s, ve[i].t ); + nv_putvertex( 1, ve[i+1].x, ve[i+1].y, ve[i+1].z, ve[i+1].w, + nvdev->color3d, 0, ve[i+1].s, ve[i+1].t ); + nv_putvertex( 2, ve[i+2].x, ve[i+2].y, ve[i+2].z, ve[i+2].w, + nvdev->color3d, 0, ve[i+2].s, ve[i+2].t ); + nv_emit_vertices( 0, 0, 1, 2, 0, 0, 0, 0, 0 ); + } + break; + + case DTTF_STRIP: + nv_putvertex( 0, ve[0].x, ve[0].y, ve[0].z, ve[0].w, + nvdev->color3d, 0, ve[0].s, ve[0].t ); + nv_putvertex( 1, ve[1].x, ve[1].y, ve[1].z, ve[1].w, + nvdev->color3d, 0, ve[1].s, ve[1].t ); + nv_putvertex( 2, ve[2].x, ve[2].y, ve[2].z, ve[2].w, + nvdev->color3d, 0, ve[2].s, ve[2].t ); + nv_emit_vertices( 0, 0, 1, 2, 0, 0, 0, 0, 0 ); + + for (i = 3; i < num; i++) { + nv_putvertex( 0, ve[i-2].x, ve[i-2].y, ve[i-2].z, ve[i-2].w, + nvdev->color3d, 0, ve[i-2].s, ve[i-2].t ); + nv_putvertex( 1, ve[i-1].x, ve[i-1].y, ve[i-1].z, ve[i-1].w, + nvdev->color3d, 0, ve[i-1].s, ve[i-1].t ); + nv_putvertex( 2, ve[i].x, ve[i].y, ve[i].z, ve[i].w, + nvdev->color3d, 0, ve[i].s, ve[i].t ); + nv_emit_vertices( 0, 0, 1, 2, 0, 0, 0, 0, 0 ); + } + break; + + case DTTF_FAN: + nv_putvertex( 0, ve[0].x, ve[0].y, ve[0].z, ve[0].w, + nvdev->color3d, 0, ve[0].s, ve[0].t ); + nv_putvertex( 1, ve[1].x, ve[1].y, ve[1].z, ve[1].w, + nvdev->color3d, 0, ve[1].s, ve[1].t ); + nv_putvertex( 2, ve[2].x, ve[2].y, ve[2].z, ve[2].w, + nvdev->color3d, 0, ve[2].s, ve[2].t ); + nv_emit_vertices( 0, 0, 1, 2, 0, 0, 0, 0, 0 ); + + for (i = 3; i < num; i++) { + nv_putvertex( 0, ve[0].x, ve[0].y, ve[0].z, ve[0].w, + nvdev->color3d, 0, ve[0].s, ve[0].t ); + nv_putvertex( 1, ve[i-1].x, ve[i-1].y, ve[i-1].z, ve[i-1].w, + nvdev->color3d, 0, ve[i-1].s, ve[i-1].t ); + nv_putvertex( 2, ve[i].x, ve[i].y, ve[i].z, ve[i].w, + nvdev->color3d, 0, ve[i].s, ve[i].t ); + nv_emit_vertices( 0, 0, 1, 2, 0, 0, 0, 0, 0 ); + } + break; + + default: + D_BUG( "unexpected triangle formation" ); + return false; + } + + return true; +} + +/* + * Surface to Texture conversion routines. + */ + +#define VINC 0xAAAAAAAC +#define VMASK 0x55555555 +#define UINC 0x55555558 +#define UMASK 0xAAAAAAAA + +static inline void +a8_to_tex( u32 *dst, u8 *src, int pitch, int width, int height ) +{ + u32 u, v; + int i; + + for (v = 0; height--; v = (v + VINC) & VMASK) { + for (i = 0, u = 0; i < width; i += 2, u = (u + UINC) & UMASK) { +#ifdef WORDS_BIGENDIAN + dst[(u|v)/4] = ((src[i+0] & 0xF0) << 24) | + ((src[i+1] & 0xF0) << 8) | + 0x0FFF0FFF; +#else + dst[(u|v)/4] = ((src[i+0] & 0xF0) << 8) | + ((src[i+1] & 0xF0) << 24) | + 0x0FFF0FFF; +#endif + } + + if (width & 1) { + u = (u + UINC) & UMASK; + dst[(u|v)/4] = ((src[width-1] & 0xF0) << 8) | 0x0FFF; + } + + src += pitch; + } +} + +static inline void +rgb16_to_tex( u32 *dst, u8 *src, int pitch, int width, int height ) +{ + u32 u, v; + int i; + + for (v = 0; height--; v = (v + VINC) & VMASK) { + for (i = 0, u = 0; i < width/2; i++, u = (u + UINC) & UMASK) + dst[(u|v)/4] = ((u32*) src)[i]; + + if (width & 1) { + u = (u + UINC) & UMASK; + dst[(u|v)/4] = ((u16*) src)[width-1]; + } + + src += pitch; + } +} + +static inline void +rgb32_to_tex( u32 *dst, u8 *src, int pitch, int width, int height ) +{ + u32 u, v; + int i; + + for (v = 0; height--; v = (v + VINC) & VMASK) { + for (i = 0, u = 0; i < width; i += 2, u = (u + UINC) & UMASK) { + register u32 pix0, pix1; + pix0 = ((u32*) src)[i]; + pix0 = RGB32_TO_RGB16( pix0 ); + pix1 = ((u32*) src)[i+1]; + pix1 = RGB32_TO_RGB16( pix1 ); +#ifdef WORDS_BIGENDIAN + dst[(u|v)/4] = (pix0 << 16) | pix1; +#else + dst[(u|v)/4] = pix0 | (pix1 << 16); +#endif + } + + if (width & 1) { + u = (u + UINC) & UMASK; + dst[(u|v)/4] = RGB32_TO_RGB16( ((u32*) src)[width-1] ); + } + + src += pitch; + } +} + +static inline void +argb_to_tex( u32 *dst, u8 *src, int pitch, int width, int height ) +{ + u32 u, v; + int i; + + for (v = 0; height--; v = (v + VINC) & VMASK) { + for (i = 0, u = 0; i < width; i += 2, u = (u + UINC) & UMASK) { + register u32 pix0, pix1; + pix0 = ((u32*) src)[i]; + pix0 = ARGB_TO_ARGB4444( pix0 ); + pix1 = ((u32*) src)[i+1]; + pix1 = ARGB_TO_ARGB4444( pix1 ); +#ifdef WORDS_BIGENDIAN + dst[(u|v)/4] = (pix0 << 16) | pix1; +#else + dst[(u|v)/4] = pix0 | (pix1 << 16); +#endif + } + + if (width & 1) { + u = (u + UINC) & UMASK; + dst[(u|v)/4] = ARGB_TO_ARGB4444( ((u32*) src)[width-1] ); + } + + src += pitch; + } +} + +static void nv_load_texture( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev ) +{ + CoreSurfaceBuffer *buffer = nvdev->src_texture; + u32 *dst; + + dst = dfb_gfxcard_memory_virtual( nvdrv->device, nvdev->buf_offset[1] ); + +#if 0 + if (nvdev->src_interlaced) { + if (surface->caps & DSCAPS_SEPARATED) { + if (surface->field) + field_offset = nvdev->src_height * src_pitch; + } else { + if (surface->field) + field_offset = src_pitch; + src_pitch *= 2; + } + } +#endif + + switch (buffer->format) { + case DSPF_A8: + a8_to_tex( dst, nvdev->src_lock->addr, nvdev->src_lock->pitch, + nvdev->src_width, nvdev->src_height ); + break; + case DSPF_ARGB1555: + case DSPF_RGB16: + rgb16_to_tex( dst, nvdev->src_lock->addr, nvdev->src_lock->pitch, + nvdev->src_width, nvdev->src_height ); + break; + case DSPF_RGB32: + rgb32_to_tex( dst, nvdev->src_lock->addr, nvdev->src_lock->pitch, + nvdev->src_width, nvdev->src_height ); + break; + case DSPF_ARGB: + argb_to_tex( dst, nvdev->src_lock->addr, nvdev->src_lock->pitch, + nvdev->src_width, nvdev->src_height ); + break; + default: + D_BUG( "unexpected pixelformat" ); + break; + } +} + diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.h new file mode 100755 index 0000000..ade71f7 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_3d.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2004-2006 Claudio Ciccani + + 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 __NVIDIA_3D_H__ +#define __NVIDIA_3D_H__ + + +bool nvFillRectangle3D( void *drv, void *dev, DFBRectangle *rect ); + +bool nvFillTriangle3D( void *drv, void *dev, DFBTriangle *tri ); + +bool nvDrawRectangle3D( void *drv, void *dev, DFBRectangle *rect ); + +bool nvDrawLine3D( void *drv, void *dev, DFBRegion *line ); + +bool nvTextureTriangles( void *drv, void *dev, DFBVertex *vertices, + int num, DFBTriangleFormation formation ); + + +#endif /* __NVIDIA_3D_H__ */ diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_accel.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia_accel.h new file mode 100755 index 0000000..2858947 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_accel.h @@ -0,0 +1,246 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 __NVIDIA_ACCEL_H__ +#define __NVIDIA_ACCEL_H__ + +#include + +#include "nvidia.h" +#include "nvidia_regs.h" + + +static __inline__ void +nv_out8( volatile void *mmioaddr, u32 reg, u8 value ) +{ + *((volatile u8*)(mmioaddr+reg)) = value; +} + +static __inline__ void +nv_out16( volatile void *mmioaddr, u32 reg, u16 value ) +{ + *((volatile u16*)(mmioaddr+reg)) = value; +} + +static __inline__ void +nv_out32( volatile void *mmioaddr, u32 reg, u32 value ) +{ + *((volatile u32*)(mmioaddr+reg)) = value; +} + +static __inline__ u8 +nv_in8( volatile void *mmioaddr, u32 reg ) +{ + return *((volatile u8*)(mmioaddr+reg)); +} + +static __inline__ u16 +nv_in16( volatile void *mmioaddr, u32 reg ) +{ + return *((volatile u16*)(mmioaddr+reg)); +} + +static __inline__ u32 +nv_in32( volatile void *mmioaddr, u32 reg ) +{ + return *((volatile u32*)(mmioaddr+reg)); +} + +static __inline__ void +nv_outcrtc( volatile void *mmioaddr, u8 reg, u8 value ) +{ + nv_out8( mmioaddr, PCIO_CRTC_INDEX, reg ); + nv_out8( mmioaddr, PCIO_CRTC_DATA, value ); +} + +static __inline__ u8 +nv_incrtc( volatile void *mmioaddr, u8 reg ) +{ + nv_out8( mmioaddr, PCIO_CRTC_INDEX, reg ); + return nv_in8( mmioaddr, PCIO_CRTC_DATA ); +} + +#define WAIT_MAX 10000000 + +static inline void +nv_waitidle( NVidiaDriverData *nvdrv, NVidiaDeviceData *nvdev ) +{ + u32 status; + int waitcycles = 0; + + do { + status = nv_in32( nvdrv->mmio_base, PGRAPH_STATUS ); + if (++waitcycles > WAIT_MAX) { + D_BREAK( "Engine timed out" ); + /* avoid card crash */ + _exit(-1); + } + } while (status & PGRAPH_STATUS_STATE_BUSY); + + nvdev->idle_waitcycles += waitcycles; +} + +/* + * FIFO control + */ + +static inline void +nv_waitfifo( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + unsigned int space ) +{ + volatile void *mmio = nvdrv->mmio_base; + int waitcycles = 0; + + nvdev->waitfree_sum += (space); + nvdev->waitfree_calls++; + + if (nvdev->fifo_free < space) { + do { +#ifdef WORDS_BIGENDIAN + nvdev->fifo_free = nv_in16( mmio, FIFO_FREE ) >> 2; +#else + nvdev->fifo_free = nv_in32( mmio, FIFO_FREE ) >> 2; +#endif + if (++waitcycles > WAIT_MAX) { + D_BREAK( "FIFO timed out" ); + /* avoid card crash */ + _exit(-1); + } + } while (nvdev->fifo_free < space); + + nvdev->free_waitcycles += waitcycles; + } else + nvdev->cache_hits++; + + nvdev->fifo_free -= space; +} + +/* + * DMA control + */ + +static inline void +nv_emitdma( NVidiaDriverData *nvdrv, NVidiaDeviceData *nvdev ) +{ + if (nvdev->dma_put != nvdev->dma_cur) { + volatile u8 scratch; + + /* flush MTRR buffers */ + scratch = nv_in8( nvdrv->fb_base, 0 ); + nv_out32( nvdrv->mmio_base, DMA_PUT, nvdev->dma_cur << 2 ); + + nvdev->dma_put = nvdev->dma_cur; + } +} + +static inline void +nv_waitdma( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + unsigned int space ) +{ + volatile void *mmio = nvdrv->mmio_base; + volatile void *ring = nvdrv->dma_base; + int waitcycles = 0; + + nvdev->waitfree_sum += (space); + nvdev->waitfree_calls++; + + if (nvdev->dma_free < space) { + do { + nvdev->dma_get = nv_in32( mmio, DMA_GET ) >> 2; + + if (nvdev->dma_put >= nvdev->dma_get) { + nvdev->dma_free = nvdev->dma_max - nvdev->dma_cur; + + if (nvdev->dma_free < space) { + /* rewind ring */ + nv_out32( ring, nvdev->dma_cur << 2, 0x20000000 ); + + if (!nvdev->dma_get) { + if (!nvdev->dma_put) { + nvdev->dma_cur = 1; + nv_emitdma( nvdrv, nvdev ); + } + + do { + nvdev->dma_get = nv_in32( mmio, DMA_GET ) >> 2; + if (++waitcycles > WAIT_MAX) { + D_BREAK( "DMA timed out" ); + /* avoid card crash */ + _exit(-1); + } + } while (!nvdev->dma_get); + } + + nvdev->dma_cur = 0; + nv_emitdma( nvdrv, nvdev ); + + nvdev->dma_free = nvdev->dma_get - 1; + } + } + else { + nvdev->dma_free = nvdev->dma_get - nvdev->dma_cur - 1; + } + + if (++waitcycles > WAIT_MAX) { + D_BREAK( "DMA timed out" ); + /* avoid card crash */ + _exit(-1); + } + } while (nvdev->dma_free < space); + + nvdev->free_waitcycles += waitcycles; + } else + nvdev->cache_hits++; + + nvdev->dma_free -= space; +} + +/* Begin writing into ring/fifo */ +#define nv_begin( subc, start, size ) { \ + if (nvdev->use_dma) { \ + nv_waitdma( nvdrv, nvdev, (size)+1 ); \ + nv_out32( nvdrv->dma_base, nvdev->dma_cur << 2, \ + ((size) << 18) | ((subc)*0x2000 + (start)) ); \ + nvdev->cmd_ptr = nvdrv->dma_base; \ + nvdev->cmd_ptr += nvdev->dma_cur + 1; \ + nvdev->dma_cur += (size) + 1; \ + D_ASSERT( nvdev->dma_cur <= nvdev->dma_max ); \ + } else { \ + nv_waitfifo( nvdrv, nvdev, size ); \ + nvdev->cmd_ptr = (nvdrv->mmio_base + FIFO_ADDRESS + \ + (subc)*0x2000 + (start)); \ + } \ +} + +/* Output to ring/register */ +#define nv_outr( value ) *nvdev->cmd_ptr++ = (value) + + +#endif /* __NVIDIA_ACCEL_H__ */ diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_objects.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia_objects.h new file mode 100755 index 0000000..a0e329f --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_objects.h @@ -0,0 +1,160 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 __NVIDIA_OBJECTS_H__ +#define __NVIDIA_OBJECTS_H__ + +#include "nvidia.h" +#include "nvidia_accel.h" + +/* Engine */ +#define ENGINE_SW 0 +#define ENGINE_GRAPHICS 1 +#define ENGINE_DVD 2 + + +static __inline__ u32 +nv_hashkey( u32 obj ) +{ + return ((obj >> 0) & 0x000001FF) ^ + ((obj >> 9) & 0x000001FF) ^ + ((obj >> 18) & 0x000001FF) ^ + ((obj >> 27) & 0x000001FF) ^ (0 << 5); /* channel 0 */ +} + + +/* DMA flags */ +#define DMA_FLAG_PAGE_TABLE (1 << 12) /* valid */ +#define DMA_FLAG_PAGE_ENTRY_NONLIN (0 << 13) +#define DMA_FLAG_PAGE_ENTRY_LINEAR (1 << 13) +#define DMA_FLAG_ACCESS_RDWR (0 << 14) +#define DMA_FLAG_ACCESS_RDONLY (1 << 14) +#define DMA_FLAG_ACCESS_WRONLY (2 << 14) +#define DMA_FLAG_TARGET_NVM (0 << 16) +#define DMA_FLAG_TARGET_NVM_TILED (1 << 16) +#define DMA_FLAG_TARGET_PCI (2 << 16) +#define DMA_FLAG_TARGET_AGP (3 << 16) + +/* DMA frame access */ +#define DMA_FRAME_UNKNOWN_FLAG (1 << 0) +#define DMA_FRAME_ACCESS_RDONLY (0 << 1) +#define DMA_FRAME_ACCESS_RDWR (1 << 1) + +static inline void +nv_store_dma( NVidiaDriverData *nvdrv, u32 obj, + u32 addr, u32 class, u32 flags, + u32 size, u32 frame, u32 access ) +{ + volatile void *mmio = nvdrv->mmio_base; + u32 key = nv_hashkey( obj ); + u32 ctx = addr | (ENGINE_SW << 16) | (1 << 31); + + /* NV_PRAMIN_RAMRO_0 */ + nv_out32( mmio, PRAMIN + (addr << 4) + 0, class | flags ); + nv_out32( mmio, PRAMIN + (addr << 4) + 4, size - 1 ); + nv_out32( mmio, PRAMIN + (addr << 4) + 8, (frame & 0xFFFFF000) | access ); + nv_out32( mmio, PRAMIN + (addr << 4) + 12, (frame & 0xFFFFF000) | access ); + + /* store object id and context */ + nv_out32( mmio, PRAMHT + (key << 3) + 0, obj ); + nv_out32( mmio, PRAMHT + (key << 3) + 4, ctx ); +} + + +/* Context flags */ +#define CTX_FLAG_CHROMA_KEY (1 << 12) +#define CTX_FLAG_USER_CLIP (1 << 13) +#define CTX_FLAG_SWIZZLE (1 << 14) +#define CTX_FLAG_PATCH_COPY (0 << 15) +#define CTX_FLAG_PATCH_ROP (1 << 15) +#define CTX_FLAG_PATCH_BLEND (2 << 15) +#define CTX_FLAG_PATCH_SRCCOPY (3 << 15) +#define CTX_FLAG_PATCH_COLOR_MULTIPLY (4 << 15) +#define CTX_FLAG_PATCH_BLEND_PREMULTIPLIED (5 << 15) +#define CTX_FLAG_SYNCHRONIZE (1 << 18) +#define CTX_FLAG_ENDIAN_LITTLE (0 << 19) +#define CTX_FLAG_ENDIAN_BIG (1 << 19) +#define CTX_FLAG_CONVERSION_COMPAT (0 << 20) +#define CTX_FLAG_CONVERSION_DITHER (1 << 20) +#define CTX_FLAG_CONVERSION_TRUNC (2 << 20) +#define CTX_FLAG_CONVERSION_SUB_TRUNC (3 << 20) +#define CTX_FLAG_SINGLE_STEP (1 << 23) +#define CTX_FLAG_PATCH (1 << 24) /* valid */ +#define CTX_FLAG_CTX_SURFACE0 (1 << 25) /* valid */ +#define CTX_FLAG_CTX_SURFACE1 (1 << 26) /* valid */ +#define CTX_FLAG_CTX_PATTERN (1 << 27) /* valid */ +#define CTX_FLAG_CTX_ROP (1 << 28) /* valid */ +#define CTX_FLAG_CTX_BETA1 (1 << 29) /* valid */ +#define CTX_FLAG_CTX_BETA4 (1 << 30) /* valid */ + + +static inline void +nv_store_object( NVidiaDriverData *nvdrv, + u32 obj, u32 addr, + u32 class, u32 flags, + u32 dma0, u32 dma1 ) +{ + volatile void *mmio = nvdrv->mmio_base; + u32 key = nv_hashkey( obj ); + u32 ctx = addr | (ENGINE_GRAPHICS << 16) | (1 << 31); + + /* set the endian flag here, for simplicity */ +#ifdef WORDS_BIGENDIAN + flags |= CTX_FLAG_ENDIAN_BIG; +#endif + /* NV_PRAMIN_CTX_0 */ + nv_out32( mmio, PRAMIN + (addr << 4) + 0, class | flags ); + /* NV_PRAMIN_CTX_1 */ + nv_out32( mmio, PRAMIN + (addr << 4) + 4, 0x00000000 ); /* color */ + /* NV_PRAMIN_CTX_2 */ + nv_out32( mmio, PRAMIN + (addr << 4) + 8, dma0 | (dma1 << 16) ); + /* NV_PRAMIN_CTX_3 */ + nv_out32( mmio, PRAMIN + (addr << 4) + 12, 0x00000000 ); /* traps */ + + /* store object id and context */ + nv_out32( mmio, PRAMHT + (key << 3) + 0, obj ); + nv_out32( mmio, PRAMHT + (key << 3) + 4, ctx ); +} + + +static inline void +nv_assign_object( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + int subc, + u32 object, + bool reset ) +{ + if (reset || nvdev->subchannel_object[subc] != object) { + nv_begin( subc, SET_OBJECT, 1 ); + nv_outr( object ); + + nvdev->subchannel_object[subc] = object; + } +} + +#endif /* __NVIDIA_OBJECTS_H__ */ diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_overlay.c b/Source/DirectFB/gfxdrivers/nvidia/nvidia_overlay.c new file mode 100755 index 0000000..747f14c --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_overlay.c @@ -0,0 +1,566 @@ +/* + (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 Oliver Schwartz and + Claudio Ciccani . + + 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 + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include "nvidia.h" +#include "nvidia_regs.h" +#include "nvidia_accel.h" + + +typedef struct { + CoreLayerRegionConfig config; + CoreSurface *videoSurface; + CoreSurfaceBufferLock *lock; + + short brightness; + short contrast; + short hue; + short saturation; + int field; + + struct { + u32 BUFFER; + u32 STOP; + u32 UVBASE_0; + u32 UVBASE_1; + u32 UVOFFSET_0; + u32 UVOFFSET_1; + u32 BASE_0; + u32 BASE_1; + u32 OFFSET_0; + u32 OFFSET_1; + u32 SIZE_IN_0; + u32 SIZE_IN_1; + u32 POINT_IN_0; + u32 POINT_IN_1; + u32 DS_DX_0; + u32 DS_DX_1; + u32 DT_DY_0; + u32 DT_DY_1; + u32 POINT_OUT_0; + u32 POINT_OUT_1; + u32 SIZE_OUT_0; + u32 SIZE_OUT_1; + u32 FORMAT_0; + u32 FORMAT_1; + } regs; +} NVidiaOverlayLayerData; + +static void ov0_set_regs ( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0, + CoreLayerRegionConfigFlags flags ); +static void ov0_calc_regs ( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0, + CoreLayerRegionConfig *config, + CoreLayerRegionConfigFlags flags ); +static void ov0_set_colorkey( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0, + CoreLayerRegionConfig *config ); +static void ov0_set_csc ( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0 ); + +#define OV0_SUPPORTED_OPTIONS \ + ( DLOP_DST_COLORKEY | DLOP_DEINTERLACING ) + +/**********************/ + + + +static int +ov0LayerDataSize( void ) +{ + return sizeof(NVidiaOverlayLayerData); +} + +static DFBResult +ov0InitLayer( CoreLayer *layer, + void *driver_data, + void *layer_data, + DFBDisplayLayerDescription *description, + DFBDisplayLayerConfig *config, + DFBColorAdjustment *adjustment ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaOverlayLayerData *nvov0 = (NVidiaOverlayLayerData*) layer_data; + + /* set capabilities and type */ + description->caps = DLCAPS_SURFACE | DLCAPS_SCREEN_LOCATION | + DLCAPS_BRIGHTNESS | DLCAPS_CONTRAST | + DLCAPS_SATURATION | DLCAPS_HUE | + DLCAPS_DST_COLORKEY | DLCAPS_DEINTERLACING; + description->type = DLTF_VIDEO | DLTF_STILL_PICTURE; + + /* set name */ + snprintf( description->name, + DFB_DISPLAY_LAYER_DESC_NAME_LENGTH, "NVidia Overlay" ); + + /* fill out the default configuration */ + config->flags = DLCONF_WIDTH | DLCONF_HEIGHT | + DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE | + DLCONF_OPTIONS; + config->width = 640; + config->height = 480; + config->pixelformat = DSPF_YUY2; + config->buffermode = DLBM_FRONTONLY; + config->options = DLOP_NONE; + + /* fill out default color adjustment, + only fields set in flags will be accepted from applications */ + adjustment->flags = DCAF_BRIGHTNESS | DCAF_CONTRAST | + DCAF_SATURATION | DCAF_HUE; + adjustment->brightness = 0x8000; + adjustment->contrast = 0x8000; + adjustment->saturation = 0x8000; + adjustment->hue = 0x8000; + + /* reset overlay */ + nvov0->brightness = 0; + nvov0->contrast = 4096; + nvov0->hue = 0; + nvov0->saturation = 4096; + ov0_set_csc( nvdrv, nvov0 ); + + return DFB_OK; +} + +static DFBResult +ov0Remove( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + volatile u8 *mmio = nvdrv->mmio_base; + + /* disable overlay */ + nv_out32( mmio, PVIDEO_STOP, PVIDEO_STOP_OVERLAY_ACTIVE | + PVIDEO_STOP_METHOD_IMMEDIATELY ); + nv_out32( mmio, PVIDEO_BUFFER, 0 ); + + return DFB_OK; +} + +static DFBResult +ov0TestRegion(CoreLayer *layer, + void *driver_data, + void *layer_data, + CoreLayerRegionConfig *config, + CoreLayerRegionConfigFlags *failed ) +{ + NVidiaDriverData *nvdrv = driver_data; + NVidiaDeviceData *nvdev = nvdrv->device_data; + CoreLayerRegionConfigFlags fail = CLRCF_NONE; + + + /* check for unsupported options */ + if (config->options & ~OV0_SUPPORTED_OPTIONS) + fail |= CLRCF_OPTIONS; + + /* check buffermode */ + switch (config->buffermode) { + case DLBM_FRONTONLY: + case DLBM_BACKSYSTEM: + case DLBM_BACKVIDEO: + case DLBM_TRIPLE: + break; + + default: + fail |= CLRCF_BUFFERMODE; + break; + } + + /* check pixel format */ + switch (config->format) { + case DSPF_YUY2: + case DSPF_UYVY: + break; + + case DSPF_NV12: + /*case DSPF_NV21:*/ + if (nvdev->arch < NV_ARCH_30) + fail |= CLRCF_FORMAT; + break; + + default: + fail |= CLRCF_FORMAT; + break; + } + + /* check width */ + if (config->width > 2046 || config->width < 1) + fail |= CLRCF_WIDTH; + + /* check height */ + if (config->height > 2046 || 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 +ov0SetRegion( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data, + CoreLayerRegionConfig *config, + CoreLayerRegionConfigFlags updated, + CoreSurface *surface, + CorePalette *palette, + CoreSurfaceBufferLock *lock ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaOverlayLayerData *nvov0 = (NVidiaOverlayLayerData*) layer_data; + + /* remember configuration */ + nvov0->config = *config; + + nvov0->videoSurface = surface; + nvov0->lock = lock; + + /* set configuration */ + if (updated & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_FORMAT | + CLRCF_SOURCE | CLRCF_DEST | CLRCF_OPTIONS | CLRCF_OPACITY)) + { + ov0_calc_regs( nvdrv, nvov0, config, updated ); + ov0_set_regs( nvdrv, nvov0, updated ); + } + + /* set destination colorkey */ + if (updated & CLRCF_DSTKEY) + ov0_set_colorkey( nvdrv, nvov0, config ); + + return DFB_OK; +} + +static DFBResult +ov0FlipRegion ( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data, + CoreSurface *surface, + DFBSurfaceFlipFlags flags, + CoreSurfaceBufferLock *lock ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaOverlayLayerData *nvov0 = (NVidiaOverlayLayerData*) layer_data; + + nvov0->videoSurface = surface; + nvov0->lock = lock; + + dfb_surface_flip( nvov0->videoSurface, false ); + + ov0_calc_regs( nvdrv, nvov0, &nvov0->config, CLRCF_SURFACE ); + ov0_set_regs( nvdrv, nvov0, CLRCF_SURFACE ); + + if (flags & DSFLIP_WAIT) + dfb_layer_wait_vsync( layer ); + + return DFB_OK; +} + +static DFBResult +ov0SetColorAdjustment( CoreLayer *layer, + void *driver_data, + void *layer_data, + DFBColorAdjustment *adj ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaOverlayLayerData *nvov0 = (NVidiaOverlayLayerData*) layer_data; + + if (adj->flags & DCAF_BRIGHTNESS) { + nvov0->brightness = (adj->brightness >> 8) - 128; + D_DEBUG( "DirectFB/NVidia/Overlay: brightness=%i\n", nvov0->brightness ); + } + + if (adj->flags & DCAF_CONTRAST) { + nvov0->contrast = 8191 - (adj->contrast >> 3); /* contrast inverted ?! */ + D_DEBUG( "DirectFB/NVidia/Overlay: contrast=%i\n", nvov0->contrast ); + } + + if (adj->flags & DCAF_SATURATION) { + nvov0->saturation = adj->saturation >> 3; + D_DEBUG( "DirectFB/NVidia/Overlay: saturation=%i\n", nvov0->saturation ); + } + + if (adj->flags & DCAF_HUE) { + nvov0->hue = (adj->hue / 182 - 180) % 360; + D_DEBUG( "DirectFB/NVidia/Overlay: hue=%i\n", nvov0->hue ); + } + + ov0_set_csc( nvdrv, nvov0 ); + + return DFB_OK; +} + +static DFBResult +ov0SetInputField( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data, + int field ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaOverlayLayerData *nvov0 = (NVidiaOverlayLayerData*) layer_data; + + nvov0->field = field; + nvov0->regs.BUFFER = 1 << (field << 2); + + nv_out32( nvdrv->mmio_base, PVIDEO_BUFFER, nvov0->regs.BUFFER ); + + return DFB_OK; +} + +DisplayLayerFuncs nvidiaOverlayFuncs = { + .LayerDataSize = ov0LayerDataSize, + .InitLayer = ov0InitLayer, + .SetRegion = ov0SetRegion, + .RemoveRegion = ov0Remove, + .TestRegion = ov0TestRegion, + .FlipRegion = ov0FlipRegion, + .SetColorAdjustment = ov0SetColorAdjustment, + .SetInputField = ov0SetInputField, +}; + + +/* internal */ + +static void ov0_set_regs( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0, + CoreLayerRegionConfigFlags flags ) +{ + volatile u8 *mmio = nvdrv->mmio_base; + + if (flags & CLRCF_SURFACE) { + if (DFB_PLANAR_PIXELFORMAT(nvov0->config.format)) { + nv_out32( mmio, PVIDEO_UVBASE_0, nvov0->regs.UVBASE_0 ); + nv_out32( mmio, PVIDEO_UVBASE_1, nvov0->regs.UVBASE_1 ); + nv_out32( mmio, PVIDEO_UVOFFSET_0, nvov0->regs.UVOFFSET_0 ); + nv_out32( mmio, PVIDEO_UVOFFSET_1, nvov0->regs.UVOFFSET_1 ); + } + nv_out32( mmio, PVIDEO_BASE_0, nvov0->regs.BASE_0 ); + nv_out32( mmio, PVIDEO_BASE_1, nvov0->regs.BASE_1 ); + nv_out32( mmio, PVIDEO_OFFSET_0, nvov0->regs.OFFSET_0 ); + nv_out32( mmio, PVIDEO_OFFSET_1, nvov0->regs.OFFSET_1 ); + } + if (flags & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_OPTIONS)) { + nv_out32( mmio, PVIDEO_SIZE_IN_0, nvov0->regs.SIZE_IN_0 ); + nv_out32( mmio, PVIDEO_SIZE_IN_1, nvov0->regs.SIZE_IN_1 ); + } + if (flags & (CLRCF_SOURCE | CLRCF_DEST | CLRCF_OPTIONS)) { + nv_out32( mmio, PVIDEO_POINT_IN_0, nvov0->regs.POINT_IN_0 ); + nv_out32( mmio, PVIDEO_POINT_IN_1, nvov0->regs.POINT_IN_1 ); + nv_out32( mmio, PVIDEO_DS_DX_0, nvov0->regs.DS_DX_0 ); + nv_out32( mmio, PVIDEO_DS_DX_1, nvov0->regs.DS_DX_1 ); + nv_out32( mmio, PVIDEO_DT_DY_0, nvov0->regs.DT_DY_0 ); + nv_out32( mmio, PVIDEO_DT_DY_1, nvov0->regs.DT_DY_1 ); + } + if (flags & CLRCF_DEST) { + nv_out32( mmio, PVIDEO_POINT_OUT_0, nvov0->regs.POINT_OUT_0 ); + nv_out32( mmio, PVIDEO_POINT_OUT_1, nvov0->regs.POINT_OUT_1 ); + nv_out32( mmio, PVIDEO_SIZE_OUT_0, nvov0->regs.SIZE_OUT_0 ); + nv_out32( mmio, PVIDEO_SIZE_OUT_1, nvov0->regs.SIZE_OUT_1 ); + } + if (flags & (CLRCF_FORMAT | CLRCF_SURFACE | CLRCF_OPTIONS)) { + nv_out32( mmio, PVIDEO_FORMAT_0, nvov0->regs.FORMAT_0 ); + nv_out32( mmio, PVIDEO_FORMAT_1, nvov0->regs.FORMAT_1 ); + } + nv_out32( mmio, PVIDEO_BUFFER, nvov0->regs.BUFFER ); + nv_out32( mmio, PVIDEO_STOP, nvov0->regs.STOP ); +} + +static void +ov0_calc_regs( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0, + CoreLayerRegionConfig *config, + CoreLayerRegionConfigFlags flags ) +{ + NVidiaDeviceData *nvdev = nvdrv->device_data; + + if (flags & (CLRCF_WIDTH | CLRCF_HEIGHT | + CLRCF_SOURCE | CLRCF_DEST | CLRCF_OPTIONS)) { + int width = config->width; + int height = config->height; + DFBRectangle source = config->source; + DFBRectangle dest = config->dest; + + source.x <<= 4; + source.y <<= 4; + + if (dest.x < 0) { + source.x -= (dest.x * source.w << 4) / dest.w; + source.w += dest.x * source.w / dest.w; + dest.w += dest.x; + dest.x = 0; + } + + if (dest.y < 0) { + source.y -= (dest.y * source.h << 4) / dest.h; + source.h += dest.y * source.h / dest.h; + dest.h += dest.y; + dest.y = 0; + } + + if (config->options & DLOP_DEINTERLACING) { + height /= 2; + source.y /= 2; + source.h /= 2; + } + + if (source.w < 1 || source.h < 1 || dest.w < 1 || dest.h < 1) { + nvov0->regs.STOP = PVIDEO_STOP_OVERLAY_ACTIVE | + PVIDEO_STOP_METHOD_NORMALLY; + return; + } + + nvov0->regs.SIZE_IN_0 = + nvov0->regs.SIZE_IN_1 = ((height << 16) & PVIDEO_SIZE_IN_HEIGHT_MSK) | + ( width & PVIDEO_SIZE_IN_WIDTH_MSK); + nvov0->regs.POINT_IN_0 = + nvov0->regs.POINT_IN_1 = ((source.y << 16) & PVIDEO_POINT_IN_T_MSK) | + ( source.x & PVIDEO_POINT_IN_S_MSK); + nvov0->regs.DS_DX_0 = + nvov0->regs.DS_DX_1 = (source.w << 20) / dest.w; + nvov0->regs.DT_DY_0 = + nvov0->regs.DT_DY_1 = (source.h << 20) / dest.h; + nvov0->regs.POINT_OUT_0 = + nvov0->regs.POINT_OUT_1 = ((dest.y << 16) & PVIDEO_POINT_OUT_Y_MSK) | + ( dest.x & PVIDEO_POINT_OUT_X_MSK); + nvov0->regs.SIZE_OUT_0 = + nvov0->regs.SIZE_OUT_1 = ((dest.h << 16) & PVIDEO_SIZE_OUT_HEIGHT_MSK) | + ( dest.w & PVIDEO_SIZE_OUT_WIDTH_MSK); + } + + if (flags & (CLRCF_SURFACE | CLRCF_FORMAT | CLRCF_OPTIONS)) { + CoreSurfaceBufferLock *lock = nvov0->lock; + u32 format; + + if (config->options & DLOP_DEINTERLACING) + format = (lock->pitch*2) & PVIDEO_FORMAT_PITCH_MSK; + else + format = lock->pitch & PVIDEO_FORMAT_PITCH_MSK; + + if (DFB_PLANAR_PIXELFORMAT(config->format)) + format |= PVIDEO_FORMAT_PLANAR_NV; + + if (config->format == DSPF_UYVY) + format |= PVIDEO_FORMAT_COLOR_YB8CR8YA8CB8; + else + format |= PVIDEO_FORMAT_COLOR_CR8YB8CB8YA8; + + if (config->options & DLOP_DST_COLORKEY) + format |= PVIDEO_FORMAT_DISPLAY_COLOR_KEY_EQUAL; + + /* Use Buffer 0 for Odd field */ + nvov0->regs.OFFSET_0 = (nvdev->fb_offset + lock->offset) & PVIDEO_OFFSET_MSK; + /* Use Buffer 1 for Even field */ + nvov0->regs.OFFSET_1 = nvov0->regs.OFFSET_0 + lock->pitch; + if (DFB_PLANAR_PIXELFORMAT(config->format)) { + CoreSurface *surface = nvov0->videoSurface; + nvov0->regs.UVOFFSET_0 = (nvov0->regs.OFFSET_0 + + lock->pitch * surface->config.size.h) & PVIDEO_UVOFFSET_MSK; + nvov0->regs.UVOFFSET_1 = nvov0->regs.UVOFFSET_0 + lock->pitch; + } + nvov0->regs.FORMAT_0 = + nvov0->regs.FORMAT_1 = format; + } + + nvov0->regs.BUFFER = 1 << (nvov0->field << 2); + nvov0->regs.STOP = (config->opacity) + ? PVIDEO_STOP_OVERLAY_INACTIVE + : PVIDEO_STOP_OVERLAY_ACTIVE; + nvov0->regs.STOP |= PVIDEO_STOP_METHOD_NORMALLY; +} + +static void +ov0_set_colorkey( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0, + CoreLayerRegionConfig *config ) +{ + u32 key; + + key = dfb_color_to_pixel( dfb_primary_layer_pixelformat(), + config->dst_key.r, + config->dst_key.g, + config->dst_key.b ); + + nv_out32( nvdrv->mmio_base, PVIDEO_COLOR_KEY, key ); +} + +static void +ov0_set_csc( NVidiaDriverData *nvdrv, + NVidiaOverlayLayerData *nvov0 ) +{ + volatile u8 *mmio = nvdrv->mmio_base; + s32 satSine; + s32 satCosine; + double angle; + + angle = (double) nvov0->hue * M_PI / 180.0; + satSine = nvov0->saturation * sin(angle); + if (satSine < -1024) + satSine = -1024; + satCosine = nvov0->saturation * cos(angle); + if (satCosine < -1024) + satCosine = -1024; + + nv_out32( mmio, PVIDEO_LUMINANCE_0, (nvov0->brightness << 16) | + (nvov0->contrast & 0xffff) ); + nv_out32( mmio, PVIDEO_LUMINANCE_1, (nvov0->brightness << 16) | + (nvov0->contrast & 0xffff) ); + nv_out32( mmio, PVIDEO_CHROMINANCE_0, (satSine << 16) | + (satCosine & 0xffff) ); + nv_out32( mmio, PVIDEO_CHROMINANCE_1, (satSine << 16) | + (satCosine & 0xffff) ); +} + diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_primary.c b/Source/DirectFB/gfxdrivers/nvidia/nvidia_primary.c new file mode 100755 index 0000000..50bde37 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_primary.c @@ -0,0 +1,189 @@ +/* + Copyright (C) 2005-2006 Claudio Ciccani + + 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 + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "nvidia.h" +#include "nvidia_regs.h" +#include "nvidia_accel.h" + + +/************************** Primary Screen functions **************************/ + +static DFBResult +crtc1InitScreen( CoreScreen *screen, + CoreGraphicsDevice *device, + void *driver_data, + void *screen_data, + DFBScreenDescription *description ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + volatile u8 *mmio = nvdrv->mmio_base; + + if (OldPrimaryScreenFuncs.InitScreen) + OldPrimaryScreenFuncs.InitScreen( screen, device, + OldPrimaryScreenDriverData, + screen_data, description ); + + description->caps |= DSCCAPS_VSYNC; + + snprintf( description->name, + DFB_SCREEN_DESC_NAME_LENGTH, "NVidia Primary Screen" ); + + nv_out32( mmio, PCRTC_INTR_EN, PCRTC_INTR_EN_VBLANK_DISABLED ); +#ifdef WORDS_BIGENDIAN + nv_out32( mmio, PCRTC_CONFIG, PCRTC_CONFIG_SIGNAL_HSYNC | + PCRTC_CONFIG_ENDIAN_BIG ); +#else + nv_out32( mmio, PCRTC_CONFIG, PCRTC_CONFIG_SIGNAL_HSYNC | + PCRTC_CONFIG_ENDIAN_LITTLE ); +#endif + nv_out32( mmio, PCRTC_INTR, PCRTC_INTR_VBLANK_RESET ); + + return DFB_OK; +} + +static DFBResult +crtc1WaitVSync( CoreScreen *screen, + void *driver_data, + void *screen_data ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + volatile u8 *mmio = nvdrv->mmio_base; + + if (!dfb_config->pollvsync_none) { + int i; + + for (i = 0; i < 2000000; i++) { + if (!(nv_in8( mmio, PCIO_CRTC_STATUS ) & 8)) + break; + } + + for (i = 0; i < 2000000;) { + if (nv_in8( mmio, PCIO_CRTC_STATUS ) & 8) + break; + + i++; + if ((i % 2000) == 0) { + struct timespec ts = { 0, 10000 }; + nanosleep( &ts, NULL ); + } + } + } + + return DFB_OK; +} + +#if 0 +static DFBResult +crtc1GetScreenSize( CoreScreen *screen, + void *driver_data, + void *screen_data, + int *ret_width, + int *ret_height ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + volatile u8 *mmio = nvdrv->mmio_base; + int w, h; + int val; + + /* stolen from RivaTV */ + + w = nv_incrtc( mmio, CRTC_HORIZ_DISPLAY_END ); + w |= (nv_incrtc( mmio, CRTC_HORIZ_EXTRA ) & 0x02) << 7; + w = (w + 1) << 3; + + h = nv_incrtc( mmio, CRTC_VERT_DISPLAY_END ); + val = nv_incrtc( mmio, CRTC_OVERFLOW ); + h |= (val & 0x02) << 7; + h |= (val & 0x40) << 3; + h++; + h |= nv_incrtc( mmio, CRTC_EXTRA ) << 9; + h |= nv_incrtc( mmio, 0x41 ) << 9; + h >>= (nv_incrtc( mmio, CRTC_MAX_SCAN_LINE ) & 0x80) >> 7; + + D_DEBUG( "DirectFB/NVidia/Crtc1: " + "detected screen resolution %dx%d.\n", w, h ); + + *ret_width = w; + *ret_height = h; + + return DFB_OK; +} +#endif + +ScreenFuncs nvidiaPrimaryScreenFuncs = { + .InitScreen = crtc1InitScreen, + .WaitVSync = crtc1WaitVSync, + //.GetScreenSize = crtc1GetScreenSize +}; + +ScreenFuncs OldPrimaryScreenFuncs; +void *OldPrimaryScreenDriverData; + +/*************************** Primary Layer hooks ******************************/ + +static DFBResult +fb0FlipRegion( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data, + CoreSurface *surface, + DFBSurfaceFlipFlags flags, + CoreSurfaceBufferLock *lock ) +{ + NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data; + NVidiaDeviceData *nvdev = nvdrv->device_data; + u32 offset; + + dfb_surface_flip( surface, false ); + + offset = (lock->offset + nvdev->fb_offset) & ~3; + nv_out32( nvdrv->mmio_base, PCRTC_START, offset ); + + if (flags & DSFLIP_WAIT) + dfb_layer_wait_vsync( layer ); + + return DFB_OK; +} + + +DisplayLayerFuncs nvidiaPrimaryLayerFuncs = { + .FlipRegion = fb0FlipRegion +}; + +DisplayLayerFuncs OldPrimaryLayerFuncs; +void *OldPrimaryLayerDriverData; diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_regs.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia_regs.h new file mode 100755 index 0000000..64257cc --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_regs.h @@ -0,0 +1,1636 @@ +#ifndef __NVIDIA_REGS_H__ +#define __NVIDIA_REGS_H__ + + +/* PMC */ +#define PMC 0x00000000 + + + +/* PBUS */ +#define PBUS 0x00001000 + + + +/* PFIFO */ +#define PFIFO 0x00002000 + +#define PFIFO_DELAY_0 0x00002040 +#define PFIFO_DELAY_0_WAIT_RETRY_MSK 0x000003FF + +#define PFIFO_DMA_TIMESLICE 0x00002044 +#define PFIFO_DMA_TIMESLICE_SELECT_MSK 0x0001FFFF +#define PFIFO_DMA_TIMESLICE_SELECT_1 0x00000000 +#define PFIFO_DMA_TIMESLICE_SELECT_16K 0x00003FFF +#define PFIFO_DMA_TIMESLICE_SELECT_32K 0x00007FFF +#define PFIFO_DMA_TIMESLICE_SELECT_64K 0x0000FFFF +#define PFIFO_DMA_TIMESLICE_SELECT_128K 0x0001FFFF +#define PFIFO_DMA_TIMESLICE_TIMEOUT_DISABLED 0x00000000 +#define PFIFO_DMA_TIMESLICE_TIMEOUT_ENABLED 0x01000000 + +#define PFIFO_PIO_TIMESLICE 0x00002048 +#define PFIFO_PIO_TIMESLICE_SELECT_MSK 0x0001FFFF +#define PFIFO_PIO_TIMESLICE_SELECT_1 0x00000000 +#define PFIFO_PIO_TIMESLICE_SELECT_16K 0x00003FFF +#define PFIFO_PIO_TIMESLICE_SELECT_32K 0x00007FFF +#define PFIFO_PIO_TIMESLICE_SELECT_64K 0x0000FFFF +#define PFIFO_PIO_TIMESLICE_SELECT_128K 0x0001FFFF +#define PFIFO_PIO_TIMESLICE_TIMEOUT_DISABLED 0x00000000 +#define PFIFO_PIO_TIMESLICE_TIMEOUT_ENABLED 0x01000000 + +#define PFIFO_TIMESLICE 0x0000204C +#define PFIFO_TIMESLICE_TIMER_MSK 0x0003FFFF + +#define PFIFO_NEXT_CHANNEL 0x00002050 +#define PFIFO_NEXT_CHANNEL_CHID_MSK 0x0000001F +#define PFIFO_NEXT_CHANNEL_MODE_PIO 0x00000000 +#define PFIFO_NEXT_CHANNEL_MODE_DMA 0x00000100 +#define PFIFO_NEXT_CHANNEL_SWITCH_NOT_PENDING 0x00000000 +#define PFIFO_NEXT_CHANNEL_SWITCH_PENDING 0x00001000 + +#define PFIFO_DEBUG_0 0x00002080 +#define PFIFO_DEBUG_0_CACHE_ERROR0_NOT_PENDING 0x00000000 +#define PFIFO_DEBUG_0_CACHE_ERROR0_PENDING 0x00000001 +#define PFIFO_DEBUG_0_CACHE_ERROR1_NOT_PENDING 0x00000000 +#define PFIFO_DEBUG_0_CACHE_ERROR1_PENDING 0x00000010 + +#define PFIFO_INTR 0x00002100 +#define PFIFO_INTR_RESET 0xFFFFFFFF +#define PFIFO_INTR_CACHE_ERROR_NOT_PENDING 0x00000000 +#define PFIFO_INTR_CACHE_ERROR_PENDING 0x00000001 +#define PFIFO_INTR_CACHE_ERROR_RESET 0x00000001 +#define PFIFO_INTR_RUNOUT_NOT_PENDING 0x00000000 +#define PFIFO_INTR_RUNOUT_PENDING 0x00000010 +#define PFIFO_INTR_RUNOUT_RESET 0x00000010 +#define PFIFO_INTR_RUNOUT_OVERFLOW_NOT_PENDING 0x00000000 +#define PFIFO_INTR_RUNOUT_OVERFLOW_PENDING 0x00000100 +#define PFIFO_INTR_RUNOUT_OVERFLOW_RESET 0x00000100 +#define PFIFO_INTR_DMA_PUSHER_NOT_PENDING 0x00000000 +#define PFIFO_INTR_DMA_PUSHER_PENDING 0x00001000 +#define PFIFO_INTR_DMA_PUSHER_RESET 0x00001000 +#define PFIFO_INTR_DMA_PT_NOT_PENDING 0x00000000 +#define PFIFO_INTR_DMA_PT_PENDING 0x00010000 +#define PFIFO_INTR_DMA_PT_RESET 0x00010000 +#define PFIFO_INTR_SEMAPHORE_NOT_PENDING 0x00000000 +#define PFIFO_INTR_SEMAPHORE_PENDING 0x00100000 +#define PFIFO_INTR_SEMAPHORE_RESET 0x00100000 +#define PFIFO_INTR_ACQUIRE_TIMEOUT_NOT_PENDING 0x00000000 +#define PFIFO_INTR_ACQUIRE_TIMEOUT_PENDING 0x01000000 +#define PFIFO_INTR_ACQUIRE_TIMEOUT_RESET 0x01000000 + +#define PFIFO_INTR_EN 0x00002140 +#define PFIFO_INTR_EN_DISABLED 0x00000000 +#define PFIFO_INTR_EN_CACHE_ERROR_DISABLED 0x00000000 +#define PFIFO_INTR_EN_CACHE_ERROR_ENABLED 0x00000001 +#define PFIFO_INTR_EN_RUNOUT_DISABLED 0x00000000 +#define PFIFO_INTR_EN_RUNOUT_ENABLED 0x00000010 +#define PFIFO_INTR_EN_RUNOUT_OVERFLOW_DISABLED 0x00000000 +#define PFIFO_INTR_EN_RUNOUT_OVERFLOW_ENABLED 0x00000100 +#define PFIFO_INTR_EN_DMA_PUSHER_DISABLED 0x00000000 +#define PFIFO_INTR_EN_DMA_PUSHER_ENABLED 0x00001000 +#define PFIFO_INTR_EN_DMA_PT_DISABLED 0x00000000 +#define PFIFO_INTR_EN_DMA_PT_ENABLED 0x00010000 +#define PFIFO_INTR_EN_SEMAPHORE_DISABLED 0x00000000 +#define PFIFO_INTR_EN_SEMAPHORE_ENABLED 0x00100000 +#define PFIFO_INTR_EN_ACQUIRE_TIMEOUT_DISABLED 0x00000000 +#define PFIFO_INTR_EN_ACQUIRE_TIMEOUT_ENABLED 0x01000000 + +#define PFIFO_RAMHT 0x00002210 +#define PFIFO_RAMHT_BASE_ADDRESS_MSK 0x000001F0 +#define PFIFO_RAMHT_SIZE_4K 0x00000000 +#define PFIFO_RAMHT_SIZE_8K 0x00010000 +#define PFIFO_RAMHT_SIZE_16K 0x00020000 +#define PFIFO_RAMHT_SIZE_32K 0x00030000 +#define PFIFO_RAMHT_SEARCH_16 0x00000000 +#define PFIFO_RAMHT_SEARCH_32 0x01000000 +#define PFIFO_RAMHT_SEARCH_64 0x02000000 +#define PFIFO_RAMHT_SEARCH_128 0x03000000 + +#define PFIFO_RAMFC 0x00002214 +#define PFIFO_RAMFC_BASE_ADDRESS_MSK 0x000001F8 + +#define PFIFO_RAMRO 0x00002218 +#define PFIFO_RAMRO_BASE_ADDRESS_MSK 0x000001FE +#define PFIFO_RAMRO_BASE_ADDRESS_11800 0x00000118 +#define PFIFO_RAMRO_BASE_ADDRESS_11400 0x00000114 +#define PFIFO_RAMRO_BASE_ADDRESS_11200 0x00000112 +#define PFIFO_RAMRO_BASE_ADDRESS_12000 0x00000120 +#define PFIFO_RAMRO_SIZE_512 0x00000000 +#define PFIFO_RAMRO_SIZE_8K 0x00010000 + +#define PFIFO_CACHES 0x00002500 +#define PFIFO_CACHES_REASSIGN_DISABLED 0x00000000 +#define PFIFO_CACHES_REASSIGN_ENABLED 0x00000001 +#define PFIFO_CACHES_DMA_SUSPEND_IDLE 0x00000000 +#define PFIFO_CACHES_DMA_SUSPEND_BUSY 0x00000010 + +#define PFIFO_MODE 0x00002504 +#define PFIFO_MODE_CHANNEL_0_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_0_DMA 0x00000001 +#define PFIFO_MODE_CHANNEL_1_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_1_DMA 0x00000002 +#define PFIFO_MODE_CHANNEL_2_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_2_DMA 0x00000004 +#define PFIFO_MODE_CHANNEL_3_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_3_DMA 0x00000008 +#define PFIFO_MODE_CHANNEL_4_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_4_DMA 0x00000010 +#define PFIFO_MODE_CHANNEL_5_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_5_DMA 0x00000020 +#define PFIFO_MODE_CHANNEL_6_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_6_DMA 0x00000040 +#define PFIFO_MODE_CHANNEL_7_PIO 0x00000000 +#define PFIFO_MODE_CHANNEL_7_DMA 0x00000080 + +#define PFIFO_DMA 0x00002508 +#define PFIFO_DMA_CHANNEL_0_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_0_PENDING 0x00000001 +#define PFIFO_DMA_CHANNEL_1_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_1_PENDING 0x00000002 +#define PFIFO_DMA_CHANNEL_2_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_2_PENDING 0x00000004 +#define PFIFO_DMA_CHANNEL_3_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_3_PENDING 0x00000008 +#define PFIFO_DMA_CHANNEL_4_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_4_PENDING 0x00000010 +#define PFIFO_DMA_CHANNEL_5_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_5_PENDING 0x00000020 +#define PFIFO_DMA_CHANNEL_6_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_6_PENDING 0x00000040 +#define PFIFO_DMA_CHANNEL_7_NOT_PENDING 0x00000000 +#define PFIFO_DMA_CHANNEL_7_PENDING 0x00000080 + +#define PFIFO_SIZE 0x0000250C +#define PFIFO_SIZE_CHANNEL_0_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_0_512_BYTES 0x00000001 +#define PFIFO_SIZE_CHANNEL_1_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_1_512_BYTES 0x00000002 +#define PFIFO_SIZE_CHANNEL_2_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_2_512_BYTES 0x00000004 +#define PFIFO_SIZE_CHANNEL_3_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_3_512_BYTES 0x00000008 +#define PFIFO_SIZE_CHANNEL_4_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_4_512_BYTES 0x00000010 +#define PFIFO_SIZE_CHANNEL_5_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_5_512_BYTES 0x00000020 +#define PFIFO_SIZE_CHANNEL_6_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_6_512_BYTES 0x00000040 +#define PFIFO_SIZE_CHANNEL_7_124_BYTES 0x00000000 +#define PFIFO_SIZE_CHANNEL_7_512_BYTES 0x00000080 + +#define PFIFO_CACHE0_PUSH0 0x00003000 +#define PFIFO_CACHE0_PUSH0_ACCESS_DISABLED 0x00000000 +#define PFIFO_CACHE0_PUSH0_ACCESS_ENABLED 0x00000001 + +#define PFIFO_CACHE1_PUSH0 0x00003200 +#define PFIFO_CACHE1_PUSH0_ACCESS_DISABLED 0x00000000 +#define PFIFO_CACHE1_PUSH0_ACCESS_ENABLED 0x00000001 + +#define PFIFO_CACHE0_PUSH1 0x00003004 +#define PFIFO_CACHE0_PUSH1_CHID_MSK 0x0000001F + +#define PFIFO_CACHE1_PUSH1 0x00003204 +#define PFIFO_CACHE1_PUSH1_CHID_MSK 0x0000001F +#define PFIFO_CACHE1_PUSH1_MODE_PIO 0x00000000 +#define PFIFO_CACHE1_PUSH1_MODE_DMA 0x00000100 + +#define PFIFO_CACHE1_DMA_PUSH 0x00003220 +#define PFIFO_CACHE1_DMA_PUSH_ACCESS_DISABLED 0x00000000 +#define PFIFO_CACHE1_DMA_PUSH_ACCESS_ENABLED 0x00000001 +#define PFIFO_CACHE1_DMA_PUSH_STATE_IDLE 0x00000000 +#define PFIFO_CACHE1_DMA_PUSH_STATE_BUSY 0x00000010 +#define PFIFO_CACHE1_DMA_PUSH_BUFFER_NOT_EMPTY 0x00000000 +#define PFIFO_CACHE1_DMA_PUSH_BUFFER_EMPTY 0x00000100 +#define PFIFO_CACHE1_DMA_PUSH_STATUS_RUNNING 0x00000000 +#define PFIFO_CACHE1_DMA_PUSH_STATUS_SUSPENDED 0x00001000 + +#define PFIFO_CACHE1_DMA_FETCH 0x00003224 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_8_BYTES 0x00000000 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_16_BYTES 0x00000008 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_24_BYTES 0x00000010 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_32_BYTES 0x00000018 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_40_BYTES 0x00000020 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_48_BYTES 0x00000028 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_56_BYTES 0x00000030 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_64_BYTES 0x00000038 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_72_BYTES 0x00000040 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_80_BYTES 0x00000048 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_88_BYTES 0x00000050 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_96_BYTES 0x00000058 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_104_BYTES 0x00000060 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_112_BYTES 0x00000068 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_120_BYTES 0x00000070 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES 0x00000078 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_136_BYTES 0x00000080 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_144_BYTES 0x00000088 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_152_BYTES 0x00000090 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_160_BYTES 0x00000098 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_168_BYTES 0x000000A0 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_176_BYTES 0x000000A8 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_184_BYTES 0x000000B0 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_192_BYTES 0x000000B8 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_200_BYTES 0x000000C0 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_208_BYTES 0x000000C8 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_216_BYTES 0x000000D0 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_224_BYTES 0x000000D8 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_232_BYTES 0x000000E0 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_240_BYTES 0x000000E8 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_248_BYTES 0x000000F0 +#define PFIFO_CACHE1_DMA_FETCH_TRIG_256_BYTES 0x000000F8 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_32_BYTES 0x00000000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_64_BYTES 0x00002000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_96_BYTES 0x00004000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES 0x00006000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_160_BYTES 0x00008000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_192_BYTES 0x0000A000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_224_BYTES 0x0000C000 +#define PFIFO_CACHE1_DMA_FETCH_SIZE_256_BYTES 0x0000E000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_0 0x00000000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_1 0x00010000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_2 0x00020000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_3 0x00030000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_4 0x00040000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_5 0x00050000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_6 0x00060000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_7 0x00070000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 0x00080000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_9 0x00090000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_10 0x000A0000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_11 0x000B0000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_12 0x000C0000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_13 0x000D0000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_14 0x000E0000 +#define PFIFO_CACHE1_DMA_FETCH_MAX_REQS_15 0x000F0000 +#define PFIFO_CACHE1_LITTLE_ENDIAN 0x00000000 +#define PFIFO_CACHE1_BIG_ENDIAN 0x80000000 + +#define PFIFO_CACHE1_DMA_PUT 0x00003240 + +#define PFIFO_CACHE1_DMA_GET 0x00003244 + +#define PFIFO_CACHE1_REF 0x00003248 + +#define PFIFO_CACHE1_DMA_SUBROUTINE 0x0000324C +#define PFIFO_CACHE1_DMA_SUBROUTINE_OFFSET_MSK 0x1FFFFFFC +#define PFIFO_CACHE1_DMA_SUBROUTINE_STATE_INACTIVE 0x00000000 +#define PFIFO_CACHE1_DMA_SUBROUTINE_STATE_ACTIVE 0x00000001 + +#define PFIFO_CACHE1_DMA_DCOUNT 0x000032A0 +#define PFIFO_CACHE1_DMA_DCOUNT_VALUE_MSK 0x00001FFC + +#define PFIFO_CACHE1_DMA_GET_JMP_SHADOW 0x000032A4 + +#define PFIFO_CACHE1_DMA_RSVD_SHADOW 0x000032A8 + +#define PFIFO_CACHE1_DMA_DATA_SHADOW 0x000032AC + +#define PFIFO_CACHE1_DMA_STATE 0x00003228 +#define PFIFO_CACHE1_DMA_STATE_METHOD_TYPE_INC 0x00000000 +#define PFIFO_CACHE1_DMA_STATE_METHOD_TYPE_NON_INC 0x00000001 +#define PFIFO_CACHE1_DMA_STATE_METHOD_MSK 0x00001FFC +#define PFIFO_CACHE1_DMA_STATE_SUBCHANNEL 0x0000E000 +#define PFIFO_CACHE1_DMA_STATE_METHOD_COUNT_MSK 0x1FFC0000 +#define PFIFO_CACHE1_DMA_STATE_ERROR_NONE 0x00000000 +#define PFIFO_CACHE1_DMA_STATE_ERROR_CALL 0x20000000 +#define PFIFO_CACHE1_DMA_STATE_ERROR_NON_CACHE 0x40000000 +#define PFIFO_CACHE1_DMA_STATE_ERROR_RETURN 0x60000000 +#define PFIFO_CACHE1_DMA_STATE_ERROR_RESERVED_CMD 0x80000000 +#define PFIFO_CACHE1_DMA_STATE_ERROR_PROTECTION 0xC0000000 + +#define PFIFO_CACHE1_DMA_INSTANCE 0x0000322C + +#define PFIFO_CACHE1_DMA_CTL 0x00003230 +#define PFIFO_CACHE1_DMA_CTL_ADJUST_MSK 0x00000FFC +#define PFIFO_CACHE1_DMA_CTL_PAGE_TABLE_PRESENT 0x00001000 +#define PFIFO_CACHE1_DMA_CTL_PAGE_ENTRY_LINEAR 0x00002000 +#define PFIFO_CACHE1_DMA_CTL_TARGET_NODE_NVM 0x00000000 +#define PFIFO_CACHE1_DMA_CTL_TARGET_NODE_PCI 0x00020000 +#define PFIFO_CACHE1_DMA_CTL_TARGET_NODE_AGP 0x00030000 +#define PFIFO_CACHE1_DMA_CTL_AT_INFO_INVALID 0x00000000 +#define PFIFO_CACHE1_DMA_CTL_AT_INFO_VALID 0x80000000 + +#define PFIFO_CACHE1_DMA_LIMIT 0x00003234 + +#define PFIFO_CACHE1_DMA_TLB_TAG 0x00003238 +#define PFIFO_CACHE1_DMA_TLB_TAG_ADDRESS_MSK 0x1FFFF000 +#define PFIFO_CACHE1_DMA_TLB_TAG_STATE_INVALID 0x00000000 +#define PFIFO_CACHE1_DMA_TLB_TAG_STATE_VALID 0x00000001 + +#define PFIFO_CACHE1_DMA_TLB_PTE 0x0000323C +#define PFIFO_CACHE1_DMA_TLB_PTE_ADDRESS_MSK 0xFFFFF000 + +#define PFIFO_CACHE0_PULL0 0x00003050 +#define PFIFO_CACHE0_PULL0_ACCESS_DISABLED 0x00000000 +#define PFIFO_CACHE0_PULL0_ACCESS_ENABLED 0x00000001 +#define PFIFO_CACHE0_PULL0_HASH_SUCCEEDED 0x00000000 +#define PFIFO_CACHE0_PULL0_HASH_FAILED 0x00000010 +#define PFIFO_CACHE0_PULL0_DEVICE_HARDWARE 0x00000000 +#define PFIFO_CACHE0_PULL0_DEVICE_SOFTWARE 0x00000100 +#define PFIFO_CACHE0_PULL0_HASH_STATE_IDLE 0x00000000 +#define PFIFO_CACHE0_PULL0_HASH_STATE_BUSY 0x00001000 + +#define PFIFO_CACHE1_PULL0 0x00003250 +#define PFIFO_CACHE1_PULL0_ACCESS_DISABLED 0x00000000 +#define PFIFO_CACHE1_PULL0_ACCESS_ENABLED 0x00000001 +#define PFIFO_CACHE1_PULL0_HASH_SUCCEEDED 0x00000000 +#define PFIFO_CACHE1_PULL0_HASH_FAILED 0x00000010 +#define PFIFO_CACHE1_PULL0_DEVICE_HARDWARE 0x00000000 +#define PFIFO_CACHE1_PULL0_DEVICE_SOFTWARE 0x00000100 +#define PFIFO_CACHE1_PULL0_HASH_STATE_IDLE 0x00000000 +#define PFIFO_CACHE1_PULL0_HASH_STATE_BUSY 0x00001000 +#define PFIFO_CACHE1_PULL0_ACQUIRE_STATE_IDLE 0x00000000 +#define PFIFO_CACHE1_PULL0_ACQUIRE_STATE_BUSY 0x00010000 +#define PFIFO_CACHE1_PULL0_SEMAPHORE_NO_ERROR 0x00000000 +#define PFIFO_CACHE1_PULL0_SEMAPHORE_BAD_ARG 0x00100000 +#define PFIFO_CACHE1_PULL0_SEMAPHORE_ISTATE 0x00200000 + +#define PFIFO_CACHE0_PULL1 0x00003054 +#define PFIFO_CACHE0_PULL1_ENGINE_SW 0x00000000 +#define PFIFO_CACHE0_PULL1_ENGINE_GRAPHICS 0x00000001 +#define PFIFO_CACHE0_PULL1_ENGINE_DVD 0x00000002 + +#define PFIFO_CACHE1_PULL1 0x00003254 +#define PFIFO_CACHE1_PULL1_ENGINE_SW 0x00000000 +#define PFIFO_CACHE1_PULL1_ENGINE_GRAPHICS 0x00000001 +#define PFIFO_CACHE1_PULL1_ENGINE_DVD 0x00000002 + +#define PFIFO_CACHE1_PULL1_ACQUIRE 0x00000010 +#define PFIFO_CACHE1_PULL1_ACQUIRE_INACTIVE 0x00000000 +#define PFIFO_CACHE1_PULL1_ACQUIRE_ACTIVE 0x00000010 + +#define PFIFO_CACHE1_PULL1_SEM_TARGET_NODE 0x00030000 +#define PFIFO_CACHE1_PULL1_SEM_TARGET_NODE_NVM 0x00000000 +#define PFIFO_CACHE1_PULL1_SEM_TARGET_NODE_PCI 0x00020000 +#define PFIFO_CACHE1_PULL1_SEM_TARGET_NODE_AGP 0x00030000 + +#define PFIFO_CACHE0_HASH 0x00003058 +#define PFIFO_CACHE0_HASH_INSTANCE_MSK 0x0000FFFF + +#define PFIFO_CACHE1_HASH 0x00003258 +#define PFIFO_CACHE1_HASH_INSTANCE_MSK 0x0000FFFF + +#define PFIFO_CACHE1_ACQUIRE_0 0x00003260 + +#define PFIFO_CACHE1_ACQUIRE_1 0x00003264 + +#define PFIFO_CACHE1_ACQUIRE_2 0x00003268 + +#define PFIFO_CACHE1_SEMAPHORE 0x0000326C +#define PFIFO_CACHE1_SEMAPHORE_CTXDMA_INVALID 0x00000000 +#define PFIFO_CACHE1_SEMAPHORE_CTXDMA_VALID 0x00000001 +#define PFIFO_CACHE1_SEMAPHORE_OFFSET_MSK 0x00000FFC +#define PFIFO_CACHE1_SEMAPHORE_PAGE_ADDRESS_MSK 0xFFFFF000 + +#define PFIFO_CACHE0_STATUS 0x00003014 +#define PFIFO_CACHE0_STATUS_LOW_MARK_NOT_EMPTY 0x00000000 +#define PFIFO_CACHE0_STATUS_LOW_MARK_EMPTY 0x00000010 +#define PFIFO_CACHE0_STATUS_HIGH_MARK_NOT_FULL 0x00000000 +#define PFIFO_CACHE0_STATUS_HIGH_MARK_FULL 0x00000100 + +#define PFIFO_CACHE1_STATUS 0x00003214 +#define PFIFO_CACHE1_STATUS_LOW_MARK_NOT_EMPTY 0x00000000 +#define PFIFO_CACHE1_STATUS_LOW_MARK_EMPTY 0x00000010 +#define PFIFO_CACHE1_STATUS_HIGH_MARK_NOT_FULL 0x00000000 +#define PFIFO_CACHE1_STATUS_HIGH_MARK_FULL 0x00000100 + +#define PFIFO_CACHE1_STATUS1 0x00003218 +#define PFIFO_CACHE1_STATUS1_RANOUT_FALSE 0x00000000 +#define PFIFO_CACHE1_STATUS1_RANOUT_TRUE 0x00000001 + +#define PFIFO_CACHE0_PUT 0x00003010 + +#define PFIFO_CACHE1_PUT 0x00003210 + +#define PFIFO_CACHE0_GET 0x00003070 + +#define PFIFO_CACHE1_GET 0x00003270 + +#define PFIFO_CACHE0_ENGINE 0x00003080 +#define PFIFO_CACHE0_ENGINE_0_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_0_GRAPHICS 0x00000001 +#define PFIFO_CACHE0_ENGINE_0_DVD 0x00000002 +#define PFIFO_CACHE0_ENGINE_1_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_1_GRAPHICS 0x00000010 +#define PFIFO_CACHE0_ENGINE_1_DVD 0x00000020 +#define PFIFO_CACHE0_ENGINE_2_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_2_GRAPHICS 0x00000100 +#define PFIFO_CACHE0_ENGINE_2_DVD 0x00000200 +#define PFIFO_CACHE0_ENGINE_3_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_3_GRAPHICS 0x00001000 +#define PFIFO_CACHE0_ENGINE_3_DVD 0x00002000 +#define PFIFO_CACHE0_ENGINE_4_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_4_GRAPHICS 0x00010000 +#define PFIFO_CACHE0_ENGINE_4_DVD 0x00020000 +#define PFIFO_CACHE0_ENGINE_5_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_5_GRAPHICS 0x00100000 +#define PFIFO_CACHE0_ENGINE_5_DVD 0x00200000 +#define PFIFO_CACHE0_ENGINE_6_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_6_GRAPHICS 0x01000000 +#define PFIFO_CACHE0_ENGINE_6_DVD 0x02000000 +#define PFIFO_CACHE0_ENGINE_7_SW 0x00000000 +#define PFIFO_CACHE0_ENGINE_7_GRAPHICS 0x10000000 +#define PFIFO_CACHE0_ENGINE_7_DVD 0x20000000 + +#define PFIFO_CACHE1_ENGINE 0x00003280 +#define PFIFO_CACHE1_ENGINE_0_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_0_GRAPHICS 0x00000001 +#define PFIFO_CACHE1_ENGINE_0_DVD 0x00000002 +#define PFIFO_CACHE1_ENGINE_1_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_1_GRAPHICS 0x00000010 +#define PFIFO_CACHE1_ENGINE_1_DVD 0x00000020 +#define PFIFO_CACHE1_ENGINE_2_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_2_GRAPHICS 0x00000100 +#define PFIFO_CACHE1_ENGINE_2_DVD 0x00000200 +#define PFIFO_CACHE1_ENGINE_3_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_3_GRAPHICS 0x00001000 +#define PFIFO_CACHE1_ENGINE_3_DVD 0x00002000 +#define PFIFO_CACHE1_ENGINE_4_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_4_GRAPHICS 0x00010000 +#define PFIFO_CACHE1_ENGINE_4_DVD 0x00020000 +#define PFIFO_CACHE1_ENGINE_5_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_5_GRAPHICS 0x00100000 +#define PFIFO_CACHE1_ENGINE_5_DVD 0x00200000 +#define PFIFO_CACHE1_ENGINE_6_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_6_GRAPHICS 0x01000000 +#define PFIFO_CACHE1_ENGINE_6_DVD 0x02000000 +#define PFIFO_CACHE1_ENGINE_7_SW 0x00000000 +#define PFIFO_CACHE1_ENGINE_7_GRAPHICS 0x10000000 +#define PFIFO_CACHE1_ENGINE_7_DVD 0x20000000 + +#define PFIFO_CACHE0_METHOD 0x00003100 +#define PFIFO_CACHE0_METHOD_ADDRESS_MSK 0x00001FFC +#define PFIFO_CACHE0_METHOD_SUBCHANNEL_MSK 0x0000E000 + +#define PFIFO_CACHE1_METHOD 0x00003800 +#define PFIFO_CACHE1_METHOD_ADDRESS_MSK 0x00001FFC +#define PFIFO_CACHE1_METHOD_SUBCHANNEL_MSK 0x0000E000 + +#define PFIFO_CACHE1_METHOD_ALIAS 0x00003C00 + +#define PFIFO_CACHE0_DATA 0x00003104 + +#define PFIFO_CACHE1_DATA 0x00003804 + +#define PFIFO_CACHE1_DATA_ALIAS 0x00003C04 + +#define PFIFO_DEVICE 0x00002800 +#define PFIFO_DEVICE_CHID_MSK 0x0000001F +#define PFIFO_DEVICE_SWITCH 0x01000000 +#define PFIFO_DEVICE_SWITCH_UNAVAILABLE 0x00000000 +#define PFIFO_DEVICE_SWITCH_AVAILABLE 0x01000000 + +#define PFIFO_RUNOUT_STATUS 0x00002400 +#define PFIFO_RUNOUT_STATUS_RANOUT_FALSE 0x00000000 +#define PFIFO_RUNOUT_STATUS_RANOUT_TRUE 0x00000001 +#define PFIFO_RUNOUT_STATUS_LOW_MARK_NOT_EMPTY 0x00000000 +#define PFIFO_RUNOUT_STATUS_LOW_MARK_EMPTY 0x00000010 +#define PFIFO_RUNOUT_STATUS_HIGH_MARK_NOT_FULL 0x00000000 +#define PFIFO_RUNOUT_STATUS_HIGH_MARK_FULL 0x00000100 + +#define PFIFO_RUNOUT_PUT 0x00002410 +#define PFIFO_RUNOUT_PUT_ADDRES_MSK 0x00001FF8 + +#define PFIFO_RUNOUT_GET 0x00002420 +#define PFIFO_RUNOUT_GET_ADDRESS_MSK 0x00003FF8 + + + +/* PVIDEO */ +#define PVIDEO 0x00008000 + +#define PVIDEO_DEBUG_0 0x00008080 +#define PVIDEO_DEBUG_0_HLF_RATE_ROW_RD_DISABLED 0x00000000 +#define PVIDEO_DEBUG_0_HLF_RATE_ROW_RD_ENABLED 0x00000001 +#define PVIDEO_DEBUG_0_LIMIT_CHECK_DISABLED 0x00000000 +#define PVIDEO_DEBUG_0_LIMIT_CHECK_ENABLED 0x00000010 +#define PVIDEO_DEBUG_0_HUE_FOLD_DISABLED 0x00000000 +#define PVIDEO_DEBUG_0_HUE_FOLD_ENABLED 0x00000100 + +#define PVIDEO_DEBUG_1 0x00008084 +#define PVIDEO_DEBUG_1_REQ_DELAY_MSK 0x000007FF +#define PVIDEO_DEBUG_1_REQ_DELAY_DEFAULT 0x00000064 +#define PVIDEO_DEBUG_1_REQ_DELAY_INIT 0x00000050 + +#define PVIDEO_DEBUG_2 0x00008088 +#define PVIDEO_DEBUG_2_BURST1_MSK 0x000007E0 +#define PVIDEO_DEBUG_2_BURST1_DEFAULT 0x00000100 +#define PVIDEO_DEBUG_2_BURST1_INIT 0x00000200 +#define PVIDEO_DEBUG_2_BURST2_MSK 0x07E00000 +#define PVIDEO_DEBUG_2_BURST2_DEFAULT 0x02000000 + +#define PVIDEO_DEBUG_3 0x0000808C +#define PVIDEO_DEBUG_3_WATER_MARK1_MSK 0x000007F0 +#define PVIDEO_DEBUG_3_WATER_MARK1_DEFAULT 0x000004B0 +#define PVIDEO_DEBUG_3_WATER_MARK1_INIT 0x00000400 +#define PVIDEO_DEBUG_3_WATER_MARK2_MSK 0x07F00000 +#define PVIDEO_DEBUG_3_WATER_MARK2_DEFAULT 0x03B00000 +#define PVIDEO_DEBUG_3_WATER_MARK2_INIT 0x04000000 + +#define PVIDEO_DEBUG_4 0x00008090 +#define PVIDEO_DEBUG_4_V_COEFF_B_MSK 0x00FFFFE0 +#define PVIDEO_DEBUG_4_V_COEFF_B_DEFAULT 0x0016A0A0 +#define PVIDEO_DEBUG_4_V_COEFF_B_ALWAYS 0x00000000 +#define PVIDEO_DEBUG_4_V_COEFF_B_NEVER 0x00FFFFE0 + +#define PVIDEO_DEBUG_5 0x00008094 +#define PVIDEO_DEBUG_5_H_L_COEFF_D_MSK 0x003FFFF0 +#define PVIDEO_DEBUG_5_H_L_COEFF_D_DEFAULT 0x00188160 +#define PVIDEO_DEBUG_5_H_L_COEFF_D_ALWAYS 0x00000000 +#define PVIDEO_DEBUG_5_H_L_COEFF_D_NEVER 0x003FFFF0 + +#define PVIDEO_DEBUG_6 0x00008098 +#define PVIDEO_DEBUG_6_H_L_COEFF_C_MSK 0x003FFFF0 +#define PVIDEO_DEBUG_6_H_L_COEFF_C_DEFAULT 0x0012C730 +#define PVIDEO_DEBUG_6_H_L_COEFF_C_ALWAYS 0x00000000 +#define PVIDEO_DEBUG_6_H_L_COEFF_C_NEVER 0x003FFFF0 + +#define PVIDEO_DEBUG_7 0x0000809C +#define PVIDEO_DEBUG_7_H_L_COEFF_B_MSK 0x003FFFF0 +#define PVIDEO_DEBUG_7_H_L_COEFF_B_DEFAULT 0x00000000 +#define PVIDEO_DEBUG_7_H_L_COEFF_B_ALWAYS 0x00000000 +#define PVIDEO_DEBUG_7_H_L_COEFF_B_NEVER 0x003FFFF0 + +#define PVIDEO_DEBUG_8 0x000080A0 +#define PVIDEO_DEBUG_8_PIPE_FILL_MSK 0x000007F0 +#define PVIDEO_DEBUG_8_PIPE_FILL_DEFAULT 0x000000B0 + +#define PVIDEO_DEBUG_9 0x000080A4 +#define PVIDEO_DEBUG_9_FIFO_A_UNDERFLOW_FALSE 0x00000000 +#define PVIDEO_DEBUG_9_FIFO_A_UNDERFLOW_TRUE 0x00000001 +#define PVIDEO_DEBUG_9_FIFO_A_UNDERFLOW_RESET 0x00000001 +#define PVIDEO_DEBUG_9_FIFO_A_OVERFLOW_FALSE 0x00000000 +#define PVIDEO_DEBUG_9_FIFO_A_OVERFLOW_TRUE 0x00000010 +#define PVIDEO_DEBUG_9_FIFO_A_OVERFLOW_RESET 0x00000010 +#define PVIDEO_DEBUG_9_FIFO_B_UNDERFLOW_FALSE 0x00000000 +#define PVIDEO_DEBUG_9_FIFO_B_UNDERFLOW_TRUE 0x00000100 +#define PVIDEO_DEBUG_9_FIFO_B_UNDERFLOW_RESET 0x00000100 +#define PVIDEO_DEBUG_9_FIFO_B_OVERFLOW_FALSE 0x00000000 +#define PVIDEO_DEBUG_9_FIFO_B_OVERFLOW_TRUE 0x00001000 +#define PVIDEO_DEBUG_9_FIFO_B_OVERFLOW_RESET 0x00001000 + +#define PVIDEO_DEBUG_10 0x000080A8 +#define PVIDEO_DEBUG_10_SCREEN_LINE_MSK 0x00001FFF +#define PVIDEO_DEBUG_10_SCREEN_LINE_FIRST 0x00000000 +#define PVIDEO_DEBUG_10_SCAN_COUNT_MSK 0x001F0000 +#define PVIDEO_DEBUG_10_SCAN_COUNT_FIRST 0x00000000 +#define PVIDEO_DEBUG_10_SCAN_COUNT_OVERFLOW 0x00100000 +#define PVIDEO_DEBUG_10_SCANNING_NEITHER 0x00000000 +#define PVIDEO_DEBUG_10_SCANNING_BUFFER_0 0x02000000 +#define PVIDEO_DEBUG_10_SCANNING_BUFFER_1 0x03000000 + +#define PVIDEO_INTR 0x00008100 +#define PVIDEO_INTR_BUFFER_0_NOT_PENDING 0x00000000 +#define PVIDEO_INTR_BUFFER_0_PENDING 0x00000001 +#define PVIDEO_INTR_BUFFER_0_RESET 0x00000001 +#define PVIDEO_INTR_BUFFER_1_NOT_PENDING 0x00000000 +#define PVIDEO_INTR_BUFFER_1_PENDING 0x00000010 +#define PVIDEO_INTR_BUFFER_1_RESET 0x00000010 + +#define PVIDEO_INTR_REASON 0x00008104 +#define PVIDEO_INTR_REASON_BUFFER_0_NOTIFICATION 0x00000000 +#define PVIDEO_INTR_REASON_BUFFER_0_PROTECTION_FAULT 0x00000001 +#define PVIDEO_INTR_REASON_BUFFER_1_NOTIFICATION 0x00000000 +#define PVIDEO_INTR_REASON_BUFFER_1_PROTECTION_FAULT 0x00000010 + +#define PVIDEO_INTR_EN 0x00008140 +#define PVIDEO_INTR_EN_BUFFER_0_DISABLED 0x00000000 +#define PVIDEO_INTR_EN_BUFFER_0_ENABLED 0x00000001 +#define PVIDEO_INTR_EN_BUFFER_1_DISABLED 0x00000000 +#define PVIDEO_INTR_EN_BUFFER_1_ENABLED 0x00000010 + +#define PVIDEO_BUFFER 0x00008700 +#define PVIDEO_BUFFER_0_USE_NOT_PENDING 0x00000000 +#define PVIDEO_BUFFER_0_USE_PENDING 0x00000001 +#define PVIDEO_BUFFER_0_USE_SET 0x00000001 +#define PVIDEO_BUFFER_1_USE_NOT_PENDING 0x00000000 +#define PVIDEO_BUFFER_1_USE_PENDING 0x00000010 +#define PVIDEO_BUFFER_1_USE_SET 0x00000010 + +#define PVIDEO_STOP 0x00008704 +#define PVIDEO_STOP_OVERLAY_INACTIVE 0x00000000 +#define PVIDEO_STOP_OVERLAY_ACTIVE 0x00000001 +#define PVIDEO_STOP_METHOD_IMMEDIATELY 0x00000000 +#define PVIDEO_STOP_METHOD_NORMALLY 0x00000010 + +#define PVIDEO_UVBASE_0 0x00008800 +#define PVIDEO_UVBASE_1 0x00008804 +#define PVIDEO_UVBASE_MSK 0xFFFFFFC0 + +#define PVIDEO_UVLIMIT_0 0x00008808 +#define PVIDEO_UVLIMIT_1 0x0000880C + +#define PVIDEO_UVOFFSET_0 0x00008820 +#define PVIDEO_UVOFFSET_1 0x00008824 +#define PVIDEO_UVOFFSET_MSK 0xFFFFFFC0 + +#define PVIDEO_BASE_0 0x00008900 +#define PVIDEO_BASE_1 0x00008904 +#define PVIDEO_BASE_MSK 0xFFFFFFC0 + +#define PVIDEO_LIMIT_0 0x00008908 +#define PVIDEO_LIMIT_1 0x0000890C + +#define PVIDEO_LUMINANCE_0 0x00008910 +#define PVIDEO_LUMINANCE_1 0x00008914 + +#define PVIDEO_CHROMINANCE_0 0x00008918 +#define PVIDEO_CHROMINANCE_1 0x0000891C + +#define PVIDEO_OFFSET_0 0x00008920 +#define PVIDEO_OFFSET_1 0x00008924 +#define PVIDEO_OFFSET_MSK 0xFFFFFFC0 + +#define PVIDEO_SIZE_IN_0 0x00008928 +#define PVIDEO_SIZE_IN_1 0x0000892C +#define PVIDEO_SIZE_IN_WIDTH_MSK 0x000007FF +#define PVIDEO_SIZE_IN_HEIGHT_MSK 0x07FF0000 + +#define PVIDEO_POINT_IN_0 0x00008930 +#define PVIDEO_POINT_IN_1 0x00008934 +#define PVIDEO_POINT_IN_S_MSK 0x00007FFF +#define PVIDEO_POINT_IN_T_MSK 0xFFFE0000 + +#define PVIDEO_DS_DX_0 0x00008938 +#define PVIDEO_DS_DX_1 0x0000893C + +#define PVIDEO_DT_DY_0 0x00008940 +#define PVIDEO_DT_DY_1 0x00008944 + +#define PVIDEO_POINT_OUT_0 0x00008948 +#define PVIDEO_POINT_OUT_1 0x0000894C +#define PVIDEO_POINT_OUT_X_MSK 0x00000FFF +#define PVIDEO_POINT_OUT_Y_MSK 0x0FFF0000 + +#define PVIDEO_SIZE_OUT_0 0x00008950 +#define PVIDEO_SIZE_OUT_1 0x00008954 +#define PVIDEO_SIZE_OUT_WIDTH_MSK 0x00000FFF +#define PVIDEO_SIZE_OUT_HEIGHT_MSK 0x0FFF0000 + +#define PVIDEO_FORMAT_0 0x00008958 +#define PVIDEO_FORMAT_1 0x0000895C +#define PVIDEO_FORMAT_PLANAR_NV 0x00000001 +#define PVIDEO_FORMAT_PITCH_MSK 0x00001FC0 +#define PVIDEO_FORMAT_COLOR_YB8CR8YA8CB8 0x00000000 +#define PVIDEO_FORMAT_COLOR_CR8YB8CB8YA8 0x00010000 +#define PVIDEO_FORMAT_COLOR_ECR8EYB8ECB8EYA8 0x00110000 +#define PVIDEO_FORMAT_DISPLAY_ALWAYS 0x00000000 +#define PVIDEO_FORMAT_DISPLAY_COLOR_KEY_EQUAL 0x00100000 +#define PVIDEO_FORMAT_MATRIX_ITURBT601 0x00000000 +#define PVIDEO_FORMAT_MATRIX_ITURBT709 0x01000000 + +#define PVIDEO_COLOR_KEY 0x00008B00 + +#define PVIDEO_TEST 0x00008D00 +#define PVIDEO_TEST_MODE_DISABLE 0x00000000 +#define PVIDEO_TEST_MODE_ENABLE 0x00000001 +#define PVIDEO_TEST_ADDRESS_MSK 0x00007F00 + +/* Array [0...11] */ +#define PVIDEO_TST_WRITE 0x00008D10 + +/* Array [0...11] */ +#define PVIDEO_TST_READ 0x00008D40 + + + +/* PTIMER */ +#define PTIMER 0x00009000 + + + +/* PVIO */ +#define PVIO 0x000C0000 + +#define PVIO_SEQ_INDEX 0x000C03C4 + +#define PVIO_SEQ_DATA 0x000C03C5 + +#define PVIO_GRA_INDEX 0x000C03CE + +#define PCIO_GRA_DATA 0x000C03CF + + + +/* PVGA */ +#define PVGA 0x000A0000 + + + +/* PFB */ +#define PFB 0x00100000 + +#define PFB_BOOT_0 0x00100000 +#define PFB_BOOT_0_RAM_AMOUNT_32MB 0x00000000 +#define PFB_BOOT_0_RAM_AMOUNT_4MB 0x00000001 +#define PFB_BOOT_0_RAM_AMOUNT_8MB 0x00000002 +#define PFB_BOOT_0_RAM_AMOUNT_16MB 0x00000003 +#define PFB_BOOT_0_RAM_WIDTH_128 0x00000004 +#define PFB_BOOT_0_RAM_TYPE_SGRAM_8MBIT 0x00000000 +#define PFB_BOOT_0_RAM_TYPE_SGRAM_16MBIT 0x00000008 +#define PFB_BOOT_0_RAM_TYPE_SGRAM_16MBIT_4BANK 0x00000010 +#define PFB_BOOT_0_RAM_TYPE_SDRAM_16MBIT 0x00000018 +#define PFB_BOOT_0_RAM_TYPE_SDRAM_64MBIT 0x00000020 +#define PFB_BOOT_0_RAM_TYPE_SDRAM_64MBITX16 0x00000028 + + + +/* PEXTDEV */ +#define PEXTDEV 0x00101000 + + + +/* PGRAPH */ +#define PGRAPH 0x00400000 + +#define PGRAPH_DEBUG_0 0x00400080 + +#define PGRAPH_DEBUG_1 0x00400084 + +#define PGRAPH_DEBUG_2 0x00400088 + +#define PGRAPH_DEBUG_3 0x0040008C + +#define PGRAPH_DEBUG_4 0x00400090 + +#define PGRAPH_DEBUG_5 0x00400094 + +#define PGRAPH_DEBUG_6 0x00400820 + +#define PGRAPH_INTR 0x00400100 + +#define PGRAPH_NSTATUS 0x00400104 + +#define PGRAPH_NSOURCE 0x00400108 + +#define PGRAPH_INTR_EN 0x00400140 + +#define PGRAPH_FIFO 0x00400720 +#define PGRAPH_FIFO_ACCESS_DISABLED 0x00000000 +#define PGRAPH_FIFO_ACCESS_ENABLED 0x00000001 + +#define PGRAPH_STATUS 0x00400700 +#define PGRAPH_STATUS_STATE_IDLE 0x00000000 +#define PGRAPH_STATUS_STATE_BUSY 0x00000001 +#define PGRAPH_STATUS_FINE_RASTERIZER_IDLE 0x00000000 +#define PGRAPH_STATUS_FINE_RASTERIZER_BUSY 0x00000002 +#define PGRAPH_STATUS_COARSE_RASTERIZER_IDLE 0x00000000 +#define PGRAPH_STATUS_COARSE_RASTERIZER_BUSY 0x00000004 +#define PGRAPH_STATUS_FE_3D_IDLE 0x00000000 +#define PGRAPH_STATUS_FE_3D_BUSY 0x00000008 +#define PGRAPH_STATUS_FE_2D_IDLE 0x00000000 +#define PGRAPH_STATUS_FE_2D_BUSY 0x00000010 +#define PGRAPH_STATUS_XY_LOGIC_IDLE 0x00000000 +#define PGRAPH_STATUS_XY_LOGIC_BUSY 0x00000020 +#define PGRAPH_STATUS_RASTERIZER_2D_IDLE 0x00000000 +#define PGRAPH_STATUS_RASTERIZER_2D_BUSY 0x00000080 +#define PGRAPH_STATUS_IDX_IDLE 0x00000000 +#define PGRAPH_STATUS_IDX_BUSY 0x00000100 +#define PGRAPH_STATUS_XF_IDLE 0x00000000 +#define PGRAPH_STATUS_XF_BUSY 0x00000200 +#define PGRAPH_STATUS_VTX_IDLE 0x00000000 +#define PGRAPH_STATUS_VTX_BUSY 0x00000400 +#define PGRAPH_STATUS_CAS_IDLE 0x00000000 +#define PGRAPH_STATUS_CAS_BUSY 0x00000800 +#define PGRAPH_STATUS_PORT_NOTIFY_IDLE 0x00000000 +#define PGRAPH_STATUS_PORT_NOTIFY_BUSY 0x00001000 +#define PGRAPH_STATUS_SHADER_IDLE 0x00000000 +#define PGRAPH_STATUS_SHADER_BUSY 0x00002000 +#define PGRAPH_STATUS_SHADER_BE_IDLE 0x00000000 +#define PGRAPH_STATUS_SHADER_BE_BUSY 0x00004000 +#define PGRAPH_STATUS_PORT_DMA_IDLE 0x00000000 +#define PGRAPH_STATUS_PORT_DMA_BUSY 0x00010000 +#define PGRAPH_STATUS_DMA_ENGINE_IDLE 0x00000000 +#define PGRAPH_STATUS_DMA_ENGINE_BUSY 0x00020000 +#define PGRAPH_STATUS_DMA_NOTIFY_IDLE 0x00000000 +#define PGRAPH_STATUS_DMA_NOTIFY_BUSY 0x00100000 +#define PGRAPH_STATUS_DMA_BUFFER_NOTIFY_IDLE 0x00000000 +#define PGRAPH_STATUS_DMA_BUFFER_NOTIFY_BUSY 0x00200000 +#define PGRAPH_STATUS_DMA_WARNING_NOTIFY_IDLE 0x00000000 +#define PGRAPH_STATUS_DMA_WARNING_NOTIFY_BUSY 0x00400000 +#define PGRAPH_STATUS_ZCULL_IDLE 0x00000000 +#define PGRAPH_STATUS_ZCULL_BUSY 0x00800000 +#define PGRAPH_STATUS_FDIFF_IDLE 0x00000000 +#define PGRAPH_STATUS_FDIFF_BUSY 0x01000000 +#define PGRAPH_STATUS_SETUP_IDLE 0x00000000 +#define PGRAPH_STATUS_SETUP_BUSY 0x02000000 +#define PGRAPH_STATUS_CACHE_IDLE 0x00000000 +#define PGRAPH_STATUS_CACHE_BUSY 0x04000000 +#define PGRAPH_STATUS_COMBINER_IDLE 0x00000000 +#define PGRAPH_STATUS_COMBINER_BUSY 0x08000000 +#define PGRAPH_STATUS_PREROP_IDLE 0x00000000 +#define PGRAPH_STATUS_PREROP_BUSY 0x10000000 +#define PGRAPH_STATUS_ROP_IDLE 0x00000000 +#define PGRAPH_STATUS_ROP_BUSY 0x20000000 +#define PGRAPH_STATUS_PORT_USER_IDLE 0x00000000 +#define PGRAPH_STATUS_PORT_USER_BUSY 0x40000000 +#define PGRAPH_STATUS_PORT_FB_IDLE 0x00000000 +#define PGRAPH_STATUS_PORT_FB_BUSY 0x80000000 + +#define NV10_PGRAPH_WINDOWCLIP_HORIZONTAL 0x00400F00 + +#define NV10_PGRAPH_WINDOWCLIP_VERTICAL 0x00400F20 + +#define NV10_PGRAPH_XFMODE0 0x00400F40 + +#define NV10_PGRAPH_XFMODE1 0x00400F44 + +#define NV10_PGRAPH_GLOBALSTATE0 0x00400F48 + +#define NV10_PGRAPH_GLOBALSTATE1 0x00400F4C + +#define NV10_PGRAPH_PIPE_ADDRESS 0x00400F50 + +#define NV10_PGRAPH_PIPE_DATA 0x00400F54 + + + +/* PCRTC */ +#define PCRTC 0x00600000 + +#define PCRTC_INTR 0x00600100 +#define PCRTC_INTR_VBLANK_RESET 0x00000001 + +#define PCRTC_INTR_EN 0x00600140 +#define PCRTC_INTR_EN_VBLANK_DISABLED 0x00000000 +#define PCRTC_INTR_EN_VBLANK_ENABLED 0x00000001 + +#define PCRTC_START 0x00600800 + +#define PCRTC_CONFIG 0x00600804 +#define PCRTC_CONFIG_SIGNAL_VGA 0x00000000 +#define PCRTC_CONFIG_SIGNAL_NON_VGA 0x00000001 +#define PCRTC_CONFIG_SIGNAL_HSYNC 0x00000002 +#define PCRTC_CONFIG_ENDIAN 0x80000000 +#define PCRTC_CONFIG_ENDIAN_LITTLE 0x00000000 +#define PCRTC_CONFIG_ENDIAN_BIG 0x80000000 + +#define PCRTC_RASTER 0x00600808 +#define PCRTC_RASTER_POSITION_MSK 0x000007FF +#define PCRTC_RASTER_SA_LOAD_DISPLAY 0x00000000 +#define PCRTC_RASTER_SA_LOAD_BEFORE 0x00001000 +#define PCRTC_RASTER_SA_LOAD_AFTER 0x00002000 +#define PCRTC_RASTER_VERT_BLANK_ACTIVE 0x00010000 +#define PCRTC_RASTER_VERT_BLANK_INACTIVE 0x00000000 +#define PCRTC_RASTER_FIELD_EVEN 0x00000000 +#define PCRTC_RASTER_FIELD_ODD 0x00100000 +#define PCRTC_RASTER_STEREO_LEFT 0x00000000 +#define PCRTC_RASTER_STEREO_RIGHT 0x01000000 + + + +/* PCRTC2 */ +#define PCRTC2 0x00600800 + +#define PCRTC2_INTR 0x00600900 +#define PCRTC2_INTR_VBLANK_RESET 0x00000001 + +#define PCRTC2_INTR_EN 0x00600940 +#define PCRTC2_INTR_EN_VBLANK_DISABLED 0x00000000 +#define PCRTC2_INTR_EN_VBLANK_ENABLED 0x00000001 + +#define PCRTC2_START 0x00601000 + +#define PCRTC2_CONFIG 0x00601004 +#define PCRTC2_CONFIG_SIGNAL_VGA 0x00000000 +#define PCRTC2_CONFIG_SIGNAL_NON_VGA 0x00000001 +#define PCRTC2_CONFIG_SIGNAL_HSYNC 0x00000002 +#define PCRTC2_CONFIG_ENDIAN 0x80000000 +#define PCRTC2_CONFIG_ENDIAN_LITTLE 0x00000000 +#define PCRTC2_CONFIG_ENDIAN_BIG 0x80000000 + +#define PCRTC2_RASTER 0x00601008 +#define PCRTC2_RASTER_POSITION_MSK 0x000007FF +#define PCRTC2_RASTER_SA_LOAD_DISPLAY 0x00000000 +#define PCRTC2_RASTER_SA_LOAD_BEFORE 0x00001000 +#define PCRTC2_RASTER_SA_LOAD_AFTER 0x00002000 +#define PCRTC2_RASTER_VERT_BLANK_ACTIVE 0x00010000 +#define PCRTC2_RASTER_VERT_BLANK_INACTIVE 0x00000000 +#define PCRTC2_RASTER_FIELD_EVEN 0x00000000 +#define PCRTC2_RASTER_FIELD_ODD 0x00100000 +#define PCRTC2_RASTER_STEREO_LEFT 0x00000000 +#define PCRTC2_RASTER_STEREO_RIGHT 0x01000000 + + + +/* PCIO */ +#define PCIO 0x00601000 + +#define PCIO_ATTR_INDEX 0x006013C0 + +#define PCIO_ATTR_DATA 0x006013C1 + +#define PCIO_CRTC_INDEX 0x006013D4 + +#define PCIO_CRTC_DATA 0x006013D5 + +/* CRTC Registers */ +#define CRTC_HORIZ_TOTAL 0x00 +#define CRTC_HORIZ_DISPLAY_END 0x01 +#define CRTC_HORIZ_BLANK_START 0x02 +#define CRTC_HORIZ_BLANK_END 0x03 +#define CRTC_HORIZ_RETRACE_START 0x04 +#define CRTC_HORIZ_RETRACE_END 0x05 +#define CRTC_VERT_TOTAL 0x06 +#define CRTC_OVERFLOW 0x07 +#define CRTC_PRESET_ROW_SCAN 0x08 +#define CRTC_MAX_SCAN_LINE 0x09 +#define CRTC_CURSOR_START 0x0A +#define CRTC_CURSOR_END 0x0B +#define CRTC_START_ADDR_HIGH 0x0C +#define CRTC_START_ADDR_LOW 0x0D +#define CRTC_CURSOR_LOCATION_HIGH 0x0E +#define CRTC_CURSOR_LOCATION_LOW 0x0F +#define CRTC_VERT_RETRACE_START 0x10 +#define CRTC_VERT_RETRACE_END 0x11 +#define CRTC_VERT_DISPLAY_END 0x12 +#define CRTC_OFFSET 0x13 +#define CRTC_UNDERLINE_LOCATION 0x14 +#define CRTC_VERT_BLANK_START 0x15 +#define CRTC_VERT_BLANK_END 0x16 +#define CRTC_MODE_CONTROL 0x17 +#define CRTC_LINE_COMPARE 0x18 +#define CRTC_REPAINT0 0x19 +#define CRTC_HORIZ_EXTRA 0x2d +#define CRTC_EXTRA 0x25 +#define CRTC_FIFO_CONTROL 0x1b +#define CRTC_FIFO 0x20 +#define CRTC_REPAINT1 0x1a +#define CRTC_GRCURSOR0 0x30 +#define CRTC_GRCURSOR1 0x31 +#define CRTC_PIXEL 0x28 + +#define PCIO_CRTC_STATUS 0x006013DA + + + +/* PRAMDAC */ +#define PRAMDAC 0x00680000 + + + +/* PDIO */ +#define PDIO 0x00681000 + + + +/* PRAMIN */ +#define PRAMIN 0x00700000 + + + +/* PRAMHT */ +#define PRAMHT 0x00710000 + + + +/*************************** FIFO Registers ******************************/ + + +#define FIFO_ADDRESS 0x00800000 + +#define FIFO_FREE 0x00800010 + +#define DMA_PUT 0x00800040 + +#define DMA_GET 0x00800044 + + +/* + * Generic subchannel registers + */ +#define SET_OBJECT 0x00000000 + + +/* + * 2D surfaces + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextDmaSource; /* 0184-0187 */ + u32 SetContextDmaDestin; /* 0188-018B */ + u32 Reserved01[0x05D]; + u32 Format; /* 0300-0303 */ + u32 Pitch; /* 0304-0307 */ + u32 SourceOffset; /* 0308-030B */ + u32 DestOffset; /* 030C-030F */ + u32 Reserved02[0x73C]; +} NVSurfaces2D; +#define SURFACES2D_FORMAT 0x00000300 +#define SURFACES2D_FORMAT_Y8 0x00000001 +#define SURFACES2D_FORMAT_X1R5G5B5 0x00000002 +#define SURFACES2D_FORMAT_A1R5G5B5 0x00000003 +#define SURFACES2D_FORMAT_R5G6B5 0x00000004 +#define SURFACES2D_FORMAT_Y16 0x00000005 +#define SURFACES2D_FORMAT_X8R8G8B8 0x00000006 +#define SURFACES2D_FORMAT_A8R8G8B8 0x0000000A +#define SURFACES2D_FORMAT_Y32 0x0000000B +#define SURFACES2D_PITCH 0x00000304 +#define SURFACES2D_SRC_OFFSET 0x00000308 +#define SURFACES2D_DST_OFFSET 0x0000030C + +/* + * 3D surfaces + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextDmaColor; /* 0184-0187 */ + u32 SetContextDmaZeta; /* 0188-018B */ + u32 Reserved01[0x05B]; + u32 ClipHorizontal; /* 02F8-02FB */ + u32 ClipVertical; /* 02FC-02FF */ + u32 Format; /* 0300-0303 */ + u32 ClipSize; /* 0304-0307 */ + u32 Pitch; /* 0308-030B */ + u32 RenderOffset; /* 030C-030F */ + u32 DepthOffset; /* 0310-0313 */ + u32 Reserved02[0x73B]; +} NVSurfaces3D; +#define SURFACES3D_CLIP_HORIZONTAL 0x000002F8 +#define SURFACES3D_CLIP_VERTICAL 0x000002FC +#define SURFACES3D_FORMAT 0x00000300 +#define SURFACES3D_FORMAT_COLOR_A1R5G5B5 0x00000001 +#define SURFACES3D_FORMAT_COLOR_X1R5G5B5 0x00000002 +#define SURFACES3D_FORMAT_COLOR_R5G6B5 0x00000003 +#define SURAFCES3D_FORMAT_COLOR_X8R8G8B8 0x00000006 +#define SURFACES3D_FORMAT_COLOR_A8R8G8B8 0x00000008 +#define SURFACES3D_FORMAT_TYPE_PITCH 0x00000100 +#define SURFACES3D_FORMAT_TYPE_SWIZZLE 0x00000200 +#define SURFACES3D_CLIP_SIZE 0x00000304 +#define SURFACES3D_PITCH 0x00000308 +#define SURFACES3D_RENDER_OFFSET 0x0000030C +#define SURFACES3D_DEPTH_OFFSET 0x00000310 + +/* + * Scissor clip rectangle + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextDmaImage; /* 0184-0187 */ + u32 Reserved01[0x05E]; + u32 TopLeft; /* 0300-0303 */ + u32 WidthHeight; /* 0304-0307 */ + u32 Reserved02[0x73E]; +} NVClip; +#define CLIP_TOP_LEFT 0x00000300 +#define CLIP_WIDTH_HEIGHT 0x00000304 + +/* + * Global alpha factor + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 Reserved01[0x05F]; + u32 SetBeta1D31; /* 0300-0303 */ + u32 Reserved02[0x73F]; +} NVBeta1; +#define BETA1_FACTOR 0x00000300 + +/* + * Global ARGB factor + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 Reserved01[0x05F]; + u32 SetBetaFactor; /* 0300-0303 */ + u32 Reserved02[0x73F]; +} NVBeta4; +#define BETA4_FACTOR 0x00000300 + +/* + * Generic Flags + */ +/* Operation */ +#define OPERATION_COPY 0 +#define OPERATION_ROP 1 +#define OPERATION_BLEND 2 +#define OPERATION_SRCCOPY 3 +#define OPERATION_COLOR_MULTIPLY 4 +#define OPERATION_BLEND_PREMULTIPLIED 5 +/* ColorConversion */ +#define COLOR_CONVERSION_DITHER 0 +#define COLOR_CONVERSION_TRUNCATE 1 +#define COLOR_CONVERSION_SUBTR_TRUNCATE 2 + +/* + * 2D solid rectangle + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextClip; /* 0184-0187 */ + u32 SetContextPattern; /* 0188-018B */ + u32 SetContextRop; /* 018C-018F */ + u32 SetContextBeta1; /* 0190-0193 */ + u32 SetContextSurface; /* 0194-0197 */ + u32 Reserved01[0x059]; + u32 SetOperation; /* 02FC-02FF */ + u32 SetColorFormat; /* 0300-0303 */ + u32 Color; /* 0304-0307 */ + u32 Reserved02[0x03E]; + u32 TopLeft; /* 0400-0403 */ + u32 WidthHeight; /* 0404-0407 */ + u32 Reserved03[0x6FE]; +} NVRectangle; +#define RECT_OPERATION 0x000002FC +#define RECT_COLOR_FORMAT 0x00000300 +#define RECT_COLOR_FORMAT_Y16 0x00000001 +#define RECT_COLOR_FORMAT_A1Y15 0x00000002 +#define RECT_COLOR_FORMAT_Y32 0x00000003 +#define RECT_COLOR 0x00000304 +#define RECT_TOP_LEFT 0x00000400 +#define RECT_WIDTH_HEIGHT 0x00000404 + +/* + * 2D solid triangle + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextClip; /* 0184-0187 */ + u32 SetContextPattern; /* 0188-018B */ + u32 SetContextRop; /* 018C-018F */ + u32 SetContextBeta1; /* 0190-0193 */ + u32 SetContextSurface; /* 0194-0197 */ + u32 Reserved01[0x059]; + u32 SetOperation; /* 02FC-02FF */ + u32 SetColorFormat; /* 0300-0303 */ + u32 Color; /* 0304-0307 */ + u32 Reserved02[0x002]; + u32 TrianglePoint0; /* 0310-0313 */ + u32 TrianglePoint1; /* 0314-0317 */ + u32 TrianglePoint2; /* 0318-031B */ + u32 Reserved03[0x001]; + s32 Triangle32Point0X; /* 0320-0323 */ + s32 Triangle32Point0Y; /* 0324-0327 */ + s32 Triangle32Point1X; /* 0328-032B */ + s32 Triangle32Point1Y; /* 032C-032F */ + s32 Triangle32Point2X; /* 0330-0333 */ + s32 Triangle32Point2Y; /* 0334-0337 */ + u32 Reserved04[0x032]; + u32 Trimesh[32]; /* 0400-047F */ + struct { /* 0480- */ + s32 x; /* 0- 3 */ + s32 y; /* 4- 7 */ + } Trimesh32[16]; /* -04FF */ + struct { /* 0500- */ + u32 color; /* 0- 3 */ + u32 point0; /* 4- 7 */ + u32 point1; /* 8- B */ + u32 point2; /* C- F */ + } ColorTriangle[8]; /* -057F */ + struct { /* 0580- */ + u32 color; /* 0- 3 */ + u32 point; /* 4- 7 */ + } ColorTrimesh[16]; /* -05FF */ + u32 Reserved05[0x680]; +} NVTriangle; +#define TRI_OPERATION 0x000002FC +#define TRI_COLOR_FORMAT 0x00000300 +#define TRI_COLOR_FORMAT_Y16 0x00000001 +#define TRI_COLOR_FORMAT_A1Y15 0x00000002 +#define TRI_COLOR_FORMAT_Y32 0x00000003 +#define TRI_COLOR 0x00000304 +#define TRI_POINT0 0x00000310 +#define TRI_POINT1 0x00000314 +#define TRI_POINT2 0x00000318 + +/* + * 2D solid + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextClip; /* 0184-0187 */ + u32 SetContextPattern; /* 0188-018B */ + u32 SetContextRop; /* 018C-018F */ + u32 SetContextBeta1; /* 0190-0193 */ + u32 SetContextSurface; /* 0194-0197 */ + u32 Reserved01[0x059]; + u32 SetOperation; /* 02FC-02FF */ + u32 SetColorFormat; /* 0300-0303 */ + u32 Color; /* 0304-0307 */ + u32 Reserved02[0x03E]; + struct { /* 0400- */ + u32 point0; /* 0- 3 */ + u32 point1; /* 4- 7 */ + } Lin[16]; /* -047F */ + struct { /* 0480- */ + u32 point0X; /* 0- 3 */ + u32 point0Y; /* 4- 7 */ + u32 point1X; /* 8- B */ + u32 point1Y; /* C- F */ + } Lin32[8]; /* -04FF */ + u32 PolyLin[32]; /* 0500-057F */ + struct { /* 0580- */ + u32 x; /* 0- 3 */ + u32 y; /* 4- 7 */ + } PolyLin32[16]; /* -05FF */ + struct { /* 0600- */ + u32 color; /* 0- 3 */ + u32 point; /* 4- 7 */ + } ColorPolyLin[16]; /* -067F */ + u32 Reserved03[0x660]; +} NVLine; +#define LINE_OPERATION 0x000002FC +#define LINE_COLOR_FORMAT 0x00000300 +#define LINE_COLOR_FORMAT_Y16 0x00000001 +#define LINE_COLOR_FORMAT_A1Y15 0x00000002 +#define LINE_COLOR_FORMAT_Y32 0x00000003 +#define LINE_COLOR 0x00000304 +#define LINE_POINT0 0x00000400 +#define LINE_POINT1 0x00000404 + +/* + * 2D screen-screen BLT + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 WaitForIdle; /* 0108-010B (09F_WAIT_FOR_IDLE) */ + u32 WaitForSync; /* 010C-010F (09F_WAIT_FOR_CRTC) */ + u32 Reserved00[0x01C]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextColorKey; /* 0184-0187 */ + u32 SetContextClip; /* 0188-018B */ + u32 SetContextPattern; /* 018C-018F */ + u32 SetContextRop; /* 0190-0193 */ + u32 SetContextBeta1; /* 0194-0197 */ + u32 SetContextBeta4; /* 0198-019B */ + u32 SetContextSurface; /* 019C-019F */ + u32 Reserved01[0x057]; + u32 SetOperation; /* 02FC-02FF */ + u32 TopLeftSrc; /* 0300-0303 */ + u32 TopLeftDst; /* 0304-0307 */ + u32 WidthHeight; /* 0308-030B */ + u32 Reserved02[0x73D]; +} NVScreenBlt; +#define BLIT_OPERATION 0x000002FC +#define BLIT_TOP_LEFT_SRC 0x00000300 +#define BLIT_TOP_LEFT_DST 0x00000304 +#define BLIT_WIDTH_HEIGHT 0x00000308 + +/* + * 2D CPU to screen BLT + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextColorKey; /* 0184-0187 */ + u32 SetContextClip; /* 0188-018B */ + u32 SetContextPattern; /* 018C-018F */ + u32 SetContextRop; /* 0190-0193 */ + u32 SetContextBeta1; /* 0194-0197 */ + u32 SetContextBeta4; /* 0198-019B */ + u32 SetContextSurface; /* 019C-019F */ + u32 Reserved01[0x056]; + u32 SetColorConversion; /* 02F8-02FB */ + u32 SetOperation; /* 02FC-02FF */ + u32 SetColorFormat; /* 0300-0303 */ + u32 Point; /* 0304-0307 */ + u32 SizeOut; /* 0308-030B */ + u32 SizeIn; /* 030C-030F */ + u32 Reserved02[0x03C]; + u32 Pixel[1792]; /* 0400- */ +} NVImageBlt; +#define IBLIT_COLOR_CONVERSION 0x000002F8 +#define IBLIT_OPERATION 0x000002FC +#define IBLIT_COLOR_FORMAT 0x00000300 +#define IBLIT_COLOR_FORMAT_R5G6B5 0x00000001 +#define IBLIT_COLOR_FORMAT_A1R5G5B5 0x00000002 +#define IBLIT_COLOR_FORMAT_X1R5G5B5 0x00000003 +#define IBLIT_COLOR_FORMAT_A8R8G8B8 0x00000004 +#define IBLIT_COLOR_FORMAT_X8R8G8B8 0x00000005 +#define IBLIT_POINT 0x00000304 +#define IBLIT_SIZE_OUT 0x00000308 +#define IBLIT_SIZE_IN 0x0000030C +#define IBLIT_PIXEL0 0x00000400 + +/* + * 2D scaled image BLT + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextDmaImage; /* 0184-0187 */ + u32 SetContextPattern; /* 0188-018B */ + u32 SetContextRop; /* 018C-018F */ + u32 SetContextBeta1; /* 0190-0193 */ + u32 SetContextBeta4; /* 0194-0197 */ + u32 SetContextSurface; /* 0198-019C */ + u32 Reserved01[0x058]; + u32 SetColorConversion; /* 02FC-02FF */ + u32 SetColorFormat; /* 0300-0303 */ + u32 SetOperation; /* 0304-0307 */ + u32 ClipPoint; /* 0308-030B */ + u32 ClipSize; /* 030C-030F */ + u32 ImageOutPoint; /* 0310-0313 */ + u32 ImageOutSize; /* 0314-0317 */ + u32 DuDx; /* 0318-031B */ + u32 DvDy; /* 031C-031F */ + u32 Reserved02[0x038]; + u32 ImageInSize; /* 0400-0403 */ + u32 ImageInFormat; /* 0404-0407 */ + u32 ImageInOffset; /* 0408-040B */ + u32 ImageInPoint; /* 040C-040F */ + u32 Reserved03[0x6FC]; +} NVScaledImage; +#define SCALER_COLOR_CONVERSION 0x000002FC +#define SCALER_COLOR_FORMAT 0x00000300 +#define SCALER_COLOR_FORMAT_A1R5G5B5 0x00000001 +#define SCALER_COLOR_FORMAT_X1R5G5B5 0x00000002 +#define SCALER_COLOR_FORMAT_A8R8G8B8 0x00000003 +#define SCALER_COLOR_FORMAT_X8R8G8B8 0x00000004 +#define SCALER_COLOR_FORMAT_V8YB8U8YA8 0x00000005 +#define SCALER_COLOR_FORMAT_YB8V8YA8U8 0x00000006 +#define SCALER_COLOR_FORMAT_R5G6B5 0x00000007 +#define SCALER_COLOR_FORMAT_Y8 0x00000008 +#define SCALER_COLOR_FORMAT_AY8 0x00000009 +#define SCALER_OPERATION 0x00000304 +#define SCALER_CLIP_POINT 0x00000308 +#define SCALER_CLIP_SIZE 0x0000030C +#define SCALER_OUT_POINT 0x00000310 +#define SCALER_OUT_SIZE 0x00000314 +#define SCALER_DU_DX 0x00000318 +#define SCALER_DV_DY 0x0000031C +#define SCALER_IN_SIZE 0x00000400 +#define SCALER_IN_FORMAT 0x00000404 +#define SCALER_IN_FORMAT_ORIGIN_CENTER 0x00010000 +#define SCALER_IN_FORMAT_ORIGIN_CORNER 0x00020000 +#define SCALER_IN_FORMAT_FILTER_NEAREST 0x00000000 +#define SCALER_IN_FORMAT_FILTER_LINEAR 0x01000000 +#define SCALER_IN_OFFSET 0x00000408 +#define SCALER_IN_POINT 0x0000040C + +/* + * 2D stretched image from CPU BLT + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextColorKey; /* 0184-0187 */ + u32 SetContextPattern; /* 0188-018B */ + u32 SetContextRop; /* 018C-018F */ + u32 SetContextBeta1; /* 0190-0193 */ + u32 SetContextBeta4; /* 0194-0197 */ + u32 SetContextSurface; /* 0198-019C */ + u32 Reserved01[0x057]; + u32 SetColorConversion; /* 02F8-02FB */ + u32 SetOperation; /* 02FC-02FF */ + u32 SetColorFormat; /* 0300-0303 */ + u32 ImageInSize; /* 0304-0307 */ + u32 DxDu; /* 0308-030B */ + u32 DyDv; /* 030C-030F */ + u32 ClipPoint; /* 0310-0313 */ + u32 ClipSize; /* 0314-0317 */ + u32 ImageOutPoint; /* 0318-031B */ + u32 Reserved02[0x039]; + u32 Pixel[1792]; /* 0400- */ +} NVStretchedImage; +#define ISTRETCH_COLOR_CONVERSION 0x000002F8 +#define ISTRETCH_OPERATION 0x000002FC +#define ISTRETCH_COLOR_FORMAT 0x00000300 +#define ISTRETCH_COLOR_FORMAT_R5G6B5 0x00000001 +#define ISTRETCH_COLOR_FORMAT_A1R5G5B5 0x00000002 +#define ISTRETCH_COLOR_FORMAT_X1R5G5B5 0x00000003 +#define ISTRETCH_COLOR_FORMAT_A8R8G8B8 0x00000004 +#define ISTRETCH_COLOR_FORMAT_X8R8G8B8 0x00000005 +#define ISTRETCH_IN_SIZE 0x00000304 +#define ISTRETCH_DX_DU 0x00000308 +#define ISTRETCH_DY_DV 0x0000030C +#define ISTRETCH_CLIP_POINT 0x00000310 +#define ISTRETCH_CLIP_SIZE 0x00000314 +#define ISTRETCH_OUT_POINT 0x00000318 +#define ISTRETCH_PIXEL0 0x00000400 + +/* + * 3D textured, Z buffered triangle + */ +typedef volatile struct { + u32 NoOperation; /* 0100-0103 */ + u32 Notify; /* 0104-0107 */ + u32 Reserved00[0x01E]; + u32 SetContextDmaNotify; /* 0180-0183 */ + u32 SetContextDmaA; /* 0184-0187 */ + u32 SetContextDmaB; /* 0188-018B */ + u32 SetContextSurfaces; /* 018C-018F */ + u32 Reserved01[0x05C]; + u32 ColorKey; /* 0300-0303 */ + u32 TextureOffset; /* 0304-0307 */ + u32 TextureFormat; /* 0308-030B */ + u32 TextureFilter; /* 030C-030F */ + u32 Blend; /* 0310-0313 */ + u32 Control; /* 0314-0317 */ + u32 FogColor; /* 0318-031B */ + u32 Reserved02[0x039]; + struct { /* 0400- */ + float sx; /* 00- 03 */ + float sy; /* 04- 07 */ + float sz; /* 08- 0B */ + float rhw; /* 0C- 0F */ + u32 color; /* 10- 13 */ + u32 specular; /* 14- 17 */ + float ts; /* 18- 1B */ + float tt; /* 1C- 1F */ + } Tlvertex[16]; /* -05FF */ + u32 DrawPrimitives[64]; /* 0600-063F */ + u32 Reserved03[0x640]; +} NVTexturedTriangleDx5; +#define TXTRI_COLOR_KEY 0x00000300 +#define TXTRI_OFFSET 0x00000304 +#define TXTRI_FORMAT 0x00000308 +#define TXTRI_FORMAT_CONTEXT_DMA_A 0x00000001 +#define TXTRI_FORMAT_CONTEXT_DMA_B 0x00000002 +#define TXTRI_FORMAT_COLORKEYENABLE 0x00000004 +#define TXTRI_FORMAT_ORIGIN_ZOH_CENTER 0x00000010 +#define TXTRI_FORMAT_ORIGIN_ZOH_CORNER 0x00000020 +#define TXTRI_FORMAT_ORIGIN_FOH_CENTER 0x00000040 +#define TXTRI_FORMAT_ORIGIN_FOH_CORNER 0x00000080 +#define TXTRI_FORMAT_COLOR_Y8 0x00000100 +#define TXTRI_FORMAT_COLOR_A1R5G5B5 0x00000200 +#define TXTRI_FORMAT_COLOR_X1R5G5B5 0x00000300 +#define TXTRI_FORMAT_COLOR_A4R4G4B4 0x00000400 +#define TXTRI_FORMAT_COLOR_R5G6B5 0x00000500 +#define TXTRI_FORMAT_COLOR_A8R8G8B8 0x00000600 +#define TXTRI_FORMAT_COLOR_X8R8G8B8 0x00000700 +#define TXTRI_FORMAT_MIPMAP_LEVELS_MSK 0x0000F000 +#define TXTRI_FORMAT_BASE_SIZE_U_MSK 0x000F0000 +#define TXTRI_FORMAT_BASE_SIZE_V_MSK 0x00F00000 +#define TXTRI_FORMAT_U_WRAP 0x01000000 +#define TXTRI_FORMAT_U_MIRROR 0x02000000 +#define TXTRI_FORMAT_U_CLAMP 0x03000000 +#define TXTRI_FORMAT_U_CLAMP_BORDER 0x04000000 +#define TXTRI_FORMAT_WRAPU_ENABLE 0x08000000 +#define TXTRI_FORMAT_V_WRAP 0x10000000 +#define TXTRI_FORMAT_V_MIRROR 0x20000000 +#define TXTRI_FORMAT_V_CLAMP 0x30000000 +#define TXTRI_FORMAT_V_CLAMP_BORDER 0x40000000 +#define TXTRI_FORMAT_WRAPV_ENABLE 0x80000000 +#define TXTRI_FILTER 0x0000030C +#define TXTRI_FILTER_KERNEL_SIZE_X_MSK 0x000000FF +#define TXTRI_FILTER_KERNEL_SIZE_Y_MSK 0x00007F00 +#define TXTRI_FILTER_MIPMAP_DITHER_ENABLE 0x00008000 +#define TXTRI_FILTER_MIPMAPLODBIAS_MSK 0x00FF0000 +#define TXTRI_FILTER_TEXTUREMIN_NEAREST 0x01000000 +#define TXTRI_FILTER_TEXTUREMIN_LINEAR 0x02000000 +#define TXTRI_FILTER_TEXTUREMIN_MIPNEAREST 0x03000000 +#define TXTRI_FILTER_TEXTUREMIN_MIPLINEAR 0x04000000 +#define TXTRI_FILTER_TEXTUREMIN_LINEARMIPNEAREST 0x05000000 +#define TXTRI_FILTER_TEXTUREMIN_LINEARMIPLINEAR 0x06000000 +#define TXTRI_FILTER_ANISOTROPIC_MIN_ENABLE 0x08000000 +#define TXTRI_FILTER_TEXTUREMAG_NEAREST 0x10000000 +#define TXTRI_FILTER_TEXTUREMAG_LINEAR 0x20000000 +#define TXTRI_FILTER_TEXTUREMAG_MIPNEAREST 0x30000000 +#define TXTRI_FILTER_TEXTUREMAG_MIPLINEAR 0x40000000 +#define TXTRI_FILTER_TEXTUREMAG_LINEARMIPNEAREST 0x50000000 +#define TXTRI_FILTER_TEXTUREMAG_LINEARMIPLINEAR 0x60000000 +#define TXTRI_FILTER_ANISOTROPIC_MAG_ENABLE 0x80000000 +#define TXTRI_BLEND 0x00000310 +#define TXTRI_BLEND_TEXTUREMAPBLEND_DECAL 0x00000001 +#define TXTRI_BLEND_TEXTUREMAPBLEND_MODULATE 0x00000002 +#define TXTRI_BLEND_TEXTUREMAPBLEND_DECALALPHA 0x00000003 +#define TXTRI_BLEND_TEXTUREMAPBLEND_MODULATEALPHA 0x00000004 +#define TXTRI_BLEND_TEXTUREMAPBLEND_DECALMASK 0x00000005 +#define TXTRI_BLEND_TEXTUREMAPBLEND_MODULATEMASK 0x00000006 +#define TXTRI_BLEND_TEXTUREMAPBLEND_COPY 0x00000007 +#define TXTRI_BLEND_TEXTUREMAPBLEND_ADD 0x00000008 +#define TXTRI_BLEND_OPERATION_MUX_TALPHALSB 0x00000010 +#define TXTRI_BLEND_OPERATION_MUX_TALPHAMSB 0x00000020 +#define TXTRI_BLEND_SHADEMODE_FLAT 0x00000040 +#define TXTRI_BLEND_SHADEMODE_GOURAUD 0x00000080 +#define TXTRI_BLEND_SHADEMODE_PHONG 0x000000C0 +#define TXTRI_BLEND_TEXTUREPERSPECTIVE_ENABLE 0x00000100 +#define TXTRI_BLEND_SPECULAR_ENABLE 0x00001000 +#define TXTRI_BLEND_FOG_ENABLE 0x00010000 +#define TXTRI_BLEND_ALPHABLEND_ENABLE 0x00100000 +#define TXTRI_BLEND_SRCBLEND_ZERO 0x01000000 +#define TXTRI_BLEND_SRCBLEND_ONE 0x02000000 +#define TXTRI_BLEND_SRCBLEND_SRCCOLOR 0x03000000 +#define TXTRI_BLEND_SRCBLEND_INVSRCCOLOR 0x04000000 +#define TXTRI_BLEND_SRCBLEND_SRCALPHA 0x05000000 +#define TXTRI_BLEND_SRCBLEND_INVSRCALPHA 0x06000000 +#define TXTRI_BLEND_SRCBLEND_DESTALPHA 0x07000000 +#define TXTRI_BLEND_SRCBLEND_INVDESTALPHA 0x08000000 +#define TXTRI_BLEND_SRCBLEND_DESTCOLOR 0x09000000 +#define TXTRI_BLEND_SRCBLEND_INVDESTCOLOR 0x0A000000 +#define TXTRI_BLEND_SRCBLEND_SRCALPHASAT 0x0B000000 +#define TXTRI_BLEND_DESTBLEND_ZERO 0x10000000 +#define TXTRI_BLEND_DESTBLEND_ONE 0x20000000 +#define TXTRI_BLEND_DESTBLEND_SRCCOLOR 0x30000000 +#define TXTRI_BLEND_DESTBLEND_INVSRCCOLOR 0x40000000 +#define TXTRI_BLEND_DESTBLEND_SRCALPHA 0x50000000 +#define TXTRI_BLEND_DESTBLEND_INVSRCALPHA 0x60000000 +#define TXTRI_BLEND_DESTBLEND_DESTALPHA 0x70000000 +#define TXTRI_BLEND_DESTBLEND_INVDESTALPHA 0x80000000 +#define TXTRI_BLEND_DESTBLEND_DESTCOLOR 0x90000000 +#define TXTRI_BLEND_DESTBLEND_INVDESTCOLOR 0xA0000000 +#define TXTRI_BLEND_DESTBLEND_SRCALPHASAT 0xB0000000 +#define TXTRI_CONTROL 0x00000314 +#define TXTRI_CONTROL_ALPHAREF_MSK 0x000000FF +#define TXTRI_CONTROL_ALPHAFUNC_NEVER 0x00000100 +#define TXTRI_CONTROL_ALPHAFUNC_LESS 0x00000200 +#define TXTRI_CONTROL_ALPHAFUNC_EQUAL 0x00000300 +#define TXTRI_CONTROL_ALPHAFUNC_LESSEQUAL 0x00000400 +#define TXTRI_CONTROL_ALPHAFUNC_GREATER 0x00000500 +#define TXTRI_CONTROL_ALPHAFUNC_NOTEQUAL 0x00000600 +#define TXTRI_CONTROL_ALPHAFUNC_GREATEREQUAL 0x00000700 +#define TXTRI_CONTROL_ALPHAFUNC_ALWAYS 0x00000800 +#define TXTRI_CONTROL_ALPHATEST_ENABLE 0x00001000 +#define TXTRI_CONTROL_ORIGIN_CENTER 0x00000000 +#define TXTRI_CONTROL_ORIGIN_CORNER 0x00002000 +#define TXTRI_CONTROL_Z_ENABLE 0x00004000 +#define TXTRI_CONTROL_ZFUNC_NEVER 0x00010000 +#define TXTRI_CONTROL_ZFUNC_LESS 0x00020000 +#define TXTRI_CONTROL_ZFUNC_EQUAL 0x00030000 +#define TXTRI_CONTROL_ZFUNC_LESSEQUAL 0x00040000 +#define TXTRI_CONTROL_ZFUNC_GREATER 0x00050000 +#define TXTRI_CONTROL_ZFUNC_NOTEQUAL 0x00060000 +#define TXTRI_CONTROL_ZFUNC_GREATEREQUAL 0x00070000 +#define TXTRI_CONTROL_ZFUNC_ALWAYS 0x00080000 +#define TXTRI_CONTROL_CULLMODE_NONE 0x00100000 +#define TXTRI_CONTROL_CULLMODE_CW 0x00200000 +#define TXTRI_CONTROL_CULLMODE_CCW 0x00300000 +#define TXTRI_CONTROL_DITHER_ENABLE 0x00400000 +#define TXTRI_CONTROL_Z_PERSPECTIVE_ENABLE 0x00800000 +#define TXTRI_CONTROL_ZWRITE_ENABLE 0x01000000 +#define TXTRI_CONTROL_Z_FORMAT_FIXED 0x40000000 +#define TXTRI_CONTROL_Z_FORMAT_FLOAT 0x80000000 +#define TXTRI_FOG_COLOR 0x00000318 +#define TXTRI_VERTEX0 0x00000400 +#define TXTRI_VERTEX0_X 0x00000400 +#define TXTRI_VERTEX0_Y 0x00000404 +#define TXTRI_VERTEX0_Z 0x00000408 +#define TXTRI_VERTEX0_W 0x0000040C +#define TXTRI_VERTEX0_COLOR 0x00000410 +#define TXTRI_VERTEX0_SPECULAR 0x00000414 +#define TXTRI_VERTEX0_S 0x00000418 +#define TXTRI_VERTEX0_T 0x0000041C +#define TXTRI_PRIMITIVE0 0x00000600 + + + + +typedef volatile struct { + u32 SetObject; /* 0000-0003 */ + u32 Reserved00[0x003]; +#ifdef WORDS_BIGENDIAN + u32 Free; /* 0010-0013 */ +#else + u16 Free; /* 0010-0011 */ + u16 Nop; /* 0012-0013 */ +#endif + u32 Reserved01[0x00B]; + u32 DmaPut; /* 0040-0043 */ + u32 DmaGet; /* 0044-0047 */ + u32 Reserved02[0x02E]; + union { + NVSurfaces2D Surfaces2D; + NVSurfaces3D Surfaces3D; + NVClip Clip; + NVBeta1 Beta1; + NVBeta4 Beta4; + NVRectangle Rectangle; + NVTriangle Triangle; + NVLine Line; + NVScreenBlt ScreenBlt; + NVImageBlt ImageBlt; + NVScaledImage ScaledImage; + NVStretchedImage StretchedImage; + NVTexturedTriangleDx5 TexTriangle; + } o; +} NVDmaSubChannel; + + +typedef volatile struct { + NVDmaSubChannel sub[8]; +} NVDmaChannel; + + + +#endif /* __NVIDIA_REGS_H__ */ diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_state.c b/Source/DirectFB/gfxdrivers/nvidia/nvidia_state.c new file mode 100755 index 0000000..70645f2 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_state.c @@ -0,0 +1,730 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 + +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "nvidia.h" +#include "nvidia_regs.h" +#include "nvidia_accel.h" +#include "nvidia_objects.h" +#include "nvidia_state.h" + + +#define NVIDIA_IS_SET( flag ) ((nvdev->set & SMF_##flag) == SMF_##flag) + +#define NVIDIA_SET( flag ) nvdev->set |= SMF_##flag + +#define NVIDIA_UNSET( flag ) nvdev->set &= ~SMF_##flag + + + +void nv_set_destination( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + CoreSurface *surface = state->destination; + volatile u8 *mmio = nvdrv->mmio_base; + u32 dst_offset; + u32 dst_pitch; + u32 src_pitch; + + if (NVIDIA_IS_SET( DESTINATION )) + return; + + dst_offset = (state->dst.offset + nvdev->fb_offset) & ~63; + dst_pitch = state->dst.pitch & ~31; + src_pitch = (nvdev->src_pitch & ~31) ? : 32; // align to 32, maybe system buffer pitch + + if (nvdev->dst_format != surface->config.format) { + u32 sformat2D = 0; + u32 sformat3D = 0; + u32 cformat = 0; + bool dst_422 = false; + + switch (surface->config.format) { + case DSPF_A8: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + sformat2D = SURFACES2D_FORMAT_Y8; + cformat = RECT_COLOR_FORMAT_Y32; + break; + case DSPF_RGB555: + sformat2D = SURFACES2D_FORMAT_X1R5G5B5; + sformat3D = SURFACES3D_FORMAT_COLOR_X1R5G5B5; + cformat = RECT_COLOR_FORMAT_A1Y15; + break; + case DSPF_ARGB1555: + sformat2D = SURFACES2D_FORMAT_A1R5G5B5; + sformat3D = SURFACES3D_FORMAT_COLOR_A1R5G5B5; + cformat = RECT_COLOR_FORMAT_A1Y15; + break; + case DSPF_RGB16: + sformat2D = SURFACES2D_FORMAT_R5G6B5; + sformat3D = SURFACES3D_FORMAT_COLOR_R5G6B5; + cformat = RECT_COLOR_FORMAT_Y16; + break; + case DSPF_RGB32: + sformat2D = SURFACES2D_FORMAT_X8R8G8B8; + sformat3D = SURAFCES3D_FORMAT_COLOR_X8R8G8B8; + cformat = RECT_COLOR_FORMAT_Y32; + break; + case DSPF_ARGB: + sformat2D = SURFACES2D_FORMAT_A8R8G8B8; + sformat3D = SURFACES3D_FORMAT_COLOR_A8R8G8B8; + cformat = 0x0D; + break; + case DSPF_YUY2: + sformat2D = SURFACES2D_FORMAT_A8R8G8B8; + cformat = 0x12; + dst_422 = true; + break; + case DSPF_UYVY: + sformat2D = SURFACES2D_FORMAT_A8R8G8B8; + cformat = 0x13; + dst_422 = true; + break; + default: + D_BUG( "unexpected pixelformat" ); + return; + } + + if (sformat2D == SURFACES2D_FORMAT_A8R8G8B8) { + /* need to set color format manually */ + nv_waitidle( nvdrv, nvdev ); + + nv_out32( mmio, PRAMIN + (ADDR_RECTANGLE << 4) + 4, cformat << 8 ); + nv_out32( mmio, PRAMIN + (ADDR_TRIANGLE << 4) + 4, cformat << 8 ); + nv_out32( mmio, PRAMIN + (ADDR_LINE << 4) + 4, cformat << 8 ); + + nv_assign_object( nvdrv, nvdev, + SUBC_RECTANGLE, OBJ_RECTANGLE, true ); + nv_assign_object( nvdrv, nvdev, + SUBC_TRIANGLE, OBJ_TRIANGLE, true ); + nv_assign_object( nvdrv, nvdev, + SUBC_LINE, OBJ_LINE, true ); + } else { + nv_begin( SUBC_RECTANGLE, RECT_COLOR_FORMAT, 1 ); + nv_outr( cformat ); + + nv_begin( SUBC_TRIANGLE, TRI_COLOR_FORMAT, 1 ); + nv_outr( cformat ); + + nv_begin( SUBC_LINE, LINE_COLOR_FORMAT, 1 ); + nv_outr( cformat ); + } + + nv_assign_object( nvdrv, nvdev, + SUBC_SURFACES2D, OBJ_SURFACES2D, false ); + + nv_begin( SUBC_SURFACES2D, SURFACES2D_FORMAT, 2 ); + nv_outr( sformat2D ); + nv_outr( (dst_pitch << 16) | (src_pitch & 0xFFFF) ); + nv_begin( SUBC_SURFACES2D, SURFACES2D_DST_OFFSET, 1 ); + nv_outr( dst_offset ); + + if (nvdev->enabled_3d && sformat3D) { + nv_assign_object( nvdrv, nvdev, + SUBC_SURFACES3D, OBJ_SURFACES3D, false ); + + nv_begin( SUBC_SURFACES3D, SURFACES3D_FORMAT, 1 ); + nv_outr( sformat3D | SURFACES3D_FORMAT_TYPE_PITCH ); + nv_begin( SUBC_SURFACES3D, SURFACES3D_PITCH, 2 ); + nv_outr( (64 << 16) | (dst_pitch & 0xFFFF) ); + nv_outr( dst_offset ); + } + + if (nvdev->dst_422 != dst_422) { + NVIDIA_UNSET( CLIP ); + NVIDIA_UNSET( BLITTING_FLAGS ); + nvdev->dst_422 = dst_422; + } + + NVIDIA_UNSET( COLOR ); + NVIDIA_UNSET( DST_BLEND ); + } + else if (nvdev->dst_offset != dst_offset || + nvdev->dst_pitch != dst_pitch) { + nv_assign_object( nvdrv, nvdev, + SUBC_SURFACES2D, OBJ_SURFACES2D, false ); + + nv_begin( SUBC_SURFACES2D, SURFACES2D_PITCH, 1 ); + nv_outr( (dst_pitch << 16) | (src_pitch & 0xFFFF) ); + nv_begin( SUBC_SURFACES2D, SURFACES2D_DST_OFFSET, 1 ); + nv_outr( dst_offset ); + + if (nvdev->enabled_3d) { + nv_assign_object( nvdrv, nvdev, + SUBC_SURFACES3D, OBJ_SURFACES3D, false ); + + nv_begin( SUBC_SURFACES3D, SURFACES3D_PITCH, 2 ); + nv_outr( (64 << 16) | (dst_pitch & 0xFFFF) ); + nv_outr( dst_offset ); + } + } + + nvdev->dst_format = surface->config.format; + nvdev->dst_offset = dst_offset; + nvdev->dst_pitch = dst_pitch; + + NVIDIA_SET( DESTINATION ); +} + +void nv_set_source( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + CoreSurface *surface = state->source; + + nvdev->src_lock = &state->src; + + if (NVIDIA_IS_SET( SOURCE )) { + if ((state->blittingflags & DSBLIT_DEINTERLACE) == + (nvdev->blittingflags & DSBLIT_DEINTERLACE)) + return; + } + + if (state->src.buffer->policy == CSP_SYSTEMONLY) { + if (!nvdev->src_system) { + nv_assign_object( nvdrv, nvdev, + SUBC_IMAGEBLT, OBJ_IMAGEBLT, false ); + nv_assign_object( nvdrv, nvdev, + SUBC_STRETCHEDIMAGE, OBJ_STRETCHEDIMAGE, false ); + + NVIDIA_UNSET( BLITTING_FLAGS ); + } + + nvdev->src_address = state->src.addr; + nvdev->src_pitch = state->src.pitch; + nvdev->src_system = true; + } + else { + u32 src_offset = (state->src.offset + nvdev->fb_offset) & ~63; + u32 src_pitch = state->src.pitch & ~31; + + if (nvdev->src_offset != src_offset || + nvdev->src_pitch != src_pitch) { + nv_assign_object( nvdrv, nvdev, + SUBC_SURFACES2D, OBJ_SURFACES2D, false ); + + nv_begin( SUBC_SURFACES2D, SURFACES2D_PITCH, 2 ); + nv_outr( (nvdev->dst_pitch << 16) | (src_pitch & 0xFFFF) ); + nv_outr( src_offset ); + } + + if (nvdev->src_system) { + nv_assign_object( nvdrv, nvdev, + SUBC_SCREENBLT, OBJ_SCREENBLT, false ); + nv_assign_object( nvdrv, nvdev, + SUBC_SCALEDIMAGE, OBJ_SCALEDIMAGE, false ); + + NVIDIA_UNSET( BLITTING_FLAGS ); + } + + nvdev->src_offset = src_offset; + nvdev->src_pitch = src_pitch; + nvdev->src_system = false; + } + + nvdev->src_width = surface->config.size.w; + nvdev->src_height = surface->config.size.h; + + if (state->blittingflags & DSBLIT_DEINTERLACE) { + nvdev->src_height /= 2; + if (surface->config.caps & DSCAPS_SEPARATED) { + if (surface->field) { + nvdev->src_address += nvdev->src_height * nvdev->src_pitch; + nvdev->src_offset += nvdev->src_height * nvdev->src_pitch; + } + } else { + if (surface->field) { + nvdev->src_address += nvdev->src_pitch; + nvdev->src_offset += nvdev->src_pitch; + } + nvdev->src_pitch *= 2; + } + nvdev->src_interlaced = true; + } else + nvdev->src_interlaced = false; + + if (nvdev->enabled_3d) { + u32 size_u = direct_log2(surface->config.size.w) & 0xF; + u32 size_v = direct_log2(surface->config.size.h) & 0xF; + + nvdev->state3d[1].offset = nvdev->fb_offset + nvdev->buf_offset[1]; + nvdev->state3d[1].format &= 0xFF00FFFF; + nvdev->state3d[1].format |= (size_u << 16) | (size_v << 20); + } + + if (nvdev->src_format != surface->config.format) { + NVIDIA_UNSET( SRC_BLEND ); + NVIDIA_UNSET( BLITTING_FLAGS ); + nvdev->src_format = surface->config.format; + } + + NVIDIA_SET( SOURCE ); +} + +void nv_set_clip( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + DFBRectangle *cr = &nvdev->clip; + + if (NVIDIA_IS_SET( CLIP )) + return; + + cr->x = state->clip.x1; + cr->y = state->clip.y1; + cr->w = state->clip.x2 - state->clip.x1 + 1; + cr->h = state->clip.y2 - state->clip.y1 + 1; + + if (nvdev->dst_422) { + cr->x = cr->x / 2; + cr->w = (cr->w / 2) ? : 1; + } + + nv_begin( SUBC_CLIP, CLIP_TOP_LEFT, 2 ); + nv_outr( (cr->y << 16) | (cr->x & 0xFFFF) ); + nv_outr( (cr->h << 16) | (cr->w & 0xFFFF) ); + + NVIDIA_SET( CLIP ); +} + +void nv_set_drawing_color( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + DFBColor color = state->color; + int y, u, v; + + if (NVIDIA_IS_SET( DRAWING_COLOR ) && NVIDIA_IS_SET( DRAWING_FLAGS )) + return; + + switch (nvdev->dst_format) { + case DSPF_A8: + nvdev->color2d = color.a; + break; + case DSPF_LUT8: + nvdev->color2d = state->color_index; + break; + case DSPF_ALUT44: + nvdev->color2d = (state->color_index & 0x0F) | + (state->color.a & 0xF0); + break; + case DSPF_RGB332: + nvdev->color2d = PIXEL_RGB332( color.r, + color.g, + color.b ); + break; + case DSPF_RGB555: + case DSPF_ARGB1555: + nvdev->color2d = PIXEL_ARGB1555( color.a, + color.r, + color.g, + color.b ); + break; + case DSPF_RGB16: + nvdev->color2d = PIXEL_RGB16( color.r, + color.g, + color.b ); + break; + case DSPF_RGB32: + nvdev->color2d = PIXEL_RGB32( color.r, + color.g, + color.b ); + break; + case DSPF_ARGB: + nvdev->color2d = PIXEL_ARGB( color.a, + color.r, + color.g, + color.b ); + break; + + case DSPF_YUY2: + RGB_TO_YCBCR( color.r, color.g, color.b, y, u, v ); + nvdev->color2d = PIXEL_YUY2( y, u, v ); + break; + + case DSPF_UYVY: + RGB_TO_YCBCR( color.r, color.g, color.b, y, u, v ); + nvdev->color2d = PIXEL_UYVY( y, u, v ); + break; + + default: + D_BUG( "unexpected pixelformat" ); + break; + } + + nvdev->color3d = PIXEL_ARGB(color.a, color.r, color.g, color.b); + + if (nvdev->dst_format == DSPF_ARGB1555) { + nv_assign_object( nvdrv, nvdev, + SUBC_SURFACES2D, OBJ_SURFACES2D, false ); + + nv_begin( SUBC_SURFACES2D, SURFACES2D_FORMAT, 1 ); + nv_outr( (nvdev->color2d & 0x8000) + ? SURFACES2D_FORMAT_A1R5G5B5 + : SURFACES2D_FORMAT_X1R5G5B5 ); + } + + if (state->drawingflags & DSDRAW_BLEND && !nvdev->enabled_3d) { + if (!nvdev->beta1_set || nvdev->beta1_val != (color.a << 23)) { + nv_assign_object( nvdrv, nvdev, SUBC_BETA1, OBJ_BETA1, false ); + + nv_begin( SUBC_BETA1, BETA1_FACTOR, 1 ); + nv_outr( color.a << 23 ); + + nvdev->beta1_val = color.a << 23; + nvdev->beta1_set = true; + } + } + + NVIDIA_SET ( DRAWING_COLOR ); + NVIDIA_UNSET( BLITTING_COLOR ); +} + +void nv_set_blitting_color( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + DFBColor color = state->color; + + if (NVIDIA_IS_SET( BLITTING_COLOR ) && NVIDIA_IS_SET( BLITTING_FLAGS )) + return; + + if (state->blittingflags & (DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR) || + (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL && state->src_blend == DSBF_ONE)) { + nvdev->color3d = (state->blittingflags & DSBLIT_BLEND_COLORALPHA) + ? (color.a << 24) : 0xFF000000; + + if (state->blittingflags & DSBLIT_COLORIZE && + state->blittingflags & (DSBLIT_SRC_PREMULTCOLOR | DSBLIT_BLEND_COLORALPHA)) { + nvdev->color3d |= PIXEL_RGB32( color.r * color.a / 0xFF, + color.g * color.a / 0xFF, + color.b * color.a / 0xFF ); + } + else if (state->blittingflags & DSBLIT_COLORIZE) { + nvdev->color3d |= PIXEL_RGB32( color.r, color.g, color.b ); + } + else if (state->blittingflags & (DSBLIT_SRC_PREMULTCOLOR | DSBLIT_BLEND_COLORALPHA)) { + nvdev->color3d |= PIXEL_RGB32( color.a, color.a, color.a ); + } + else { + nvdev->color3d |= 0x00FFFFFF; + } + + if (!nvdev->beta4_set || nvdev->beta4_val != nvdev->color3d) { + nv_assign_object( nvdrv, nvdev, + SUBC_BETA4, OBJ_BETA4, false ); + + nv_begin( SUBC_BETA4, BETA4_FACTOR, 1 ); + nv_outr( nvdev->color3d ); + + nvdev->beta4_val = nvdev->color3d; + nvdev->beta4_set = true; + } + } + else if (state->blittingflags & (DSBLIT_BLEND_COLORALPHA | + DSBLIT_BLEND_ALPHACHANNEL)) { + u32 beta1; + + if (state->blittingflags & DSBLIT_BLEND_COLORALPHA) { + nvdev->color3d = (color.a << 24) | 0x00FFFFFF; + beta1 = color.a << 23; + } else { + nvdev->color3d = 0xFFFFFFFF; + beta1 = 0x7F800000; + } + + if (!nvdev->beta1_set || nvdev->beta1_val != beta1) { + nv_assign_object( nvdrv, nvdev, + SUBC_BETA1, OBJ_BETA1, false ); + + nv_begin( SUBC_BETA1, BETA1_FACTOR, 1 ); + nv_outr( beta1 ); + + nvdev->beta1_val = beta1; + nvdev->beta1_set = true; + } + } + + NVIDIA_SET ( BLITTING_COLOR ); + NVIDIA_UNSET( DRAWING_COLOR ); +} + +void nv_set_blend_function( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + DFBSurfaceBlendFunction sblend, dblend; + + if (NVIDIA_IS_SET( SRC_BLEND ) && NVIDIA_IS_SET( DST_BLEND )) + return; + + sblend = state->src_blend; + dblend = state->dst_blend; + + if (!DFB_PIXELFORMAT_HAS_ALPHA(nvdev->dst_format)) { + if (sblend == DSBF_DESTALPHA) + sblend = DSBF_ONE; + else if (sblend == DSBF_INVDESTALPHA) + sblend = DSBF_ZERO; + + if (dblend == DSBF_DESTALPHA) + dblend = DSBF_ONE; + else if (dblend == DSBF_INVDESTALPHA) + dblend = DSBF_ZERO; + } + + nvdev->state3d[0].blend &= 0x00FFFFFF; + nvdev->state3d[0].blend |= (sblend << 24) | (dblend << 28); + nvdev->state3d[1].blend &= 0x00FFFFFF; + nvdev->state3d[1].blend |= (sblend << 24) | (dblend << 28); + + if (!NVIDIA_IS_SET( SRC_BLEND )) + NVIDIA_UNSET( BLITTING_FLAGS ); + NVIDIA_SET( SRC_BLEND ); + NVIDIA_SET( DST_BLEND ); +} + +void nv_set_drawingflags( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + if (NVIDIA_IS_SET( DRAWING_FLAGS )) + return; + + if (!nvdev->enabled_3d) { + u32 operation; + + if (state->drawingflags & DSDRAW_BLEND) + operation = OPERATION_BLEND; + else + operation = OPERATION_SRCCOPY; + + if (nvdev->drawing_operation != operation) { + nv_begin( SUBC_RECTANGLE, RECT_OPERATION, 1 ); + nv_outr( operation ); + + nv_begin( SUBC_TRIANGLE, TRI_OPERATION, 1 ); + nv_outr( operation ); + + nv_begin( SUBC_LINE, LINE_OPERATION, 1 ); + nv_outr( operation ); + + nvdev->drawing_operation = operation; + } + } + else { + if (state->drawingflags & DSDRAW_BLEND) + nvdev->state3d[0].blend |= TXTRI_BLEND_ALPHABLEND_ENABLE; + else + nvdev->state3d[0].blend &= ~TXTRI_BLEND_ALPHABLEND_ENABLE; + } + + nvdev->drawingflags = state->drawingflags; + + NVIDIA_SET( DRAWING_FLAGS ); +} + +void nv_set_blittingflags( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ) +{ + u32 operation; + bool src_alpha; + + if (NVIDIA_IS_SET( BLITTING_FLAGS )) + return; + + operation = (nvdev->arch > NV_ARCH_04) ? OPERATION_SRCCOPY : OPERATION_COPY; + src_alpha = true; + + if (state->blittingflags & (DSBLIT_BLEND_COLORALPHA | + DSBLIT_BLEND_ALPHACHANNEL)) { + if (state->blittingflags & (DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR) || + (state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL && state->src_blend == DSBF_ONE)) { + operation = OPERATION_BLEND_PREMULTIPLIED; + } + else { + operation = OPERATION_BLEND; + src_alpha = !!(state->blittingflags & DSBLIT_BLEND_ALPHACHANNEL); + } + } + else if (state->blittingflags & (DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR)) { + operation = OPERATION_COLOR_MULTIPLY; + } + + if (nvdev->src_system) { + switch (nvdev->src_format) { + case DSPF_RGB555: + nvdev->system_format = IBLIT_COLOR_FORMAT_X1R5G5B5; + break; + case DSPF_ARGB1555: + nvdev->system_format = src_alpha + ? IBLIT_COLOR_FORMAT_A1R5G5B5 + : IBLIT_COLOR_FORMAT_X1R5G5B5; + break; + case DSPF_RGB16: + nvdev->system_format = IBLIT_COLOR_FORMAT_R5G6B5; + break; + case DSPF_RGB32: + nvdev->system_format = IBLIT_COLOR_FORMAT_X8R8G8B8; + break; + case DSPF_ARGB: + nvdev->system_format = src_alpha + ? IBLIT_COLOR_FORMAT_A8R8G8B8 + : IBLIT_COLOR_FORMAT_X8R8G8B8; + break; + default: + D_BUG( "unexpected pixelformat" ); + break; + } + + if (nvdev->system_operation != operation) { + nv_begin( SUBC_IMAGEBLT, IBLIT_OPERATION, 1 ); + nv_outr( operation ); + + nv_begin( SUBC_STRETCHEDIMAGE, ISTRETCH_OPERATION, 1 ); + nv_outr( operation ); + + nvdev->system_operation = operation; + } + } + else { + switch (nvdev->src_format) { + case DSPF_A8: + nvdev->scaler_format = SCALER_COLOR_FORMAT_AY8; + break; + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB332: + nvdev->scaler_format = SCALER_COLOR_FORMAT_Y8; + break; + case DSPF_RGB555: + nvdev->scaler_format = SCALER_COLOR_FORMAT_X1R5G5B5; + break; + case DSPF_ARGB1555: + nvdev->scaler_format = src_alpha + ? SCALER_COLOR_FORMAT_A1R5G5B5 + : SCALER_COLOR_FORMAT_X1R5G5B5; + break; + case DSPF_RGB16: + nvdev->scaler_format = SCALER_COLOR_FORMAT_R5G6B5; + break; + case DSPF_RGB32: + nvdev->scaler_format = SCALER_COLOR_FORMAT_X8R8G8B8; + break; + case DSPF_ARGB: + nvdev->scaler_format = src_alpha + ? SCALER_COLOR_FORMAT_A8R8G8B8 + : SCALER_COLOR_FORMAT_X8R8G8B8; + break; + case DSPF_YUY2: + nvdev->scaler_format = nvdev->dst_422 + ? SCALER_COLOR_FORMAT_A8R8G8B8 + : SCALER_COLOR_FORMAT_V8YB8U8YA8; + break; + case DSPF_UYVY: + nvdev->scaler_format = nvdev->dst_422 + ? SCALER_COLOR_FORMAT_A8R8G8B8 + : SCALER_COLOR_FORMAT_YB8V8YA8U8; + break; + default: + D_BUG( "unexpected pixelformat 0x%08x", nvdev->src_format ); + break; + } + + if (nvdev->scaler_operation != operation) { + nv_begin( SUBC_SCALEDIMAGE, SCALER_OPERATION, 1 ); + nv_outr( operation ); + + nvdev->scaler_operation = operation; + } + } + + if (nvdev->enabled_3d) { + nvdev->state3d[1].format &= 0xFFFFF0FF; + nvdev->state3d[1].blend &= 0xFF00FFF0; + + switch (nvdev->src_format) { + case DSPF_RGB555: + nvdev->state3d[1].format |= TXTRI_FORMAT_COLOR_X1R5G5B5; + break; + case DSPF_ARGB1555: + nvdev->state3d[1].format |= TXTRI_FORMAT_COLOR_A1R5G5B5; + break; + case DSPF_A8: + case DSPF_ARGB: + nvdev->state3d[1].format |= TXTRI_FORMAT_COLOR_A4R4G4B4; + break; + default: + nvdev->state3d[1].format |= TXTRI_FORMAT_COLOR_R5G6B5; + break; + } + + if (state->blittingflags & (DSBLIT_BLEND_COLORALPHA | DSBLIT_COLORIZE | + DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_SRC_PREMULTCOLOR)) { + if (state->blittingflags & DSBLIT_BLEND_COLORALPHA) + nvdev->state3d[1].blend |= + TXTRI_BLEND_TEXTUREMAPBLEND_MODULATEALPHA; + else + nvdev->state3d[1].blend |= + TXTRI_BLEND_TEXTUREMAPBLEND_MODULATE; + + if (state->blittingflags & (DSBLIT_BLEND_COLORALPHA | + DSBLIT_BLEND_ALPHACHANNEL)) + nvdev->state3d[1].blend |= TXTRI_BLEND_ALPHABLEND_ENABLE; + } else + nvdev->state3d[1].blend |= TXTRI_BLEND_TEXTUREMAPBLEND_COPY; + } + + nvdev->blittingflags = state->blittingflags; + + NVIDIA_SET( BLITTING_FLAGS ); +} + diff --git a/Source/DirectFB/gfxdrivers/nvidia/nvidia_state.h b/Source/DirectFB/gfxdrivers/nvidia/nvidia_state.h new file mode 100755 index 0000000..5bfc8f1 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/nvidia/nvidia_state.h @@ -0,0 +1,58 @@ +/* + (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 , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + 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 __NVIDIA_STATE_H__ +#define __NVIDIA_STATE_H__ + + +void nv_set_destination ( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_source ( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_clip ( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_drawing_color ( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_blitting_color( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_blend_function( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_drawingflags ( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); +void nv_set_blittingflags ( NVidiaDriverData *nvdrv, + NVidiaDeviceData *nvdev, + CardState *state ); + +#endif /* __NVIDIA_STATE_H__ */ -- cgit