找回密码
 注册
查看: 4885|回复: 15

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

[复制链接]
发表于 2007-2-21 21:54:51 | 显示全部楼层 |阅读模式
装好后,用 vesa 根本不能成功启动 X ,导致显示器黑屏。甚至切换 tty 导致死机。
强行拷贝 ati 驱动到 xorg 的目录,也不能用 fglrx 启动 X ,同样黑屏,但可以切换 tty 去摸黑运行重启。(alpha2 我这么成功过)

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

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



bug 管理网站我又忘了地址了………………
发表于 2007-2-21 22:52:04 | 显示全部楼层
jira.321211.net:8080
ati的显卡我也有,所以这个问题发布之前就知道了,问题在于alpha3的组件太新了,可能需要等ati官方驱动的更新。
vesa应该可以的才对。
回复

使用道具 举报

 楼主| 发表于 2007-2-21 23:07:28 | 显示全部楼层
我这里 vesa 不行,我怀疑是我的显卡支持 DVI 和 VGA 同时输出,我用 DVI ,空着 VGA ,导致输出的端口识别错误。
好像某个 ati 官方版本也有这个错误,导致没有显示,但可以重新定义输出端口的排列,所以加参数就行了。

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

使用道具 举报

 楼主| 发表于 2007-2-21 23:55:05 | 显示全部楼层
跑个题:kernel 的 RTC stores time in GMT (APM_RTC_IS_GMT) 干啥用的?
回复

使用道具 举报

 楼主| 发表于 2007-2-22 10:26:18 | 显示全部楼层
很怪异,新的 8.34.8 驱动也是不能安装,kernel module 编译出错,竟然和老版本一样是语法错误………………
回复

使用道具 举报

发表于 2007-2-22 20:04:29 | 显示全部楼层
我编译的kernel可能有些问题,等KDE的新内核吧。
回复

使用道具 举报

 楼主| 发表于 2007-2-22 22:25:25 | 显示全部楼层

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

使用道具 举报

发表于 2007-2-22 22:46:01 | 显示全部楼层
如果能正常编译内核模块,应该没问题。
补丁在哪儿?
回复

使用道具 举报

 楼主| 发表于 2007-2-22 22:56:52 | 显示全部楼层
这个是 patch :
[code:1]--- common/lib/modules/fglrx/build_mod/firegl_public.c  2006-12-18 10:58:15.000000000 -0500
+++ common/lib/modules/fglrx/build_mod/firegl_public.c  2006-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);
[/code:1]
他的 ebuild 脚本,我没看懂…………
[code:1]# 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
}
[/code:1]
回复

使用道具 举报

发表于 2007-2-24 09:46:22 | 显示全部楼层
8.34.8已经自带了补丁,不过我还是编译不过。
回复

使用道具 举报

 楼主| 发表于 2007-2-24 20:03:54 | 显示全部楼层
:neutral:
看看 Gentoo 的 8.34.8 的 eBuild:
[code:1]# 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
}
[/code:1]
回复

使用道具 举报

发表于 2007-2-25 13:48:07 | 显示全部楼层
呵呵,用fc的Srpm解决了。可惜官方驱动不支持beryl
回复

使用道具 举报

 楼主| 发表于 2007-2-25 21:17:14 | 显示全部楼层
[quote:0905c6074d="sejishikong"]呵呵,用fc的Srpm解决了。可惜官方驱动不支持beryl[/quote]
你的意思是说我的 Gentoo 不能用 beryl ?
回复

使用道具 举报

发表于 2007-2-25 22:18:38 | 显示全部楼层
因为ML的X不带XGL,所以只能用AIGLX,这样ATI的就不支持了。
因为ATI驱动不能启用Composite。
Gentoo的X应该是带XGL的吧。
回复

使用道具 举报

 楼主| 发表于 2007-2-25 22:23:57 | 显示全部楼层
ATI + Gentoo + XGL 。
ATI 显卡 AIGLX 的支持只能用开源驱动,但开源驱动不支持 R300 和以后的版本,官方驱动只支持开源驱动不支持的版本。也就是说最新官方驱动不支持的显卡,都能用 AIGLX 。

我觉得 ML 一定要支持 XGL 。不然 beryl 根本没有支持的必要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-1-8 13:01 , Processed in 0.113828 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表