jiangtao9999 发表于 2007-2-21 21:54:51

ML 2.1alpha3的ATI显卡支持需要改进了…………

装好后,用 vesa 根本不能成功启动 X ,导致显示器黑屏。甚至切换 tty 导致死机。
强行拷贝 ati 驱动到 xorg 的目录,也不能用 fglrx 启动 X ,同样黑屏,但可以切换 tty 去摸黑运行重启。(alpha2 我这么成功过)

目前只能靠 X 自带的 ati 驱动,但只有 2D ,而且这个驱动只能支持 60Hz 。
虽然 60Hz 对于液晶来说没问题,但对于 CRT 就没法活了。

可以说目前 ati 的支持几乎没有了…………



bug 管理网站我又忘了地址了………………
:oops:

sejishikong 发表于 2007-2-21 22:52:04

jira.321211.net:8080
ati的显卡我也有,所以这个问题发布之前就知道了,问题在于alpha3的组件太新了,可能需要等ati官方驱动的更新。
vesa应该可以的才对。

jiangtao9999 发表于 2007-2-21 23:07:28

我这里 vesa 不行,我怀疑是我的显卡支持 DVI 和 VGA 同时输出,我用 DVI ,空着 VGA ,导致输出的端口识别错误。
好像某个 ati 官方版本也有这个错误,导致没有显示,但可以重新定义输出端口的排列,所以加参数就行了。

gentoo 也是 .run 安装有问题,但他的 ebuild 可以完美解决安装的问题。

jiangtao9999 发表于 2007-2-21 23:55:05

跑个题:kernel 的 RTC stores time in GMT (APM_RTC_IS_GMT) 干啥用的?

jiangtao9999 发表于 2007-2-22 10:26:18

很怪异,新的 8.34.8 驱动也是不能安装,kernel module 编译出错,竟然和老版本一样是语法错误………………

sejishikong 发表于 2007-2-22 20:04:29

我编译的kernel可能有些问题,等KDE的新内核吧。

jiangtao9999 发表于 2007-2-22 22:25:25

:shock:
不过我找到了 Gentoo 的 2.6.20 patch 打上可以编译,但还是不能正确安装………………
等 KDE 的内核后,看看能不能参考 Gentoo 的方式安装上。

sejishikong 发表于 2007-2-22 22:46:01

如果能正常编译内核模块,应该没问题。
补丁在哪儿?

jiangtao9999 发表于 2007-2-22 22:56:52

这个是 patch :
--- common/lib/modules/fglrx/build_mod/firegl_public.c2006-12-18 10:58:15.000000000 -0500
+++ common/lib/modules/fglrx/build_mod/firegl_public.c2006-12-18 11:14:04.000000000 -0500
@@ -181,6 +181,70 @@
int errno;
#endif // __ia64__

+#if defined(__i386__)
+#define __syscall_return(type, res) \
+do { \
+      if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) { \
+                errno = -(res); \
+                res = -1; \
+      } \
+      return (type) (res); \
+} while (0)
+#define _syscall2(type,name,type1,arg1,type2,arg2) \
+type name(type1 arg1,type2 arg2) \
+{ \
+long __res; \
+__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
+      : "=a" (__res) \
+      : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)) \
+      : "memory"); \
+__syscall_return(type,__res); \
+}
+
+#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
+type name(type1 arg1,type2 arg2,type3 arg3) \
+{ \
+long __res; \
+__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
+      : "=a" (__res) \
+      : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)), \
+                  "d" ((long)(arg3)) : "memory"); \
+__syscall_return(type,__res); \
+}
+#elif defined(__x86_64__)
+#define __syscall_clobber "r11","rcx","memory"
+#define __syscall "syscall"
+
+#define __syscall_return(type, res) \
+do { \
+      if ((unsigned long)(res) >= (unsigned long)(-127)) { \
+                errno = -(res); \
+                res = -1; \
+      } \
+      return (type) (res); \
+} while (0)
+#define _syscall2(type,name,type1,arg1,type2,arg2) \
+type name(type1 arg1,type2 arg2) \
+{ \
+long __res; \
+__asm__ volatile (__syscall \
+      : "=a" (__res) \
+      : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \
+__syscall_return(type,__res); \
+}
+
+#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
+type name(type1 arg1,type2 arg2,type3 arg3) \
+{ \
+long __res; \
+__asm__ volatile (__syscall \
+      : "=a" (__res) \
+      : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \
+                  "d" ((long)(arg3)) : __syscall_clobber); \
+__syscall_return(type,__res); \
+}
+#endif
+
// int mlock(const void *addr, size_t len);
_syscall2(int, mlock, const void *, addr, size_t, len )
// int munlock(const void *addr, size_t len);

他的 ebuild 脚本,我没看懂…………
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/x11-drivers/ati-drivers/ati-drivers-8.33.6-r2.ebuild,v 1.2 2007/02/10 00:51:57 marienz Exp $

IUSE="acpi doc opengl qt3"

inherit eutils multilib linux-mod toolchain-funcs

DESCRIPTION="Ati precompiled drivers for r350, r300, r250 and r200 chipsets"
HOMEPAGE="http://www.ati.com"
ATI_URL="https://a248.e.akamai.net/f/674/9206/0/www2.ati.com/drivers/linux/"
SRC_URI="${ATI_URL}/ati-driver-installer-${PV}-x86.x86_64.run"

LICENSE="ATI"
KEYWORDS="~amd64 ~x86"

# The portage dep is for COLON_SEPARATED support in env-update.
RDEPEND="x11-base/xorg-server
      !x11-apps/ati-drivers-extra
      app-admin/eselect-opengl
      =virtual/libstdc++-3.3*
      acpi? (
                x11-apps/xauth
                sys-power/acpid
      )
      qt3? ( =x11-libs/qt-3* )
      >=sys-apps/portage-2.1.1-r1"

DEPEND=">=virtual/linux-sources-2.6
      ${RDEPEND}"

# Ignore QA warnings about multilib-pkg-force not existing:
# multilib.eclass uses it (without it we do not install the 32 bit
# libraries on amd64) --marienz
RESTRICT="multilib-pkg-force"

QA_EXECSTACK_x86="usr/lib/dri/fglrx_dri.so
      usr/lib/opengl/ati/lib/libGL.so.1.2"
QA_EXECSTACK_amd64="usr/lib64/dri/fglrx_dri.so
      usr/lib32/dri/fglrx_dri.so
      usr/lib64/opengl/ati/lib/libGL.so.1.2
      usr/lib32/opengl/ati/lib/libGL.so.1.2"
QA_TEXTRELS_x86="usr/lib/dri/fglrx_dri.so
      usr/lib/dri/atiogl_a_dri.so
      usr/lib/xorg/modules/drivers/fglrx_drv.so
      usr/lib/opengl/ati/lib/libGL.so.1.2"
QA_TEXTRELS_amd64="
      usr/lib64/opengl/ati/lib/libGL.so.1.2
      usr/lib32/opengl/ati/lib/libGL.so.1.2
      usr/lib64/dri/fglrx_dri.so
      usr/lib32/dri/fglrx_dri.so
      usr/lib64/dri/atiogl_a_dri.so
      usr/lib32/dri/atiogl_a_dri.so"

S="${WORKDIR}"

pkg_setup() {
      #check kernel and sets up KV_OBJ
      MODULE_NAMES="fglrx(video:${S}/common/lib/modules/fglrx/build_mod/2.6.x)"
      BUILD_TARGETS="kmod_build"
      linux-mod_pkg_setup
      BUILD_PARAMS="GCC_VER_MAJ=$(gcc-major-version) KVER=${KV_FULL} KDIR=${KV_DIR}"

      if ! linux_chkconfig_present MTRR; then
                ewarn "You don't have MTRR support enabled, the direct rendering will not work."
      fi

      if linux_chkconfig_builtin DRM; then
                ewarn "You have DRM support enabled builtin, the direct rendering will not work."
      fi

      if ! linux_chkconfig_present AGP && \
                ! linux_chkconfig_present PCIEPORTBUS; then
                ewarn "You need AGP and/or PCI Express support for direct rendering to work."
      fi

      # xorg-server 1.1 and its prereleases correspond to xorg 7.1.
      if has_version ">=x11-base/xorg-server-1.0.99"; then
                BASE_DIR="${S}/x710"
      else
                BASE_DIR="${S}/x690"
      fi

      if use amd64 ; then
                BASE_DIR="${BASE_DIR}_64a"
                # This is used like $(get_libdir) for paths in ati's package.
                PKG_LIBDIR=lib64
                ARCH_DIR="${S}/arch/x86_64"
      else
                PKG_LIBDIR=lib
                ARCH_DIR="${S}/arch/x86"
      fi
}

src_unpack() {
      local src="${DISTDIR}/${A}"
      # This is apparently a nonstandard makeself archive, so extract
      # the offset by hand.
      local offset=$(grep -am1 SKIP "${src}" | sed -e 's/SKIP="\([0-9]\+\)"/\1/')
      # It is off by one because of an (unused) checksum field.
      unpack_makeself "${src}" $(( offset + 1 )) tail || die "unpack failed"

      gunzip common/usr/share/man/man8/atieventsd.8 || die "manpage unzip failed"
      # These are the userspace utilities that we also have source for.
      # We rebuild those in ati-drivers-extra.
      rm \
                "${ARCH_DIR}"/usr/X11R6/bin/{fgl_glxgears,fglrx_xgamma} \
                "${ARCH_DIR}"/usr/X11R6/${PKG_LIBDIR}/libfglrx_gamma* \
                || die "bin rm failed"

      epatch "${FILESDIR}"/${PN}-2.6.20.patch

      if use acpi; then
                sed -i \
                        -e "s:/var/lib/xdm/authdir/:/etc/X11/xdm/authdir/:" \
                        -e "s:/var/lib/gdm/:/var/gdm/:" \
                        -e "s/#ffff#/#ffff##:.*MIT-MAGIC-COOKIE/" \
                        "${S}/common/etc/ati/authatieventsd.sh" \
                        || die "sed failed."

                # Adjust paths in the script from /usr/X11R6/bin/ to /opt/bin/
                epatch "${FILESDIR}"/ati-powermode-opt-path.patch
      fi

      pushd common/lib/modules/fglrx/build_mod >/dev/null
      ln -s "${ARCH_DIR}"/lib/modules/fglrx/build_mod/libfglrx_ip.a.GCC$(gcc-major-version) \
                || die "symlinking precompiled core failed"

      convert_to_m 2.6.x/Makefile || die "convert_to_m failed"

      # When built with ati's make.sh it defines a bunch of macros if
      # certain .config values are set, falling back to less reliable
      # detection methods if linux/autoconf.h is not available. We
      # simply use the linux/autoconf.h settings directly, bypassing the
      # detection script.
      sed -i -e 's/__SMP__/CONFIG_SMP/' *.c *h || die "SMP sed failed"
      sed -i -e 's/ifdef MODVERSIONS/ifdef CONFIG_MODVERSIONS/' *.c *.h \
                || die "MODVERSIONS sed failed"
      popd >/dev/null

      mkdir panel extra || die "mkdirs failed"
      # The ./ in these unpacks is required (or unpack looks in ${DISTDIR})
      if use qt3; then
                cd panel
                unpack ./../common/usr/src/ati/fglrx_panel_sources.tgz
                cd ..
      fi
      cd extra
      unpack ./../common/usr/src/ati/fglrx_sample_source.tgz
      sed -i -e 's:include/extensions/extutil.h:X11/extensions/extutil.h:' \
                lib/fglrx_gamma/fglrx_gamma.c || die "include fixup failed"
      # Add a category.
      mv programs/fglrx_gamma/fglrx_xgamma.{man,1} || die "man mv failed"
      cd ..
}

src_compile() {
      linux-mod_src_compile

      einfo "Building fgl_glxgears"
      cd "${S}"/extra/fgl_glxgears
      # These extra libs/utils either have an Imakefile that does not
      # work very well without tweaking or a Makefile ignoring CFLAGS
      # and the like. We bypass those.

      # The -DUSE_GLU is needed to compile using nvidia headers
      # according to a comment in ati-drivers-extra-8.33.6.ebuild.
      "$(tc-getCC)" -o fgl_fglxgears ${CFLAGS} ${LDFLAGS} -DUSE_GLU \
                -lGL -lGLU -lX11 -lm fgl_glxgears.c || die "fgl_glxgears build failed"

      einfo "Building fglrx_gamma lib"
      cd "${S}"/extra/lib/fglrx_gamma
      "$(tc-getCC)" -shared -fpic -o libfglrx_gamma.so.1.0 ${CFLAGS} ${LDFLAGS} \
                fglrx_gamma.c -DXF86MISC -Wl,-soname,libfglrx_gamma.so.1.0 \
                || die "fglrx_gamma lib build failed"
      ln -s libfglrx_gamma.so.1.0 libfglrx_gamma.so || die "ln failed"
      ln -s libfglrx_gamma.so.1.0 libfglrx_gamma.so.1 || die "ln failed"

      einfo "Building fglrx_gamma util"
      cd "${S}"/extra/programs/fglrx_gamma
      "$(tc-getCC)" -o fglrx_xgamma ${CFLAGS} ${LDFLAGS} fglrx_xgamma.c \
                -lm -lfglrx_gamma -lX11 -lXext -L../../lib/fglrx_gamma \
                || die "fglrx_gamma util build failed"

      if use qt3; then
                einfo "Building the QT panel"
                cd "${S}"/panel
                emake CDEBFLAGS="${CFLAGS}" CCDEBFLAGS="${CXXFLAGS}" STRIP=true \
                        || die "panel build failed"
      fi
}

src_install() {
      linux-mod_src_install

      # We can do two things here, and neither of them is very nice.

      # For direct rendering libGL has to be able to load one or more
      # dri modules (files ending in _dri.so, like fglrx_dri.so).
      # Gentoo's mesa looks for these files in the location specified by
      # LIBGL_DRIVERS_PATH or LIBGL_DRIVERS_DIR, then in the hardcoded
      # location /usr/$(get_libdir)/dri. Ati's libGL does the same
      # thing, but the hardcoded location is /usr/X11R6/lib/modules/dri
      # on x86 and amd64 32bit, /usr/X11R6/lib64/modules/dri on amd64
      # 64bit. So we can either put the .so files in that (unusual,
      # compared to "normal" mesa libGL) location or set
      # LIBGL_DRIVERS_PATH. We currently do the latter. See also bug
      # 101539.

      # The problem with this approach is that LIBGL_DRIVERS_PATH
      # *overrides* the default hardcoded location, it does not extend
      # it. So if ati-drivers is merged but a non-ati libGL is selected
      # and its hardcoded path does not match our LIBGL_DRIVERS_PATH
      # (because it changed in a newer mesa or because it was compiled
      # for a different set of multilib abis than we are) stuff breaks.

      # We create one file per ABI to work with "native" multilib, see
      # below.

      echo "COLON_SEPARATED=LIBGL_DRIVERS_PATH" > "${T}/03ati-colon-sep"
      doenvd "${T}/03ati-colon-sep"

      # All libraries that we have a 32 bit and 64 bit version of on
      # amd64 are installed in src_install-libs. Everything else
      # (including libraries only available in native 64bit on amd64)
      # goes in here.

      # There used to be some code here that tried to detect running
      # under a "native multilib" portage ((precursor of)
      # http://dev.gentoo.org/~kanaka/auto-multilib/). I removed that, it
      # should just work (only doing some duplicate work). --marienz
      if has_multilib_profile; then
                local OABI=${ABI}
                for ABI in $(get_install_abis); do
                        src_install-libs
                done
                ABI=${OABI}
                unset OABI
      else
                src_install-libs
      fi

      # This is sorted by the order the files occur in the source tree.

      # X modules.
      exeinto /usr/$(get_libdir)/xorg/modules/drivers
      doexe "${BASE_DIR}"/usr/X11R6/${PKG_LIBDIR}/modules/drivers/fglrx_drv.so
      exeinto /usr/$(get_libdir)/xorg/modules/linux
      doexe "${BASE_DIR}"/usr/X11R6/${PKG_LIBDIR}/modules/linux/libfglrxdrm.so

      # Arch-specific files.
      # (s)bin.
      into /opt
      if use acpi; then
                dosbin "${ARCH_DIR}"/usr/sbin/atieventsd
      fi
      # We cleaned out the compilable stuff in src_unpack
      dobin "${ARCH_DIR}"/usr/X11R6/bin/*

      # lib.
      exeinto /usr/$(get_libdir)
      # Everything except for the libGL.so installed in src_install-libs.
      doexe $(find "${ARCH_DIR}"/usr/X11R6/${PKG_LIBDIR} \
                -maxdepth 1 -type f -name '*.so*' -not -name 'libGL.so*')
      insinto /usr/$(get_libdir)
      doins $(find "${ARCH_DIR}"/usr/X11R6/${PKG_LIBDIR} \
                -maxdepth 1 -type f -not -name '*.so*')

      # Common files.
      # etc.
      insinto /etc/ati
      # Everything except for the authatieventsd.sh script.
      doins common/etc/ati/{fglrxprofiles.csv,fglrxrc,logo*}
      if use acpi; then
                doins common/etc/ati/authatieventsd.sh
      fi

      # include.
      insinto /usr
      doins -r common/usr/include
      insinto /usr/include/X11/extensions
      doins common/usr/X11R6/include/X11/extensions/fglrx_gamma.h

      # Just the atigetsysteminfo.sh script.
      into /usr
      dosbin common/usr/sbin/*

      # doc.
      if use doc; then
                dohtml -r common/usr/share/doc/fglrx
      fi
      if use acpi; then
                doman common/usr/share/man/man8/atieventsd.8

                pushd common/usr/share/doc/fglrx/examples/etc/acpi >/dev/null

                exeinto /etc/acpi
                doexe ati-powermode.sh
                insinto /etc/acpi/events
                doins events/*

                popd >/dev/null
      fi

      # Done with the "source" tree. Install tools we rebuilt:
      dobin extra/fgl_glxgears/fgl_fglxgears
      newdoc extra/fgl_glxgears/README README.fgl_glxgears

      dolib extra/lib/fglrx_gamma/*so*
      newdoc extra/lib/fglrx_gamma/README README.libfglrx_gamma

      dobin extra/programs/fglrx_gamma/fglrx_xgamma
      doman extra/programs/fglrx_gamma/fglrx_xgamma.1
      newdoc extra/programs/fglrx_gamma/README README.fglrx_gamma

      if use qt3; then
                dobin panel/fireglcontrol
                make_desktop_entry fireglcontrol 'ATI Control' ati.xpm System
                insinto /usr/share/pixmaps
                doins common/usr/share/icons/ati.xpm
      fi

      # Gentoo-specific stuff:

      if use acpi; then
                newinitd "${FILESDIR}"/atieventsd.rc6 atieventsd
                echo 'ATIEVENTSDOPTS=""' > "${T}"/atieventsd.confd
                newconfd "${T}"/atieventsd.confd atieventsd
      fi
}

src_install-libs() {
      if [[ "${ABI}" == "amd64" ]]; then
                local pkglibdir=lib64
      else
                local pkglibdir=lib
      fi
      einfo "ati tree '${pkglibdir}' -> '$(get_libdir)' on system"

      local ATI_ROOT=/usr/$(get_libdir)/opengl/ati

      # The GLX libraries
      # (yes, this really is "lib" even on amd64/multilib --marienz)
      exeinto ${ATI_ROOT}/lib
      doexe "${ARCH_DIR}"/usr/X11R6/${pkglibdir}/libGL.so.1.2
      dosym libGL.so.1.2 ${ATI_ROOT}/lib/libGL.so.1
      dosym libGL.so.1.2 ${ATI_ROOT}/lib/libGL.so

      # Same as the xorg implementation (eselect opengl does not fall
      # back to xorg-x11 if we omit this symlink, meaning no glx).
      dosym ../xorg-x11/extensions ${ATI_ROOT}/extensions

      #Workaround
      if use opengl; then
                # Is this necessary? Is this sane? --marienz
                sed -e "s:libdir=.*:libdir=${ATI_ROOT}/lib:" \
                        /usr/$(get_libdir)/opengl/xorg-x11/lib/libGL.la \
                        > "${D}"/${ATI_ROOT}/lib/libGL.la
                # Commented out, just like the extensions one --marienz
                # dosym ../xorg-x11/include ${ATI_ROOT}/include
      fi

      # DRI modules, installed into the path used by recent versions of mesa.
      exeinto /usr/$(get_libdir)/dri
      doexe "${ARCH_DIR}"/usr/X11R6/${pkglibdir}/modules/dri/fglrx_dri.so
      doexe "${ARCH_DIR}"/usr/X11R6/${pkglibdir}/modules/dri/atiogl_a_dri.so

      local envname="${T}"/04ati-dri-path
      if [[ -n ${ABI} ]]; then
                envname="${envname}-${ABI}"
      fi
      echo "LIBGL_DRIVERS_PATH=/usr/$(get_libdir)/dri" > "${envname}"
      doenvd "${envname}"
}

pkg_postinst() {
      /usr/bin/eselect opengl set --use-old ati

      elog "To switch to ATI OpenGL, run \"eselect opengl set ati\""
      elog "To change your xorg.conf you can use the bundled \"aticonfig\""
      if use !opengl ; then
                ewarn "You don't have the opengl useflag enabled, you won't be able to build"
                ewarn "opengl applications nor use opengl driver features, if that isn't"
                ewarn "the intended behaviour please add opengl to your useflag and issue"
                ewarn "# emerge -Nu ati-drivers"
      fi
      elog "If you experience unexplained segmentation faults and kernel crashes"
      elog "with this driver and multi-threaded applications such as wine,"
      elog "set UseFastTLS in xorg.conf to either 0 or 1, but not 2."
      elog
      # (to get the LIBGL_DRIVERS_PATH)
      elog "You will have to source /etc/profile (or logout and back in) for dri"
      elog "to work, unless you previously had ati-drivers installed."
      # DRM module
      linux-mod_pkg_postinst
}

pkg_postrm() {
      linux-mod_pkg_postrm
      /usr/bin/eselect opengl set --use-old xorg-x11
}

sejishikong 发表于 2007-2-24 09:46:22

8.34.8已经自带了补丁,不过我还是编译不过。

jiangtao9999 发表于 2007-2-24 20:03:54

:neutral:
看看 Gentoo 的 8.34.8 的 eBuild:
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/x11-drivers/ati-drivers/ati-drivers-8.34.8.ebuild,v 1.1 2007/02/22 22:24:22 marienz Exp $

IUSE="acpi qt3"

inherit eutils multilib linux-mod toolchain-funcs

DESCRIPTION="Ati precompiled drivers for recent chipsets"
HOMEPAGE="http://www.ati.com"
ATI_URL="https://a248.e.akamai.net/f/674/9206/0/www2.ati.com/drivers/linux/"
SRC_URI="${ATI_URL}/ati-driver-installer-${PV}-x86.x86_64.run"

LICENSE="ATI GPL-2 QPL-1.0"
KEYWORDS="~amd64 ~x86"

# The portage dep is for COLON_SEPARATED support in env-update.
RDEPEND="x11-base/xorg-server
      !x11-apps/ati-drivers-extra
      app-admin/eselect-opengl
      =virtual/libstdc++-3.3*
      acpi? (
                x11-apps/xauth
                sys-power/acpid
      )
      qt3? ( =x11-libs/qt-3* )
      >=sys-apps/portage-2.1.1-r1"

DEPEND="${RDEPEND}"

# Ignore QA warnings about multilib-pkg-force not existing:
# multilib.eclass uses it (without it we do not install the 32 bit
# libraries on amd64) --marienz
RESTRICT="multilib-pkg-force"

QA_EXECSTACK_x86="usr/lib/dri/fglrx_dri.so
      usr/lib/opengl/ati/lib/libGL.so.1.2"
QA_EXECSTACK_amd64="usr/lib64/dri/fglrx_dri.so
      usr/lib32/dri/fglrx_dri.so
      usr/lib64/opengl/ati/lib/libGL.so.1.2
      usr/lib32/opengl/ati/lib/libGL.so.1.2"
QA_TEXTRELS_x86="usr/lib/dri/fglrx_dri.so
      usr/lib/xorg/modules/drivers/fglrx_drv.so
      usr/lib/opengl/ati/lib/libGL.so.1.2"
QA_TEXTRELS_amd64="
      usr/lib64/opengl/ati/lib/libGL.so.1.2
      usr/lib32/opengl/ati/lib/libGL.so.1.2
      usr/lib64/dri/fglrx_dri.so
      usr/lib32/dri/fglrx_dri.so"

S="${WORKDIR}"

pkg_setup() {
      #check kernel and sets up KV_OBJ
      MODULE_NAMES="fglrx(video:${S}/common/lib/modules/fglrx/build_mod/2.6.x)"
      BUILD_TARGETS="kmod_build"
      linux-mod_pkg_setup
      BUILD_PARAMS="GCC_VER_MAJ=$(gcc-major-version) KVER=${KV_FULL} KDIR=${KV_DIR}"

      if ! kernel_is 2 6; then
                eerror "Need a 2.6 kernel to compile against!"
                die "Need a 2.6 kernel to compile against!"
      fi

      if ! linux_chkconfig_present MTRR; then
                ewarn "You don't have MTRR support enabled, the direct rendering will not work."
      fi

      if linux_chkconfig_builtin DRM; then
                ewarn "You have DRM support enabled builtin, the direct rendering will not work."
      fi

      if ! linux_chkconfig_present AGP && \
                ! linux_chkconfig_present PCIEPORTBUS; then
                ewarn "You need AGP and/or PCI Express support for direct rendering to work."
      fi

      # xorg-server 1.1 and its prereleases correspond to xorg 7.1.
      if has_version ">=x11-base/xorg-server-1.0.99"; then
                BASE_DIR="${S}/x710"
      else
                BASE_DIR="${S}/x690"
      fi

      if use amd64 ; then
                BASE_DIR="${BASE_DIR}_64a"
                # This is used like $(get_libdir) for paths in ati's package.
                PKG_LIBDIR=lib64
                ARCH_DIR="${S}/arch/x86_64"
      else
                PKG_LIBDIR=lib
                ARCH_DIR="${S}/arch/x86"
      fi
}

src_unpack() {
      local src="${DISTDIR}/${A}"
      # This is apparently a nonstandard makeself archive, so extract
      # the offset by hand.
      local offset=$(grep -am1 SKIP "${src}" | sed -e 's/SKIP="\([0-9]\+\)"/\1/')
      # It is off by one because of an (unused) checksum field.
      unpack_makeself "${src}" $(( offset + 1 )) tail || die "unpack failed"

      gunzip common/usr/share/man/man8/atieventsd.8 || die "manpage unzip failed"
      # These are the userspace utilities that we also have source for.
      # We rebuild those in ati-drivers-extra.
      rm \
                "${ARCH_DIR}"/usr/X11R6/bin/{fgl_glxgears,fglrx_xgamma} \
                "${ARCH_DIR}"/usr/X11R6/${PKG_LIBDIR}/libfglrx_gamma* \
                || die "bin rm failed"

      # This patch is conditional because it contains an api change.
      if kernel_is ge 2 6 20; then
                epatch packages/Fedora/ati-drivers-2.6.20.patch
      fi

      if use acpi; then
                sed -i \
                        -e "s:/var/lib/xdm/authdir/:/etc/X11/xdm/authdir/:" \
                        -e "s:/var/lib/gdm/:/var/gdm/:" \
                        -e "s/#ffff#/#ffff##:.*MIT-MAGIC-COOKIE/" \
                        "${S}/common/etc/ati/authatieventsd.sh" \
                        || die "sed failed."

                # Adjust paths in the script from /usr/X11R6/bin/ to /opt/bin/
                epatch "${FILESDIR}"/ati-powermode-opt-path.patch
      fi

      pushd common/lib/modules/fglrx/build_mod >/dev/null
      ln -s "${ARCH_DIR}"/lib/modules/fglrx/build_mod/libfglrx_ip.a.GCC$(gcc-major-version) \
                || die "symlinking precompiled core failed"

      convert_to_m 2.6.x/Makefile || die "convert_to_m failed"

      # When built with ati's make.sh it defines a bunch of macros if
      # certain .config values are set, falling back to less reliable
      # detection methods if linux/autoconf.h is not available. We
      # simply use the linux/autoconf.h settings directly, bypassing the
      # detection script.
      sed -i -e 's/__SMP__/CONFIG_SMP/' *.c *h || die "SMP sed failed"
      sed -i -e 's/ifdef MODVERSIONS/ifdef CONFIG_MODVERSIONS/' *.c *.h \
                || die "MODVERSIONS sed failed"
      popd >/dev/null

      mkdir panel extra || die "mkdirs failed"
      # The ./ in these unpacks is required (or unpack looks in ${DISTDIR})
      if use qt3; then
                cd panel
                unpack ./../common/usr/src/ati/fglrx_panel_sources.tgz
                cd ..
      fi
      cd extra
      unpack ./../common/usr/src/ati/fglrx_sample_source.tgz
      sed -i -e 's:include/extensions/extutil.h:X11/extensions/extutil.h:' \
                lib/fglrx_gamma/fglrx_gamma.c || die "include fixup failed"
      # Add a category.
      mv programs/fglrx_gamma/fglrx_xgamma.{man,1} || die "man mv failed"
      cd ..
}

src_compile() {
      linux-mod_src_compile

      einfo "Building fgl_glxgears"
      cd "${S}"/extra/fgl_glxgears
      # These extra libs/utils either have an Imakefile that does not
      # work very well without tweaking or a Makefile ignoring CFLAGS
      # and the like. We bypass those.

      # The -DUSE_GLU is needed to compile using nvidia headers
      # according to a comment in ati-drivers-extra-8.33.6.ebuild.
      "$(tc-getCC)" -o fgl_fglxgears ${CFLAGS} ${LDFLAGS} -DUSE_GLU \
                -lGL -lGLU -lX11 -lm fgl_glxgears.c || die "fgl_glxgears build failed"

      einfo "Building fglrx_gamma lib"
      cd "${S}"/extra/lib/fglrx_gamma
      "$(tc-getCC)" -shared -fpic -o libfglrx_gamma.so.1.0 ${CFLAGS} ${LDFLAGS} \
                fglrx_gamma.c -DXF86MISC -Wl,-soname,libfglrx_gamma.so.1.0 \
                || die "fglrx_gamma lib build failed"
      ln -s libfglrx_gamma.so.1.0 libfglrx_gamma.so || die "ln failed"
      ln -s libfglrx_gamma.so.1.0 libfglrx_gamma.so.1 || die "ln failed"

      einfo "Building fglrx_gamma util"
      cd "${S}"/extra/programs/fglrx_gamma
      "$(tc-getCC)" -o fglrx_xgamma ${CFLAGS} ${LDFLAGS} fglrx_xgamma.c \
                -lm -lfglrx_gamma -lX11 -lXext -L../../lib/fglrx_gamma \
                || die "fglrx_gamma util build failed"

      if use qt3; then
                einfo "Building the QT panel"
                cd "${S}"/panel
                emake CDEBFLAGS="${CFLAGS}" CCDEBFLAGS="${CXXFLAGS}" STRIP=true \
                        || die "panel build failed"
      fi
}

src_install() {
      linux-mod_src_install

      # We can do two things here, and neither of them is very nice.

      # For direct rendering libGL has to be able to load one or more
      # dri modules (files ending in _dri.so, like fglrx_dri.so).
      # Gentoo's mesa looks for these files in the location specified by
      # LIBGL_DRIVERS_PATH or LIBGL_DRIVERS_DIR, then in the hardcoded
      # location /usr/$(get_libdir)/dri. Ati's libGL does the same
      # thing, but the hardcoded location is /usr/X11R6/lib/modules/dri
      # on x86 and amd64 32bit, /usr/X11R6/lib64/modules/dri on amd64
      # 64bit. So we can either put the .so files in that (unusual,
      # compared to "normal" mesa libGL) location or set
      # LIBGL_DRIVERS_PATH. We currently do the latter. See also bug
      # 101539.

      # The problem with this approach is that LIBGL_DRIVERS_PATH
      # *overrides* the default hardcoded location, it does not extend
      # it. So if ati-drivers is merged but a non-ati libGL is selected
      # and its hardcoded path does not match our LIBGL_DRIVERS_PATH
      # (because it changed in a newer mesa or because it was compiled
      # for a different set of multilib abis than we are) stuff breaks.

      # We create one file per ABI to work with "native" multilib, see
      # below.

      echo "COLON_SEPARATED=LIBGL_DRIVERS_PATH" > "${T}/03ati-colon-sep"
      doenvd "${T}/03ati-colon-sep"

      # All libraries that we have a 32 bit and 64 bit version of on
      # amd64 are installed in src_install-libs. Everything else
      # (including libraries only available in native 64bit on amd64)
      # goes in here.

      # There used to be some code here that tried to detect running
      # under a "native multilib" portage ((precursor of)
      # http://dev.gentoo.org/~kanaka/auto-multilib/). I removed that, it
      # should just work (only doing some duplicate work). --marienz
      if has_multilib_profile; then
                local OABI=${ABI}
                for ABI in $(get_install_abis); do
                        src_install-libs
                done
                ABI=${OABI}
                unset OABI
      else
                src_install-libs
      fi

      # This is sorted by the order the files occur in the source tree.

      # X modules.
      exeinto /usr/$(get_libdir)/xorg/modules/drivers
      doexe "${BASE_DIR}"/usr/X11R6/${PKG_LIBDIR}/modules/drivers/fglrx_drv.so
      exeinto /usr/$(get_libdir)/xorg/modules/linux
      doexe "${BASE_DIR}"/usr/X11R6/${PKG_LIBDIR}/modules/linux/libfglrxdrm.so

      # Arch-specific files.
      # (s)bin.
      into /opt
      if use acpi; then
                dosbin "${ARCH_DIR}"/usr/sbin/atieventsd
      fi
      # We cleaned out the compilable stuff in src_unpack
      dobin "${ARCH_DIR}"/usr/X11R6/bin/*

      # lib.
      exeinto /usr/$(get_libdir)
      # Everything except for the libGL.so installed in src_install-libs.
      doexe $(find "${ARCH_DIR}"/usr/X11R6/${PKG_LIBDIR} \
                -maxdepth 1 -type f -name '*.so*' -not -name 'libGL.so*')
      insinto /usr/$(get_libdir)
      doins $(find "${ARCH_DIR}"/usr/X11R6/${PKG_LIBDIR} \
                -maxdepth 1 -type f -not -name '*.so*')

      # Common files.
      # etc.
      insinto /etc/ati
      # Everything except for the authatieventsd.sh script.
      doins common/etc/ati/{fglrxprofiles.csv,fglrxrc,logo*}
      if use acpi; then
                doins common/etc/ati/authatieventsd.sh
      fi

      # include.
      insinto /usr
      doins -r common/usr/include
      insinto /usr/include/X11/extensions
      doins common/usr/X11R6/include/X11/extensions/fglrx_gamma.h

      # Just the atigetsysteminfo.sh script.
      into /usr
      dosbin common/usr/sbin/*

      # doc.
      dohtml -r common/usr/share/doc/fglrx

      if use acpi; then
                doman common/usr/share/man/man8/atieventsd.8

                pushd common/usr/share/doc/fglrx/examples/etc/acpi >/dev/null

                exeinto /etc/acpi
                doexe ati-powermode.sh
                insinto /etc/acpi/events
                doins events/*

                popd >/dev/null
      fi

      # Done with the "source" tree. Install tools we rebuilt:
      dobin extra/fgl_glxgears/fgl_fglxgears
      newdoc extra/fgl_glxgears/README README.fgl_glxgears

      dolib extra/lib/fglrx_gamma/*so*
      newdoc extra/lib/fglrx_gamma/README README.libfglrx_gamma

      dobin extra/programs/fglrx_gamma/fglrx_xgamma
      doman extra/programs/fglrx_gamma/fglrx_xgamma.1
      newdoc extra/programs/fglrx_gamma/README README.fglrx_gamma

      if use qt3; then
                dobin panel/fireglcontrol
                make_desktop_entry fireglcontrol 'ATI Control' ati.xpm System
                insinto /usr/share/pixmaps
                doins common/usr/share/icons/ati.xpm
      fi

      # Gentoo-specific stuff:

      if use acpi; then
                newinitd "${FILESDIR}"/atieventsd.init atieventsd
                echo 'ATIEVENTSDOPTS=""' > "${T}"/atieventsd.conf
                newconfd "${T}"/atieventsd.conf atieventsd
      fi
}

src_install-libs() {
      if [[ "${ABI}" == "amd64" ]]; then
                local pkglibdir=lib64
      else
                local pkglibdir=lib
      fi
      einfo "ati tree '${pkglibdir}' -> '$(get_libdir)' on system"

      local ATI_ROOT=/usr/$(get_libdir)/opengl/ati

      # The GLX libraries
      # (yes, this really is "lib" even on amd64/multilib --marienz)
      exeinto ${ATI_ROOT}/lib
      doexe "${ARCH_DIR}"/usr/X11R6/${pkglibdir}/libGL.so.1.2
      dosym libGL.so.1.2 ${ATI_ROOT}/lib/libGL.so.1
      dosym libGL.so.1.2 ${ATI_ROOT}/lib/libGL.so

      # Same as the xorg implementation (eselect opengl does not fall
      # back to xorg-x11 if we omit this symlink, meaning no glx).
      dosym ../xorg-x11/extensions ${ATI_ROOT}/extensions

      # Is this necessary? Is this sane? --marienz
      sed -e "s:libdir=.*:libdir=${ATI_ROOT}/lib:" \
                /usr/$(get_libdir)/opengl/xorg-x11/lib/libGL.la \
                > "${D}"/${ATI_ROOT}/lib/libGL.la

      # Commented out until determined it is necessary --marienz
      # dosym ../xorg-x11/include ${ATI_ROOT}/include

      # DRI modules, installed into the path used by recent versions of mesa.
      exeinto /usr/$(get_libdir)/dri
      doexe "${ARCH_DIR}"/usr/X11R6/${pkglibdir}/modules/dri/fglrx_dri.so

      local envname="${T}"/04ati-dri-path
      if [[ -n ${ABI} ]]; then
                envname="${envname}-${ABI}"
      fi
      echo "LIBGL_DRIVERS_PATH=/usr/$(get_libdir)/dri" > "${envname}"
      doenvd "${envname}"
}

pkg_postinst() {
      /usr/bin/eselect opengl set --use-old ati

      elog "To switch to ATI OpenGL, run \"eselect opengl set ati\""
      elog "To change your xorg.conf you can use the bundled \"aticonfig\""
      elog
      elog "If you experience unexplained segmentation faults and kernel crashes"
      elog "with this driver and multi-threaded applications such as wine,"
      elog "set UseFastTLS in xorg.conf to either 0 or 1, but not 2."
      elog
      # (to get the LIBGL_DRIVERS_PATH)
      elog "You will have to source /etc/profile (or logout and back in) for dri"
      elog "to work, unless you previously had ati-drivers installed."
      # DRM module
      linux-mod_pkg_postinst
}

pkg_postrm() {
      linux-mod_pkg_postrm
      /usr/bin/eselect opengl set --use-old xorg-x11
}

sejishikong 发表于 2007-2-25 13:48:07

呵呵,用fc的Srpm解决了。可惜官方驱动不支持beryl

jiangtao9999 发表于 2007-2-25 21:17:14

呵呵,用fc的Srpm解决了。可惜官方驱动不支持beryl
你的意思是说我的 Gentoo 不能用 beryl ?

sejishikong 发表于 2007-2-25 22:18:38

因为ML的X不带XGL,所以只能用AIGLX,这样ATI的就不支持了。
因为ATI驱动不能启用Composite。
Gentoo的X应该是带XGL的吧。

jiangtao9999 发表于 2007-2-25 22:23:57

ATI + Gentoo + XGL 。
ATI 显卡 AIGLX 的支持只能用开源驱动,但开源驱动不支持 R300 和以后的版本,官方驱动只支持开源驱动不支持的版本。也就是说最新官方驱动不支持的显卡,都能用 AIGLX 。

我觉得 ML 一定要支持 XGL 。不然 beryl 根本没有支持的必要。
页: [1] 2
查看完整版本: ML 2.1alpha3的ATI显卡支持需要改进了…………