Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=xorgtesting.git;a=commitdiff;h=13f9d57b069a7950c8309d19aa406c4bf7da3da9

commit 13f9d57b069a7950c8309d19aa406c4bf7da3da9
Author: Michel Hermier <herm...@frugalware.org>
Date:   Thu Sep 1 11:51:19 2011 +0200

mesa-7.11-1-i686

* Bump version.
* Add use flag for wayland support (still disabled).
* Introduce libglw use flag, source will be splitted out on next
release.
* Split out the new libs until the new scheme is understood...

diff --git a/source/x11/mesa/1d24e6ec1d13c2b88b858997900aa8b69de92b13.patch 
b/source/x11/mesa/1d24e6ec1d13c2b88b858997900aa8b69de92b13.patch
deleted file mode 100644
index ade379a..0000000
--- a/source/x11/mesa/1d24e6ec1d13c2b88b858997900aa8b69de92b13.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 1d24e6ec1d13c2b88b858997900aa8b69de92b13 Mon Sep 17 00:00:00 2001
-From: Ben Skeggs <bske...@redhat.com>
-Date: Mon, 06 Jun 2011 00:17:59 +0000
-Subject: dri/nouveau: fix gnome-shell segfault
-
-Signed-off-by: Ben Skeggs <bske...@redhat.com>
----
-diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c 
b/src/mesa/drivers/dri/nouveau/nouveau_context.c
-index 71dde41..22b9957 100644
---- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
-+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
-@@ -261,7 +261,7 @@ nouveau_update_renderbuffers(__DRIcontext *dri_ctx, 
__DRIdrawable *draw)
-               assert(!ret);
-       }
-
--      _mesa_resize_framebuffer(NULL, fb, draw->w, draw->h);
-+      _mesa_resize_framebuffer(ctx, fb, draw->w, draw->h);
- }
-
- static void
---
-cgit v0.8.3-6-g21f6
diff --git a/source/x11/mesa/5c102dd94f435e97507213fbd128e50dd15f5f54.patch 
b/source/x11/mesa/5c102dd94f435e97507213fbd128e50dd15f5f54.patch
deleted file mode 100644
index 7f57e69..0000000
--- a/source/x11/mesa/5c102dd94f435e97507213fbd128e50dd15f5f54.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-commit 5c102dd94f435e97507213fbd128e50dd15f5f54
-Author: Ben Skeggs <bske...@redhat.com>
-Date:   Mon Dec 20 13:39:36 2010 +1000
-
-    nouveau: fix includes for latest libdrm
-
-    Signed-off-by: Ben Skeggs <bske...@redhat.com>
-
-diff --git a/src/gallium/drivers/nouveau/nouveau_winsys.h 
b/src/gallium/drivers/nouveau/nouveau_winsys.h
-index ab480ca..747b084 100644
---- a/src/gallium/drivers/nouveau/nouveau_winsys.h
-+++ b/src/gallium/drivers/nouveau/nouveau_winsys.h
-@@ -10,7 +10,7 @@
- #include "nouveau/nouveau_grobj.h"
- #include "nouveau/nouveau_notifier.h"
- #include "nouveau/nouveau_resource.h"
--#include "nouveau/nouveau_pushbuf.h"
-+#include "nouveau/nv04_pushbuf.h"
-
- #ifndef NV04_PFIFO_MAX_PACKET_LEN
- #define NV04_PFIFO_MAX_PACKET_LEN 2047
-diff --git a/src/gallium/drivers/nv50/nv50_surface.c 
b/src/gallium/drivers/nv50/nv50_surface.c
-index ce48022..a99df76 100644
---- a/src/gallium/drivers/nv50/nv50_surface.c
-+++ b/src/gallium/drivers/nv50/nv50_surface.c
-@@ -22,7 +22,7 @@
-
- #define __NOUVEAU_PUSH_H__
- #include <stdint.h>
--#include "nouveau/nouveau_pushbuf.h"
-+#include "nouveau/nv04_pushbuf.h"
- #include "nv50_context.h"
- #include "nv50_resource.h"
- #include "pipe/p_defines.h"
-diff --git a/src/gallium/drivers/nvfx/nv04_2d.c 
b/src/gallium/drivers/nvfx/nv04_2d.c
-index e0e65e7..e2fadd3 100644
---- a/src/gallium/drivers/nvfx/nv04_2d.c
-+++ b/src/gallium/drivers/nvfx/nv04_2d.c
-@@ -34,11 +34,11 @@
- #include <stdio.h>
- #include <stdint.h>
- #include <nouveau/nouveau_device.h>
--#include <nouveau/nouveau_pushbuf.h>
- #include <nouveau/nouveau_channel.h>
- #include <nouveau/nouveau_bo.h>
- #include <nouveau/nouveau_notifier.h>
- #include <nouveau/nouveau_grobj.h>
-+#include <nouveau/nv04_pushbuf.h>
- #include "nv04_2d.h"
-
- #include "nouveau/nv_object.xml.h"
-diff --git a/src/gallium/drivers/nvfx/nvfx_vbo.c 
b/src/gallium/drivers/nvfx/nvfx_vbo.c
-index 597664e..339b317 100644
---- a/src/gallium/drivers/nvfx/nvfx_vbo.c
-+++ b/src/gallium/drivers/nvfx/nvfx_vbo.c
-@@ -9,8 +9,7 @@
- #include "nvfx_resource.h"
-
- #include "nouveau/nouveau_channel.h"
--
--#include "nouveau/nouveau_pushbuf.h"
-+#include "nouveau/nv04_pushbuf.h"
-
- static inline unsigned
- util_guess_unique_indices_count(unsigned mode, unsigned indices)
-diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.h 
b/src/mesa/drivers/dri/nouveau/nouveau_driver.h
-index 8036b18..c5ac128 100644
---- a/src/mesa/drivers/dri/nouveau/nouveau_driver.h
-+++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.h
-@@ -38,7 +38,6 @@
- #include <assert.h>
-
- #include "nouveau_device.h"
--#include "nouveau_pushbuf.h"
- #include "nouveau_grobj.h"
- #include "nouveau_channel.h"
- #include "nouveau_bo.h"
-@@ -46,6 +45,7 @@
- #include "nouveau_screen.h"
- #include "nouveau_state.h"
- #include "nouveau_surface.h"
-+#include "nv04_pushbuf.h"
-
- #define DRIVER_DATE   "20091015"
- #define DRIVER_AUTHOR "Nouveau"
diff --git a/source/x11/mesa/FrugalBuild b/source/x11/mesa/FrugalBuild
index a093d0a..4dca3f9 100644
--- a/source/x11/mesa/FrugalBuild
+++ b/source/x11/mesa/FrugalBuild
@@ -5,41 +5,43 @@
USE_DEVEL=${USE_DEVEL:-"n"}
USE_EGL=${USE_EGL:-"y"}
USE_GALLIUM=${USE_GALLIUM:-"y"}
+USE_GLW=${USE_GLW:-"y"}
+USE_WAYLAND_EGL=${USE_WAYLAND_EGL:-"n"}

pkgname=mesa
origname=Mesa
_F_archive_name="MesaLib"
-pkgver=7.10.3
-pkgrel=4
+pkgver=7.11
+pkgrel=1
pkgdesc="Mesa is a 3D graphics library"
url="http://mesa3d.sourceforge.net/";
up2date="Flasttar ftp://ftp.freedesktop.org/pub/$pkgname/current/";

# libgl: provided by libgl, fglrx and nvidia packages
-depends=('libx11>=1.2.1' 'libxext>=1.0.5-3' \
-       'libice>=1.0.5' 'libxfixes>=4.0.3-4' 'expat' 'libgcc' 'talloc')
-makedepends=('libxi>=1.2.1' 'libxmu>=1.0.4-2' 'makedepend' 'xf86vidmodeproto' 
'llvm')
+depends=()
+makedepends=('makedepend')
# should be mesa-*=$pkgver but apps should not depends on mesa anymore first, 
unless specific to mesa
-rodepends=('libgl' 'libglu' 'libglw')
+rodepends=('libgl' 'libglu')
archs=('i686' 'x86_64' 'ppc' 'arm')
groups=('x11' 'xorg-core' 'xorg-libs')

+if Fuse GLW; then
+       rodepends=("${rodepends[@]}" 'libglw')
+fi
+
if Fuse DEVEL; then
unset source sha1sums
-       pkgver=$pkgver.1.g6e00627
+       pkgver=$pkgver.1.gf23c3eb
pkgrel=0
_F_scm_type="git"
-       _F_scm_url="git://anongit.freedesktop.org/mesa/mesa"
+        _F_scm_path="/home/user/git/freedesktop.org/mesa"
+       _F_scm_branch="master"
+#        _F_scm_branch="gallium-driver-nouveau"
+        _F_scm_url="$_F_scm_path/mesa"
Finclude scm
else
-       
source=("ftp://ftp.freedesktop.org/pub/mesa/$pkgver/MesaLib-$pkgver.tar.bz2"; \
-               "5c102dd94f435e97507213fbd128e50dd15f5f54.patch" \
-               "1d24e6ec1d13c2b88b858997900aa8b69de92b13.patch" \
-               "gnome-shell.diff")
-       sha1sums=('e1fe8bad90bb24cc4b25a42932c277a0e0d7a2ac' \
-          '08d16a0f0f1f655b443c6c7630d16f47c2d44837' \
-          '42dd2b7783d1f3f379086ff94cb6e8cabf92b8c2' \
-          '0da49e00bf7263ec6a34b74976bbb6960331ade0')
+       
source=("ftp://ftp.freedesktop.org/pub/mesa/$pkgver/MesaLib-$pkgver.tar.bz2";)
+       sha1sums=('942358e42dcfaac966c643fe39375549c8638b68')
fi

source=("${source[@]}" \
@@ -55,18 +57,48 @@ subdescs=('Mesa DRI OpenGL files.' 'Mesa OpenGL headers 
files.')
subprovides=('libgl-mesa' 'libgl-headers')
subreplaces=('' '')
subconflicts=('fglrx nvidia' 'nvidia')
-subdepends=('libdrm>=2.4.20 libxcb>=1.3 libxdamage>=1.1.1-3 libxi libxmu 
libxxf86vm>=1.0.2' 'dri2proto>=2.0 glproto>=1.4.9')
-subrodepends=("libdri libgl-headers-mesa>=$pkgver-$pkgrel libglx" '')
+subdepends=('expat libdrm libxdamage libxxf86vm' 'dri2proto glproto')
+subrodepends=("libgl-headers-mesa>=$pkgver-$pkgrel libglapi libglx 
mesa-dri-drivers>=$pkgver-$pkgrel" '') # Remove mesa-dri-drivers when situation 
is more clearer about gles
subgroups=('x11' 'x11')
subarchs=("${archs[*]}" "${archs[*]}")

+subpkgs=("${subpkgs[@]}" 'mesa-dri-drivers')
+subdescs=("${subdescs[@]}" 'Mesa OpenGL DRI drivers.')
+subprovides=("${subprovides[@]}" '')
+subreplaces=("${subreplaces[@]}" '')
+subconflicts=("${subconflicts[@]}" '')
+subdepends=("${subdepends[@]}" "libdri llvm")
+subrodepends=("${subrodepends[@]}" '')
+subgroups=("${subgroups[@]}" 'x11')
+subarchs=("${subarchs[@]}" "${archs[*]}")
+
+subpkgs=("${subpkgs[@]}" 'libgbm')
+subdescs=("${subdescs[@]}" 'Mesa gbm library.')
+subprovides=("${subprovides[@]}" '')
+subreplaces=("${subreplaces[@]}" '')
+subconflicts=("${subconflicts[@]}" '')
+subdepends=("${subdepends[@]}" 'glibc')
+subrodepends=("${subrodepends[@]}" '')
+subgroups=("${subgroups[@]}" 'x11')
+subarchs=("${subarchs[@]}" "${archs[*]}")
+
+subpkgs=("${subpkgs[@]}" 'libglapi')
+subdescs=("${subdescs[@]}" 'Mesa OpenGL API library.')
+subprovides=("${subprovides[@]}" '')
+subreplaces=("${subreplaces[@]}" '')
+subconflicts=("${subconflicts[@]}" '')
+subdepends=("${subdepends[@]}" 'glibc')
+subrodepends=("${subrodepends[@]}" '')
+subgroups=("${subgroups[@]}" 'x11')
+subarchs=("${subarchs[@]}" "${archs[*]}")
+
subpkgs=("${subpkgs[@]}" 'libgles')
subdescs=("${subdescs[@]}" 'Mesa OpenGL ES1/ES2 libraries.')
subprovides=("${subprovides[@]}" 'libgles-mesa')
subreplaces=("${subreplaces[@]}" '')
subconflicts=("${subconflicts[@]}" '')
subdepends=("${subdepends[@]}" '')
-subrodepends=("${subrodepends[@]}" 'khr-headers')
+subrodepends=("${subrodepends[@]}" 'libdrm libglapi khr-headers')
subgroups=("${subgroups[@]}" 'x11')
subarchs=("${subarchs[@]}" "${archs[*]}")

@@ -80,19 +112,9 @@ subrodepends=("${subrodepends[@]}" 'libgl')
subgroups=("${subgroups[@]}" 'x11')
subarchs=("${subarchs[@]}" "${archs[*]}")

-subpkgs=("${subpkgs[@]}" 'libglw')
-subdescs=("${subdescs[@]}" 'Mesa Xt/Motif OpenGL drawing area widget library.')
-subprovides=("${subprovides[@]}" 'libglw-mesa')
-subreplaces=("${subreplaces[@]}" '')
-subconflicts=("${subconflicts[@]}" '')
-subdepends=("${subdepends[@]}" '')
-subrodepends=("${subrodepends[@]}" 'libgl')
-subgroups=("${subgroups[@]}" 'x11')
-subarchs=("${subarchs[@]}" "${archs[*]}")
-
subpkgs=("${subpkgs[@]}" 'khr-headers')
subdescs=("${subdescs[@]}" 'Khronos generic header.')
-subprovides=("${subprovides[@]}" 'libglw-mesa')
+subprovides=("${subprovides[@]}" '')
subreplaces=("${subreplaces[@]}" '')
subconflicts=("${subconflicts[@]}" '')
subdepends=("${subdepends[@]}" '')
@@ -106,8 +128,8 @@ if Fuse EGL; then
subprovides=("${subprovides[@]}" 'libegl-mesa')
subreplaces=("${subreplaces[@]}" '')
subconflicts=("${subconflicts[@]}" '')
-       subdepends=("${subdepends[@]}" '')
-       subrodepends=("${subrodepends[@]}" 'libgl khr-headers')
+       subdepends=("${subdepends[@]}" 'dri2proto glproto libdrm')
+       subrodepends=("${subrodepends[@]}" 'khr-headers')
subgroups=("${subgroups[@]}" 'x11')
subarchs=("${subarchs[@]}" "${archs[*]}")

@@ -120,6 +142,30 @@ if Fuse EGL; then
subrodepends=("${subrodepends[@]}" 'libgl khr-headers')
subgroups=("${subgroups[@]}" 'x11')
subarchs=("${subarchs[@]}" "${archs[*]}")
+
+       if Fuse WAYLAND_EGL; then
+               subpkgs=("${subpkgs[@]}" 'libwayland-egl')
+               subdescs=("${subdescs[@]}" '')
+               subprovides=("${subprovides[@]}" '')
+               subreplaces=("${subreplaces[@]}" '')
+               subconflicts=("${subconflicts[@]}" '')
+               subdepends=("${subdepends[@]}" 'wayland')
+               subrodepends=("${subrodepends[@]}" 'libgl')
+               subgroups=("${subgroups[@]}" 'x11')
+               subarchs=("${subarchs[@]}" "${archs[*]}")
+       fi
+fi
+
+if Fuse GLW; then
+       subpkgs=("${subpkgs[@]}" 'libglw')
+       subdescs=("${subdescs[@]}" 'Mesa Xt/Motif OpenGL drawing area widget 
library.')
+       subprovides=("${subprovides[@]}" 'libglw-mesa')
+       subreplaces=("${subreplaces[@]}" '')
+       subconflicts=("${subconflicts[@]}" '')
+       subdepends=("${subdepends[@]}" 'libxt')
+       subrodepends=("${subrodepends[@]}" 'libgl')
+       subgroups=("${subgroups[@]}" 'x11')
+       subarchs=("${subarchs[@]}" "${archs[*]}")
fi

# NOTE: If you bump version (major or minor) you need to review the symlinking 
at the end of this
@@ -128,6 +174,8 @@ fi
#       Check: src/mesa/main/version.h for mesa proper version need for symlink.

build() {
+#      unset MAKEFLAGS
+
if Fuse DEVEL; then
Funpack_scm
./autogen.sh
@@ -143,6 +191,9 @@ build() {

if Fuse EGL; then
EGL_PLATFORMS="drm,x11"
+               if Fuse WAYLAND_EGL; then
+                       EGL_PLATFORMS="$EGL_PLATFORMS,wayland"
+               fi
Fconfopts="$Fconfopts --with-egl-platforms=$EGL_PLATFORMS"
Fconfopts="$Fconfopts --enable-egl"
Fconfopts="$Fconfopts --enable-openvg"
@@ -152,21 +203,30 @@ build() {
fi

if Fuse GALLIUM; then
-               Fconfopts="$Fconfopts --disable-gallium-llvm"
-               Fconfopts="$Fconfopts --enable-gallium-nouveau"
-               Fconfopts="$Fconfopts --enable-gallium-radeon 
--enable-gallium-r600"
-               Fconfopts="$Fconfopts --with-state-trackers=dri,egl,glx,vega"
+               GALLIUM_DRIVERS="swrast"
+               GALLIUM_DRIVERS="$GALLIUM_DRIVERS,i915,i965"
+               GALLIUM_DRIVERS="$GALLIUM_DRIVERS,nouveau"
+               GALLIUM_DRIVERS="$GALLIUM_DRIVERS,r300,r600"
+               GALLIUM_DRIVERS="$GALLIUM_DRIVERS,svga"
+               Fconfopts="$Fconfopts --with-gallium-drivers=$GALLIUM_DRIVERS"
+               Fconfopts="$Fconfopts --enable-gallium-gbm"
+               Fconfopts="$Fconfopts --enable-gallium-llvm"
+               if Fuse EGL; then
+                       Fconfopts="$Fconfopts --enable-gallium-egl"
+               fi
else
Fconfopts="$Fconfopts --disable-gallium"
fi

Fconf   --with-driver=dri \
--with-dri-driverdir=/usr/lib/dri \
-               --with-dri-drivers=yes \
-               --disable-glut \
+               --with-dri-drivers=$DRI_DRIVERS \
+               --enable-gbm \
--enable-gles1 \
--enable-gles2 \
--enable-glx-tls \
+               --enable-shared-dricore \
+               --enable-shared-glapi \
--enable-xcb

make || Fdie
@@ -185,11 +245,7 @@ build() {
# Install our .la files with r-xr-xr-x rights
Finstall 0555 lib{GL,GLU}.la /usr/lib/

-       Fln libGLU.so.1.3.071003 /usr/lib/libGLU.so.1.3
-       Fln libGLw.so.1.0.0 /usr/lib/libGLw.so.1.0
-
-       # Remove glut.h because it conflicts with freeglut :P
-       Frm /usr/include/GL/glut.h
+       Fln libGLU.so.1.3.071100 /usr/lib/libGLU.so.1.3

# Remove to avoid a conflict with libosmesa
Frm libosmesa usr/include/GL/osmesa.h
@@ -199,14 +255,22 @@ build() {
Frm /usr/include/GL/glxew.h
Frm /usr/include/GL/glew.h

+       Fsplit libglapi usr/lib/libglapi.*
+
+       Fsplit libgbm usr/include/gbm.h
+       Fsplit libgbm usr/lib/gbm/
+       Fsplit libgbm usr/lib/libgbm.*
+       Fsplit libgbm usr/lib/pkgconfig/gbm.pc
+
Fsplit libgl usr/lib/libGL.*
-       Fsplit libgl usr/lib/dri/
Fsplit libgl usr/lib/pkgconfig/gl.pc
-       Fsplit libgl usr/lib/pkgconfig/dri.pc

Fsplit libgl-headers-mesa usr/include/GL/{gl.h,glext.h,glx.h,glxext.h}
Fsplit libgl-headers-mesa usr/include/GL/internal

+       Fsplit mesa-dri-drivers usr/lib/dri/
+       Fsplit mesa-dri-drivers usr/lib/pkgconfig/dri.pc
+
Fsplit libgles usr/include/GLES*/
Fsplit libgles usr/lib/libGLES*
Fsplit libgles usr/lib/pkgconfig/gles*.pc
@@ -215,10 +279,6 @@ build() {
Fsplit libglu usr/lib/libGLU.*
Fsplit libglu usr/lib/pkgconfig/glu.pc

-       Fsplit libglw usr/include/GL/GLw*
-       Fsplit libglw usr/lib/libGLw.*
-       Fsplit libglw usr/lib/pkgconfig/glw.pc
-
Fsplit khr-headers usr/include/KHR/

#       Fsplit xf86-video-gles usr/include/xorg/
@@ -233,6 +293,17 @@ build() {
Fsplit libvg usr/include/VG/
Fsplit libvg usr/lib/libOpenVG.*
Fsplit libvg usr/lib/pkgconfig/vg.pc
+
+               if Fuse WAYLAND_EGL; then
+                       Fsplit libwayland-egl usr/lib/libwayland-egl.*
+                       Fsplit libwayland-egl usr/lib/pkgconfig/wayland-egl.pc
+               fi
+       fi
+
+       if Fuse GLW; then
+               Fsplit libglw usr/include/GL/GLw*
+               Fsplit libglw usr/lib/libGLw.*
+               Fsplit libglw usr/lib/pkgconfig/glw.pc
fi

Frm var
diff --git a/source/x11/mesa/gnome-shell.diff b/source/x11/mesa/gnome-shell.diff
deleted file mode 100644
index 1d1119d..0000000
--- a/source/x11/mesa/gnome-shell.diff
+++ /dev/null
@@ -1,536 +0,0 @@
-From 3f625689acd570e4f14cc2ebaa43a425d13954ff Mon Sep 17 00:00:00 2001
-From: Christoph Bumiller <e0425...@student.tuwien.ac.at>
-Date: Thu, 31 Mar 2011 13:49:33 +0000
-Subject: nv50: copy regalloc fixes from nvc0
-
-Should fix gnome-shell's fade shader.
-
-Unification of the shader backend which is supposed to remove the
-code duplication is still WIP.
----
-diff --git a/src/gallium/drivers/nv50/nv50_pc.h 
b/src/gallium/drivers/nv50/nv50_pc.h
-index e6f3815..a9a3248 100644
---- a/src/gallium/drivers/nv50/nv50_pc.h
-+++ b/src/gallium/drivers/nv50/nv50_pc.h
-@@ -228,6 +228,8 @@ struct nv_ref {
-    ubyte flags; /* not used yet */
- };
-
-+#define NV_REF_FLAG_REGALLOC_PRIV (1 << 0)
-+
- struct nv_basic_block;
-
- struct nv_instruction {
-@@ -263,6 +265,15 @@ struct nv_instruction {
-    ubyte quadop;
- };
-
-+static INLINE int
-+nvi_vector_size(struct nv_instruction *nvi)
-+{
-+   int i;
-+   assert(nvi);
-+   for (i = 0; i < 4 && nvi->def[i]; ++i);
-+   return i;
-+}
-+
- #define CFG_EDGE_FORWARD     0
- #define CFG_EDGE_BACK        1
- #define CFG_EDGE_LOOP_ENTER  2
-diff --git a/src/gallium/drivers/nv50/nv50_pc_regalloc.c 
b/src/gallium/drivers/nv50/nv50_pc_regalloc.c
-index 39ae366..657df2c 100644
---- a/src/gallium/drivers/nv50/nv50_pc_regalloc.c
-+++ b/src/gallium/drivers/nv50/nv50_pc_regalloc.c
-@@ -32,14 +32,39 @@
- #include "util/u_simple_list.h"
-
- #define NUM_REGISTER_FILES 4
-+#define MAX_REGISTER_COUNT 256
-
- struct register_set {
-    struct nv_pc *pc;
-
-    uint32_t last[NUM_REGISTER_FILES];
--   uint32_t bits[NUM_REGISTER_FILES][8];
-+   uint32_t bits[NUM_REGISTER_FILES][(MAX_REGISTER_COUNT + 31) / 32];
- };
-
-+/* using OR because a set bit means occupied/unavailable, aliasing is allowed 
*/
-+static void
-+intersect_register_sets(struct register_set *dst,
-+                        struct register_set *src1, struct register_set *src2)
-+{
-+   int i, j;
-+
-+   for (i = 0; i < NUM_REGISTER_FILES; ++i) {
-+      for (j = 0; j < (MAX_REGISTER_COUNT + 31) / 32; ++j)
-+         dst->bits[i][j] = src1->bits[i][j] | src2->bits[i][j];
-+   }
-+}
-+
-+static void
-+mask_register_set(struct register_set *set, uint32_t mask, uint32_t umask)
-+{
-+   int i, j;
-+
-+   for (i = 0; i < NUM_REGISTER_FILES; ++i) {
-+      for (j = 0; j < (MAX_REGISTER_COUNT + 31) / 32; ++j)
-+         set->bits[i][j] = (set->bits[i][j] | mask) & umask;
-+   }
-+}
-+
- struct nv_pc_pass {
-    struct nv_pc *pc;
-
-@@ -61,11 +86,15 @@ ranges_coalesce(struct nv_range *range)
-    }
- }
-
-+/* @return: TRUE if @new_range can be freed (i.e. was not reused) */
- static boolean
- add_range_ex(struct nv_value *val, int bgn, int end, struct nv_range 
*new_range)
- {
-    struct nv_range *range, **nextp = &val->livei;
-
-+   if (bgn == end) /* [a, a) is invalid / empty */
-+      return TRUE;
-+
-    for (range = val->livei; range; range = range->next) {
-       if (end < range->bgn)
-          break; /* insert before */
-@@ -251,6 +280,8 @@ reg_occupy(struct register_set *set, struct nv_value *val)
-    id <<= s;
-    m = (1 << (1 << s)) - 1;
-
-+   assert(s >= 0); /* XXX: remove me */
-+
-    set->bits[f][id / 32] |= m << (id % 32);
-
-    if (set->pc->max_reg[f] < id)
-@@ -286,15 +317,12 @@ join_allowed(struct nv_pc_pass *ctx, struct nv_value *a, 
struct nv_value *b)
-    if (a->join->reg.id == b->join->reg.id)
-       return TRUE;
-
--#if 1
-    /* either a or b or both have been assigned */
-
-    if (a->join->reg.id >= 0 && b->join->reg.id >= 0)
-       return FALSE;
-    else
-    if (b->join->reg.id >= 0) {
--      if (a->join->reg.id >= 0)
--         return FALSE;
-       val = a;
-       a = b;
-       b = val;
-@@ -309,8 +337,6 @@ join_allowed(struct nv_pc_pass *ctx, struct nv_value *a, 
struct nv_value *b)
-          return FALSE;
-    }
-    return TRUE;
--#endif
--   return FALSE;
- }
-
- static INLINE void
-@@ -336,14 +362,14 @@ do_join_values(struct nv_pc_pass *ctx, struct nv_value 
*a, struct nv_value *b)
-    assert(b->join == a->join);
- }
-
--static INLINE void
-+static INLINE boolean
- try_join_values(struct nv_pc_pass *ctx, struct nv_value *a, struct nv_value 
*b)
- {
-    if (!join_allowed(ctx, a, b)) {
- #ifdef NV50_RA_DEBUG_JOIN
-       debug_printf("cannot join %i to %i: not allowed\n", b->n, a->n);
- #endif
--      return;
-+      return FALSE;
-    }
-    if (livei_have_overlap(a->join, b->join)) {
- #ifdef NV50_RA_DEBUG_JOIN
-@@ -351,10 +377,27 @@ try_join_values(struct nv_pc_pass *ctx, struct nv_value 
*a, struct nv_value *b)
-       livei_print(a);
-       livei_print(b);
- #endif
--      return;
-+      return FALSE;
-    }
-
-    do_join_values(ctx, a, b);
-+
-+   return TRUE;
-+}
-+
-+static void
-+join_values_nofail(struct nv_pc_pass *ctx,
-+                   struct nv_value *a, struct nv_value *b, boolean type_only)
-+{
-+   if (type_only) {
-+      assert(join_allowed(ctx, a, b));
-+      do_join_values(ctx, a, b);
-+   } else {
-+      boolean ok = try_join_values(ctx, a, b);
-+      if (!ok) {
-+         NOUVEAU_ERR("failed to coalesce values\n");
-+      }
-+   }
- }
-
- static INLINE boolean
-@@ -369,20 +412,32 @@ need_new_else_block(struct nv_basic_block *b, struct 
nv_basic_block *p)
-    return (b->num_in > 1) && (n == 2);
- }
-
-+/* Look for the @phi's operand whose definition reaches @b. */
- static int
- phi_opnd_for_bb(struct nv_instruction *phi, struct nv_basic_block *b,
-                 struct nv_basic_block *tb)
- {
-+   struct nv_ref *srci, *srcj;
-    int i, j;
-
--   for (j = -1, i = 0; i < 4 && phi->src[i]; ++i) {
--      if (!nvbb_reachable_by(b, phi->src[i]->value->insn->bb, tb))
-+   for (j = -1, i = 0; i < 6 && phi->src[i]; ++i) {
-+      srci = phi->src[i];
-+      /* if already replaced, check with original source first */
-+      if (srci->flags & NV_REF_FLAG_REGALLOC_PRIV)
-+         srci = srci->value->insn->src[0];
-+      if (!nvbb_reachable_by(b, srci->value->insn->bb, NULL))
-          continue;
-       /* NOTE: back-edges are ignored by the reachable-by check */
--      if (j < 0 || !nvbb_reachable_by(phi->src[j]->value->insn->bb,
--                                      phi->src[i]->value->insn->bb, tb))
-+      if (j < 0 || !nvbb_reachable_by(srcj->value->insn->bb,
-+                                      srci->value->insn->bb, NULL)) {
-          j = i;
-+         srcj = srci;
-+      }
-    }
-+   if (j >= 0 && nvbb_reachable_by(b, phi->def[0]->insn->bb, NULL))
-+      if (!nvbb_reachable_by(srcj->value->insn->bb,
-+                             phi->def[0]->insn->bb, NULL))
-+         j = -1;
-    return j;
- }
-
-@@ -429,16 +484,21 @@ pass_generate_phi_movs(struct nv_pc_pass *ctx, struct 
nv_basic_block *b)
-       ctx->pc->current_block = pn;
-
-       for (i = b->phi; i && i->opcode == NV_OP_PHI; i = i->next) {
--         if ((j = phi_opnd_for_bb(i, p, b)) < 0)
--            continue;
--         val = i->src[j]->value;
--
--         if (i->src[j]->flags) {
--            val = val->insn->src[0]->value;
--            while (j < 4 && i->src[j])
--               ++j;
--            assert(j < 4);
-+         j = phi_opnd_for_bb(i, p, b);
-+
-+         if (j < 0) {
-+            val = i->def[0];
-+         } else {
-+            val = i->src[j]->value;
-+            if (i->src[j]->flags & NV_REF_FLAG_REGALLOC_PRIV) {
-+               j = -1;
-+               /* use original value, we already encountered & replaced it */
-+               val = val->insn->src[0]->value;
-+            }
-          }
-+         if (j < 0) /* need an additional source ? */
-+            for (j = 0; j < 5 && i->src[j] && i->src[j]->value != val; ++j);
-+         assert(j < 5);
-
-          ni = new_instruction(ctx->pc, NV_OP_MOV);
-
-@@ -452,7 +512,7 @@ pass_generate_phi_movs(struct nv_pc_pass *ctx, struct 
nv_basic_block *b)
-
-          nv_reference(ctx->pc, &i->src[j], ni->def[0]);
-
--         i->src[j]->flags = 1;
-+         i->src[j]->flags |= NV_REF_FLAG_REGALLOC_PRIV;
-       }
-
-       if (pn != p && pn->exit) {
-@@ -470,45 +530,50 @@ pass_generate_phi_movs(struct nv_pc_pass *ctx, struct 
nv_basic_block *b)
-    return 0;
- }
-
-+#define JOIN_MASK_PHI    (1 << 0)
-+#define JOIN_MASK_SELECT (1 << 1)
-+#define JOIN_MASK_MOV    (1 << 2)
-+#define JOIN_MASK_TEX    (1 << 3)
-+
- static int
--pass_join_values(struct nv_pc_pass *ctx, int iter)
-+pass_join_values(struct nv_pc_pass *ctx, unsigned mask)
- {
-    int c, n;
-
-    for (n = 0; n < ctx->num_insns; ++n) {
--      struct nv_instruction *i = ctx->insns[n];
-+      struct nv_instruction *nvi, *i = ctx->insns[n];
-
-       switch (i->opcode) {
-       case NV_OP_PHI:
--         if (iter != 2)
-+         if (!(mask & JOIN_MASK_PHI))
-             break;
--         for (c = 0; c < 4 && i->src[c]; ++c)
--            try_join_values(ctx, i->def[0], i->src[c]->value);
-+         for (c = 0; c < 5 && i->src[c]; ++c)
-+            join_values_nofail(ctx, i->def[0], i->src[c]->value, FALSE);
-          break;
-       case NV_OP_MOV:
--         if ((iter == 2) && i->src[0]->value->insn &&
--             !nv_is_vector_op(i->src[0]->value->join->insn->opcode))
-+         if (!(mask & JOIN_MASK_MOV))
-+            break;
-+         nvi = i->src[0]->value->join->insn;
-+         if (nvi && !nv_is_vector_op(nvi->opcode))
-             try_join_values(ctx, i->def[0], i->src[0]->value);
-          break;
-       case NV_OP_SELECT:
--         if (iter != 1)
-+         if (!(mask & JOIN_MASK_SELECT))
-             break;
--         for (c = 0; c < 4 && i->src[c]; ++c) {
--            assert(join_allowed(ctx, i->def[0], i->src[c]->value));
--            do_join_values(ctx, i->def[0], i->src[c]->value);
--         }
-+         for (c = 0; c < 5 && i->src[c]; ++c)
-+            join_values_nofail(ctx, i->def[0], i->src[c]->value, TRUE);
-          break;
-       case NV_OP_TEX:
-       case NV_OP_TXB:
-       case NV_OP_TXL:
-       case NV_OP_TXQ:
--         if (iter)
-+         if (!(mask & JOIN_MASK_TEX))
-             break;
--         for (c = 0; c < 4; ++c) {
--            if (!i->src[c])
--               break;
--            do_join_values(ctx, i->def[c], i->src[c]->value);
--         }
-+         /* This should work without conflicts because we always generate
-+          * extra MOVs for the sources of a TEX.
-+          */
-+         for (c = 0; c < 4 && i->src[c]; ++c)
-+            join_values_nofail(ctx, i->def[c], i->src[c]->value, TRUE);
-          break;
-       default:
-          break;
-@@ -643,15 +708,15 @@ static void collect_live_values(struct nv_basic_block 
*b, const int n)
- {
-    int i;
-
--   if (b->out[0]) {
--      if (b->out[1]) { /* what to do about back-edges ? */
-+   if (b->out[0] && b->out_kind[0] != CFG_EDGE_FAKE) {
-+      if (b->out[1] && b->out_kind[1] != CFG_EDGE_FAKE) {
-          for (i = 0; i < n; ++i)
-             b->live_set[i] = b->out[0]->live_set[i] | b->out[1]->live_set[i];
-       } else {
-          memcpy(b->live_set, b->out[0]->live_set, n * sizeof(uint32_t));
-       }
-    } else
--   if (b->out[1]) {
-+   if (b->out[1] && b->out_kind[1] != CFG_EDGE_FAKE) {
-       memcpy(b->live_set, b->out[1]->live_set, n * sizeof(uint32_t));
-    } else {
-       memset(b->live_set, 0, n * sizeof(uint32_t));
-@@ -770,8 +835,8 @@ insert_ordered_tail(struct nv_value *list, struct nv_value 
*nval)
-    struct nv_value *elem;
-
-    for (elem = list->prev;
--      elem != list && elem->livei->bgn > nval->livei->bgn;
--      elem = elem->prev);
-+        elem != list && elem->livei->bgn > nval->livei->bgn;
-+        elem = elem->prev);
-    /* now elem begins before or at the same time as val */
-
-    nval->prev = elem;
-@@ -780,44 +845,49 @@ insert_ordered_tail(struct nv_value *list, struct 
nv_value *nval)
-    elem->next = nval;
- }
-
--static int
--pass_linear_scan(struct nv_pc_pass *ctx, int iter)
-+static void
-+collect_register_values(struct nv_pc_pass *ctx, struct nv_value *head,
-+                        boolean assigned_only)
- {
--   struct nv_instruction *i;
--   struct register_set f, free;
-+   struct nv_value *val;
-    int k, n;
--   struct nv_value *cur, *val, *tmp[2];
--   struct nv_value active, inactive, handled, unhandled;
-
--   make_empty_list(&active);
--   make_empty_list(&inactive);
--   make_empty_list(&handled);
--   make_empty_list(&unhandled);
--
--   nv50_ctor_register_set(ctx->pc, &free);
-+   make_empty_list(head);
-
--   /* joined values should have range = NULL and thus not be added;
--    * also, fixed memory values won't be added because they're not
--    * def'd, just used
--    */
-    for (n = 0; n < ctx->num_insns; ++n) {
--      i = ctx->insns[n];
-+      struct nv_instruction *i = ctx->insns[n];
-
-+      /* for joined values, only the representative will have livei != NULL */
-       for (k = 0; k < 4; ++k) {
-          if (i->def[k] && i->def[k]->livei)
--            insert_ordered_tail(&unhandled, i->def[k]);
--         else
--         if (0 && i->def[k])
--            debug_printf("skipping def'd value %i: no livei\n", i->def[k]->n);
-+            if (!assigned_only || i->def[k]->reg.id >= 0)
-+               insert_ordered_tail(head, i->def[k]);
-       }
-       if (i->flags_def && i->flags_def->livei)
--         insert_ordered_tail(&unhandled, i->flags_def);
-+         if (!assigned_only || i->flags_def->reg.id >= 0)
-+            insert_ordered_tail(head, i->flags_def);
-    }
-
--   for (val = unhandled.next; val != unhandled.prev; val = val->next) {
-+   for (val = head->next; val != head->prev; val = val->next) {
-       assert(val->join == val);
-       assert(val->livei->bgn <= val->next->livei->bgn);
-    }
-+}
-+
-+static int
-+pass_linear_scan(struct nv_pc_pass *ctx, int iter)
-+{
-+   struct register_set f, free;
-+   struct nv_value *cur, *val, *tmp[2];
-+   struct nv_value active, inactive, handled, unhandled;
-+
-+   make_empty_list(&active);
-+   make_empty_list(&inactive);
-+   make_empty_list(&handled);
-+
-+   nv50_ctor_register_set(ctx->pc, &free);
-+
-+   collect_register_values(ctx, &unhandled, FALSE);
-
-    foreach_s(cur, tmp[0], &unhandled) {
-       remove_from_list(cur);
-@@ -854,13 +924,7 @@ pass_linear_scan(struct nv_pc_pass *ctx, int iter)
-             reg_occupy(&f, val);
-
-       if (cur->reg.id < 0) {
--         boolean mem = FALSE;
--
--         if (nv_is_vector_op(cur->insn->opcode))
--            mem = !reg_assign(&f, &cur->insn->def[0], 4);
--         else
--         if (iter)
--            mem = !reg_assign(&f, &cur, 1);
-+         boolean mem = !reg_assign(&f, &cur, 1);
-
-          if (mem) {
-             NOUVEAU_ERR("out of registers\n");
-@@ -874,6 +938,67 @@ pass_linear_scan(struct nv_pc_pass *ctx, int iter)
-    return 0;
- }
-
-+/* Allocate values defined by instructions such as TEX, which have to be
-+ * assigned to consecutive registers.
-+ * Linear scan doesn't really work here since the values can have different
-+ * live intervals.
-+ */
-+static int
-+pass_allocate_constrained_values(struct nv_pc_pass *ctx)
-+{
-+   struct nv_value regvals, *val;
-+   struct nv_instruction *i;
-+   struct nv_value *defs[4];
-+   struct register_set regs[4];
-+   int n, vsize, c;
-+   uint32_t mask;
-+   boolean mem;
-+
-+   collect_register_values(ctx, &regvals, TRUE);
-+
-+   for (n = 0; n < ctx->num_insns; ++n) {
-+      i = ctx->insns[n];
-+      vsize = nvi_vector_size(i);
-+      if (!(vsize > 1))
-+         continue;
-+      assert(vsize <= 4);
-+      for (c = 0; c < vsize; ++c)
-+         defs[c] = i->def[c]->join;
-+
-+      if (defs[0]->reg.id >= 0) {
-+         for (c = 1; c < vsize; ++c)
-+            assert(defs[c]->reg.id >= 0);
-+         continue;
-+      }
-+
-+      for (c = 0; c < vsize; ++c) {
-+         nv50_ctor_register_set(ctx->pc, &regs[c]);
-+
-+         foreach(val, &regvals) {
-+            if (val->reg.id >= 0 && livei_have_overlap(val, defs[c]))
-+               reg_occupy(&regs[c], val);
-+         }
-+         mask = 0x11111111;
-+         if (vsize == 2) /* granularity is 2 and not 4 */
-+            mask |= 0x11111111 << 2;
-+         mask_register_set(&regs[c], 0, mask << c);
-+
-+         if (defs[c]->livei)
-+            insert_ordered_tail(&regvals, defs[c]);
-+      }
-+      for (c = 1; c < vsize; ++c)
-+         intersect_register_sets(&regs[0], &regs[0], &regs[c]);
-+
-+      mem = !reg_assign(&regs[0], &defs[0], vsize);
-+
-+      if (mem) {
-+         NOUVEAU_ERR("out of registers\n");
-+         abort();
-+      }
-+   }
-+   return 0;
-+}
-+
- static int
- nv_pc_pass1(struct nv_pc *pc, struct nv_basic_block *root)
- {
-@@ -923,16 +1048,16 @@ nv_pc_pass1(struct nv_pc *pc, struct nv_basic_block 
*root)
-       livei_print(&pc->values[i]);
- #endif
-
--   ret = pass_join_values(ctx, 0);
-+   ret = pass_join_values(ctx, JOIN_MASK_PHI);
-    if (ret)
-       goto out;
--   ret = pass_linear_scan(ctx, 0);
-+   ret = pass_join_values(ctx, JOIN_MASK_SELECT | JOIN_MASK_TEX);
-    if (ret)
-       goto out;
--   ret = pass_join_values(ctx, 1);
-+   ret = pass_join_values(ctx, JOIN_MASK_MOV);
-    if (ret)
-       goto out;
--   ret = pass_join_values(ctx, 2);
-+   ret = pass_allocate_constrained_values(ctx);
-    if (ret)
-       goto out;
-    ret = pass_linear_scan(ctx, 1);
---
-cgit v0.8.3-6-g21f6
-
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to