OPENGL drivers support for PCSX2
#1
Here a summary thread of the supported/unsupported feature of open source drivers on linux. Nvidia and AMD proprietary driver have full support of opengl extensions. It is recommended to use proprietary drivers.

Steam stat on GPU distribution:
http://store.steampowered.com/hwsurvey/v...?sort=name


TODO: make a nice array of the opengl extension. The idea will be to check the status on mesa 10.3 (mostly on intel and AMD, nvidia have less issue on linux Wink )

Just install Mesa 10.6 Wink

OpenGL 4 extensions (that are supported by opengl3 HW aka DX10 card):
ARB_separate_shader_objects: mesa 10.3 (buggy unfortunately)
ARB_copy_image: (not sure this one is working on GL3 HW) mesa 10.3 (intel)


Extensions that might be required by future version
ARB_vertex_attrib_binding: 10.3
ARB_clear_texture:
ARB_multi_bind: 10.3
ARB_invalidate_subdata: ?
ARB_bindless_texture: ? (opengl 5?)

dx11 compatibility
dsa: easier access to object



For intel GPU, you can get extension supported by mesa in
Code:
src/mesa/drivers/dri/intel/intel_extensions.
Generation Name
7 ivy bridge
6 sandy bridge
5 ironlake alias HD graphics
4 latest GMA alias GMAX3n00, GMA4500, GMAX4500
3 older stuff and atom....

Radeon driver is a bit more tricky, you need to check gallium capability first:
Code:
src/mesa/state_tracker/st_extensions.c
Then capability in
Code:
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r300/r300_screen.c




Expert only
Solution to easily switch between radeon and catalyst driver:

Create /etc/grub.d/40_linux_multi_GPU
It is mostly a copy of /etc/grub.d/10_linux which create 2 additional entries to select the kernel GPU driver (radeon or fglrx).
Code:
#! /bin/sh
set -e

# Script was updated to duplicate linux entry with additional modprobe options
# 1/ modprobe.blacklist=drm,radeon
# 2/ modprobe.blacklist=fglrx

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="${prefix}"
datarootdir="${prefix}/share"

. "${datarootdir}/grub/grub-mkconfig_lib"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"

CLASS="--class gnu-linux --class gnu --class os"

if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=GNU/Linux
else
  OS="${GRUB_DISTRIBUTOR} GNU/Linux"
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1) ${CLASS}"
fi

# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
  /dev/loop/*|/dev/loop[0-9])
    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
    # We can't cope with devices loop-mounted from files here.
    case ${GRUB_DEVICE} in
      /dev/*) ;;
      *) exit 0 ;;
    esac
  ;;
esac

if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
    || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
    || uses_abstraction "${GRUB_DEVICE}" lvm; then
  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
else
  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi

if [ "x`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true`" = xbtrfs ] \
    || [ "x`stat -f --printf=%T /`" = xbtrfs ]; then
  rootsubvol="`make_system_path_relative_to_its_root /`"
  rootsubvol="${rootsubvol#/}"
  if [ "x${rootsubvol}" != x ]; then
    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
  fi
fi

linux_entry ()
{
  os="$1"
  version="$2"
  recovery="$3"
  args="$4"
  modprobe="$5"
  if [ x$modprobe = xfglrx ]; then
      title="$(gettext_quoted "%s, with Linux %s (free radeon driver)")"
      mod_opt="modprobe.blacklist=${modprobe} fglrx.disable=1"
  else
      title="$(gettext_quoted "%s, with Linux %s (fglrx driver)")"
      mod_opt="modprobe.blacklist=${modprobe} radeon.disable=1 drm.disable=1"
  fi
  printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
  if ! ${recovery} ; then
      save_default_entry | sed -e "s/^/\t/"
  fi

  # Use ELILO's generic "efifb" when it's known to be available.
  # FIXME: We need an interface to select vesafb in case efifb can't be used.
  if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
      cat << EOF
    load_video
EOF
  else
      if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
      cat << EOF
    load_video
EOF
      fi
      cat << EOF
    set gfxpayload=$GRUB_GFXPAYLOAD_LINUX
EOF
  fi

  cat << EOF
    insmod gzio
EOF

  if [ x$dirname = x/ ]; then
    if [ -z "${prepare_root_cache}" ]; then
      prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/")"
    fi
    printf '%s\n' "${prepare_root_cache}"
  else
    if [ -z "${prepare_boot_cache}" ]; then
      prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
    fi
    printf '%s\n' "${prepare_boot_cache}"
  fi
  message="$(gettext_printf "Loading Linux %s ..." ${version})"
  cat << EOF
    echo    '$message'
    linux    ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${mod_opt} ${args}
EOF
  if test -n "${initrd}" ; then
    message="$(gettext_printf "Loading initial ramdisk ...")"
    cat << EOF
    echo    '$message'
    initrd    ${rel_dirname}/${initrd}
EOF
  fi
  cat << EOF
}
EOF
}

case x`uname -m` in
    xi?86 | xx86_64)
    list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do
                  if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
              done` ;;
    *)
    list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do
                  if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
         done` ;;
esac

prepare_boot_cache=
prepare_root_cache=

while [ "x$list" != "x" ] ; do
  linux=`version_find_latest $list`
  echo "Found linux image: $linux" >&2
  basename=`basename $linux`
  dirname=`dirname $linux`
  rel_dirname=`make_system_path_relative_to_its_root $dirname`
  version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
  alt_version=`echo $version | sed -e "s,\.old$,,g"`
  linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"

  initrd=
  for i in "initrd.img-${version}" "initrd-${version}.img" \
       "initrd-${version}" "initramfs-${version}.img" \
       "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
       "initrd-${alt_version}" "initramfs-${alt_version}.img" \
       "initramfs-genkernel-${version}" \
       "initramfs-genkernel-${alt_version}"; do
    if test -e "${dirname}/${i}" ; then
      initrd="$i"
      break
    fi
  done

  config=
  for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
    if test -e "${i}" ; then
      config="${i}"
      break
    fi
  done

  initramfs=
  if test -n "${config}" ; then
      initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"`
  fi

  if test -n "${initrd}" ; then
    echo "Found initrd image: ${dirname}/${initrd}" >&2
  elif test -z "${initramfs}" ; then
    # "UUID=" magic is parsed by initrd or initramfs.  Since there's
    # no initrd or builtin initramfs, it can't work here.
    linux_root_device_thisversion=${GRUB_DEVICE}
  fi

  linux_entry "${OS}" "${version}" false "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "drm,radeon"

  linux_entry "${OS}" "${version}" false "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "fglrx"

  list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
done


Wrapper to launch proper X with correct GL configuration (debian). The script need to be executed by the Display Manager like lightdm.
Code:
#!/bin/sh

if `lsmod | grep -q "^fglrx\b"`; then
    update-alternatives --set glx /usr/lib/fglrx
    exec /usr/bin/X -config xorg-fglrx.conf -nolisten tcp "$@"
else
    update-alternatives --set glx /usr/lib/mesa-diverted
    exec /usr/bin/X -config xorg-radeon.conf -nolisten tcp "$@"
fi

For an unknow reason, on my PC I need to force the loading of the radeon driver.
So add the following line at the end of /etc/modules
Code:
# Force the loading of radeon in the boot except if it is disabled
# I think I got some weird mix between UMS/KMS
# UMS is dropped in ddx(7.X.X) and Kernel 3.9 (UMS is deprecated) (or maybe: configure the kernel => CONFIG_DRM_RADEON_KMS)
# Note: When it works better, disable could potentially be cleaned of
# /etc/grub.d/40_linux_multi_GPU
radeon
Reply

Sponsored links

#2
Thanks for this information - I'll be watching (libre radeon user here, OpenGL 2.1 currently...)
Reply
#3
I thought Intel's drivers were open source and had everything? At least on SB and IB. I don't have Intel though, so I don't really keep track of their graphics and chipset drivers.
Reply
#4
Yes there're open source but incomplete
Reply
#5
The Dolphin project just published an interesting read on the subject

https://dolphin-emu.org/blog/2013/09/26/...fameshame/
Reply
#6
Shame they didn't comment on the libre radeon driver, although I guess they'd pan the OpenGL support (v3.1 is the best I can see, atm I only get at v3 on Debian Testing).
Reply
#7
Right, so now kernel v3.14 has finally reached Debian Testing, I have a full OpenGL v3.3 stack:

Code:
# glxinfo|grep -i opengl

OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD RV770
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.1.2
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.1.2
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:

However GSDx OpenGL still reports all sorts of unsupported OpenGL stuff, including telling me I don't have OpenGL 3.2 functionality:

Code:
Failed to create the opengl context. Check your drivers support openGL 3.3. Hint: opensource drivers don't
EGL: warning your driver doesn't suport advance openGL context attributes
EGL: Mesa Project : 1.4 (Gallium)
EGL: extensions supported: EGL_WL_bind_wayland_display EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_surfaceless_context EGL_NOK_swap_region EGL_NV_post_sub_buffer
Supported Opengl version: 3.0 Mesa 9.2.2 on GPU: Gallium 0.4 on AMD RV770. Vendor: X.Org
Geometry shaders are not supported. Required openGL 3.2

INFO: GL_ARB_separate_shader_objects is not supported
INFO: GL_ARB_gpu_shader5 is not supported
INFO: GL_ARB_shader_image_load_store is not supported
INFO: GL_ARB_clear_texture is not supported
INFO: GL_ARB_buffer_storage is not supported
INFO: GL_ARB_shader_subroutine is not supported
INFO: GL_ARB_explicit_uniform_location is not supported
INFO: GL_ARB_texture_storage is supported
INFO: GL_ARB_shading_language_420pack is supported
INFO: GL_ARB_multi_bind is not supported
INFO: GL_ARB_bindless_texture is not supported
INFO: GL_NV_depth_buffer_float is not supported

This has basically been the same since my OpenGL v2.1 tests I think - I believed those messages in the past but I dont anymore. Is there some sort of initialisation that pcsx2 is not doing?
Reply
#8
Your glxinfo mentions Mesa 10.1.2, but gsdx mentions Mesa 9.2.2.

"OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.1.2"
"Supported Opengl version: 3.0 Mesa 9.2.2 on GPU: Gallium 0.4 on AMD RV770. Vendor: X.Org"
Reply
#9
@agent00skid, good catch Smile

64bits/32bits mix? You can easily check mesa version with this command
Quote:dpkg -l | grep mesa
Reply
#10
(05-19-2014, 09:54 PM)agent00skid Wrote: Your glxinfo mentions Mesa 10.1.2, but gsdx mentions Mesa 9.2.2.

"OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.1.2"
"Supported Opengl version: 3.0 Mesa 9.2.2 on GPU: Gallium 0.4 on AMD RV770. Vendor: X.Org"

Thanks - I've updated the chroot, make clean'd and rebuilt - now there are further issues, probably chroot-related:

Code:
(process:9865): Gdk-WARNING **: locale not supported by C library

(process:9865): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.
Interface is initializing.  Entering Pcsx2App::OnInit!
Applying operating system default language...
SetLanguage: 'English' [] is not supported by the operating system
Command line parsing...
Command line parsed!
(UserMode) Found portable install ini @ /mnt/Storage_1/General/Emulators And ROMs/pcsx2/pcsx2-read-only/bin/portable.ini
libGL error: MESA-LOADER: could not create udev device for fd 14
unknown chip id 0x9440, can't guess.
libGL error: failed to create dri screen
libGL error: failed to load driver: radeon
Failed to create the opengl context. Check your drivers support openGL 3.3. Hint: opensource drivers don't
EGL: warning your driver doesn't suport advance openGL context attributes
EGL: Mesa Project : 1.4 (Gallium)
EGL: extensions supported: EGL_WL_bind_wayland_display EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_surfaceless_context EGL_NOK_swap_region EGL_NV_post_sub_buffer
Supported Opengl version: 3.0 Mesa 10.1.2 on GPU: Gallium 0.4 on AMD RV770. Vendor: X.Org
Geometry shaders are not supported. Required openGL 3.2

INFO: GL_ARB_separate_shader_objects is not supported
INFO: GL_ARB_gpu_shader5 is not supported
INFO: GL_ARB_shader_image_load_store is not supported
INFO: GL_ARB_clear_texture is not supported
INFO: GL_ARB_buffer_storage is not supported
INFO: GL_ARB_shader_subroutine is not supported
INFO: GL_ARB_explicit_uniform_location is not supported
INFO: GL_ARB_texture_storage is supported
INFO: GL_ARB_shading_language_420pack is supported
INFO: GL_ARB_multi_bind is not supported
INFO: GL_ARB_bindless_texture is not supported
INFO: GL_NV_depth_buffer_float is not supported

I guess at some point in the future I'll need to make a real project to unbreak pcsx2.

Responding to gregory:

Code:
# dpkg -l | grep mesa

ii  libegl1-mesa:i386                 10.1.2-1                        i386         free implementation of the EGL API -- runtime
ii  libegl1-mesa-dev                  10.1.2-1                        i386         free implementation of the EGL API -- development files
ii  libegl1-mesa-drivers:i386         10.1.2-1                        i386         free implementation of the EGL API -- hardware drivers
ii  libgl1-mesa-dev                   10.1.2-1                        i386         free implementation of the OpenGL API -- GLX development files
ii  libgl1-mesa-dri:i386              10.1.2-1                        i386         free implementation of the OpenGL API -- DRI modules
ii  libgl1-mesa-glx:i386              10.1.2-1                        i386         free implementation of the OpenGL API -- GLX runtime
ii  libglapi-mesa:i386                10.1.2-1                        i386         free implementation of the GL API -- shared library
ii  libglu1-mesa:i386                 9.0.0-2                         i386         Mesa OpenGL utility library (GLU)
ii  libglu1-mesa-dev                  9.0.0-2                         i386         Mesa OpenGL utility library -- development files
ii  libopenvg1-mesa:i386              10.1.2-1                        i386         free implementation of the OpenVG API -- runtime
ii  libwayland-egl1-mesa:i386         10.1.2-1                        i386         implementation of the Wayland EGL platform -- runtime
ii  mesa-common-dev                   10.1.2-1                        i386         Developer documentation for Mesa

This is an uptodate Debian Unstable 32bit chroot running on uptodate Debian Testing 64bit.
Reply




Users browsing this thread: 1 Guest(s)