summaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/conf/include/agl_raspberrypi2.inc
blob: a474652e1f0d61dc11e9ff5d903f628cb19437ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Maximum memory allowed to be assigned
GPU_MEM = "255"

ENABLE_CMA = "1"
CMA_LWM = "16"
CMA_HWM = "32"

CORE_IMAGE_EXTRA_INSTALL += "wayland weston"

MULTI_PROVIDER_WHITELIST += "virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2"

KERNEL_IMAGETYPE = "uImage"
KERNEL_DEVICETREE_append = " overlays/vc4-kms-v3d-overlay.dtb"
PREFERRED_VERSION_mesa = "12.%"

PREFERRED_PROVIDER_virtual/egl = "mesa"
PREFERRED_PROVIDER_virtual/libgles2 = "mesa"
PREFERRED_PROVIDER_virtual/libgl = "mesa"
PREFERRED_PROVIDER_virtual/mesa = "mesa"
PREFERRED_PROVIDER_jpeg = "jpeg"

MACHINE_FEATURES += "vc4graphics"

# For libomxil
#LICENSE_FLAGS_WHITELIST = "commercial"

IMAGE_INSTALL_append = " kernel-modules linux-firmware "

# Psplash causes crash on first boot on RPi
IMAGE_FEATURES_remove = "splash"

# Build updatable image. Only takes effect when sota.bbclass is inherited
DISTRO_FEATURES_append = " sota"

# Create WIC images to write to SD cards.
WKS_FILE = "sdimage-raspberrypi.wks"
AGL_EXTRA_IMAGE_FSTYPES = "wic.xz wic.bmap wic.xz.sha256sum"
IMAGE_BOOT_FILES = "bcm2835-bootfiles/* \
                 ${@make_dtb_boot_files(d)} \
                 ${@bb.utils.contains('KERNEL_IMAGETYPE', 'uImage', \
                    '${KERNEL_IMAGETYPE} u-boot.bin;${SDIMG_KERNELIMAGE} boot.scr', \
                    '${KERNEL_IMAGETYPE};${SDIMG_KERNELIMAGE}', d)} \
                 "
do_image_wic[depends] += " \
    bcm2835-bootfiles:do_deploy \
    ${@bb.utils.contains('KERNEL_IMAGETYPE', 'uImage', 'u-boot:do_deploy', '',d)} \
    "
'n447' href='#n447'>447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
From b695c3a3fa3f4cd48c13aa26542110de27075518 Mon Sep 17 00:00:00 2001
From: Drew Moseley <drew_moseley@mentor.com>
Date: Mon, 12 May 2014 15:22:32 -0400
Subject: [PATCH 1/9] mesa-demos: Add missing data files.

Add some data files that are present in the git repository:
   http://cgit.freedesktop.org/mesa/demos/tree/?id=mesa-demos-8.1.0
but not in the release tarball
   ftp://ftp.freedesktop.org/pub/mesa/demos/8.1.0/mesa-demos-8.1.0.tar.bz2

Upstream-Status: Backport
Signed-off-by: Drew Moseley <drew_moseley@mentor.com>
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 src/fpglsl/depth-read.glsl      |   4 +
 src/fpglsl/infinite-loop.glsl   |   7 +
 src/glsl/CH11-bumpmaptex.frag   |  47 +++++++
 src/glsl/blinking-teapot.frag   |  31 +++++
 src/glsl/blinking-teapot.vert   |  16 +++
 src/glsl/convolution.frag       |  21 +++
 src/glsl/simplex-noise.glsl     | 279 ++++++++++++++++++++++++++++++++++++++++
 src/glsl/skinning.vert          |  24 ++++
 src/perf/glslstateschange1.frag |  19 +++
 src/perf/glslstateschange1.vert |  14 ++
 src/perf/glslstateschange2.frag |  17 +++
 src/perf/glslstateschange2.vert |  14 ++
 src/vpglsl/infinite-loop.glsl   |   8 ++
 13 files changed, 501 insertions(+)
 create mode 100644 src/fpglsl/depth-read.glsl
 create mode 100644 src/fpglsl/infinite-loop.glsl
 create mode 100644 src/glsl/CH11-bumpmaptex.frag
 create mode 100644 src/glsl/blinking-teapot.frag
 create mode 100644 src/glsl/blinking-teapot.vert
 create mode 100644 src/glsl/convolution.frag
 create mode 100644 src/glsl/simplex-noise.glsl
 create mode 100644 src/glsl/skinning.vert
 create mode 100644 src/perf/glslstateschange1.frag
 create mode 100644 src/perf/glslstateschange1.vert
 create mode 100644 src/perf/glslstateschange2.frag
 create mode 100644 src/perf/glslstateschange2.vert
 create mode 100644 src/vpglsl/infinite-loop.glsl

diff --git a/src/fpglsl/depth-read.glsl b/src/fpglsl/depth-read.glsl
new file mode 100644
index 0000000..86d298e
--- /dev/null
+++ b/src/fpglsl/depth-read.glsl
@@ -0,0 +1,4 @@
+void main()
+{
+   gl_FragColor = gl_FragCoord.zzzz;
+}
diff --git a/src/fpglsl/infinite-loop.glsl b/src/fpglsl/infinite-loop.glsl
new file mode 100644
index 0000000..c6dc6ee
--- /dev/null
+++ b/src/fpglsl/infinite-loop.glsl
@@ -0,0 +1,7 @@
+void main() {
+   vec4 sum = vec4(0);
+   for (int i = 1; i != 2; i += 2) {
+      sum += vec4(0.1, 0.1, 0.1, 0.1);
+   }
+   gl_FragColor = sum;
+}
diff --git a/src/glsl/CH11-bumpmaptex.frag b/src/glsl/CH11-bumpmaptex.frag
new file mode 100644
index 0000000..b5dabb4
--- /dev/null
+++ b/src/glsl/CH11-bumpmaptex.frag
@@ -0,0 +1,47 @@
+//
+// Fragment shader for procedural bumps
+//
+// Authors: John Kessenich, Randi Rost
+//
+// Copyright (c) 2002-2006 3Dlabs Inc. Ltd. 
+//
+// See 3Dlabs-License.txt for license information
+//
+// Texture mapping/modulation added by Brian Paul
+//
+
+varying vec3 LightDir;
+varying vec3 EyeDir;
+
+uniform float BumpDensity;     // = 16.0
+uniform float BumpSize;        // = 0.15
+uniform float SpecularFactor;  // = 0.5
+
+uniform sampler2D Tex;
+
+void main()
+{
+    vec3 ambient = vec3(0.25);
+    vec3 litColor;
+    vec2 c = BumpDensity * gl_TexCoord[0].st;
+    vec2 p = fract(c) - vec2(0.5);
+
+    float d, f;
+    d = p.x * p.x + p.y * p.y;
+    f = inversesqrt(d + 1.0);
+
+    if (d >= BumpSize)
+        { p = vec2(0.0); f = 1.0; }
+
+    vec3 SurfaceColor = texture2D(Tex, gl_TexCoord[0].st).xyz;
+
+    vec3 normDelta = vec3(p.x, p.y, 1.0) * f;
+    litColor = SurfaceColor * (ambient + max(dot(normDelta, LightDir), 0.0));
+    vec3 reflectDir = reflect(LightDir, normDelta);
+    
+    float spec = max(dot(EyeDir, reflectDir), 0.0);
+    spec *= SpecularFactor;
+    litColor = min(litColor + spec, vec3(1.0));
+
+    gl_FragColor = vec4(litColor, 1.0);
+}
diff --git a/src/glsl/blinking-teapot.frag b/src/glsl/blinking-teapot.frag
new file mode 100644
index 0000000..0db060b
--- /dev/null
+++ b/src/glsl/blinking-teapot.frag
@@ -0,0 +1,31 @@
+#extension GL_ARB_uniform_buffer_object : enable
+
+layout(std140) uniform colors0
+{
+    float DiffuseCool;
+    float DiffuseWarm;
+    vec3  SurfaceColor;
+    vec3  WarmColor;
+    vec3  CoolColor;
+    vec4  some[8];
+};
+
+varying float NdotL;
+varying vec3  ReflectVec;
+varying vec3  ViewVec;
+
+void main (void)
+{
+
+    vec3 kcool    = min(CoolColor + DiffuseCool * SurfaceColor, 1.0);
+    vec3 kwarm    = min(WarmColor + DiffuseWarm * SurfaceColor, 1.0);
+    vec3 kfinal   = mix(kcool, kwarm, NdotL);
+
+    vec3 nreflect = normalize(ReflectVec);
+    vec3 nview    = normalize(ViewVec);
+
+    float spec    = max(dot(nreflect, nview), 0.0);
+    spec          = pow(spec, 32.0);
+
+    gl_FragColor = vec4 (min(kfinal + spec, 1.0), 1.0);
+}
diff --git a/src/glsl/blinking-teapot.vert b/src/glsl/blinking-teapot.vert
new file mode 100644
index 0000000..397d733
--- /dev/null
+++ b/src/glsl/blinking-teapot.vert
@@ -0,0 +1,16 @@
+vec3 LightPosition = vec3(0.0, 10.0, 4.0); 
+ 
+varying float NdotL;
+varying vec3  ReflectVec;
+varying vec3  ViewVec;
+ 
+void main(void)
+{
+    vec3 ecPos      = vec3 (gl_ModelViewMatrix * gl_Vertex);
+    vec3 tnorm      = normalize(gl_NormalMatrix * gl_Normal);
+    vec3 lightVec   = normalize(LightPosition - ecPos);
+    ReflectVec      = normalize(reflect(-lightVec, tnorm));
+    ViewVec         = normalize(-ecPos);
+    NdotL           = (dot(lightVec, tnorm) + 1.0) * 0.5;
+    gl_Position     = ftransform();
+}
diff --git a/src/glsl/convolution.frag b/src/glsl/convolution.frag
new file mode 100644
index 0000000..e49b8ac
--- /dev/null
+++ b/src/glsl/convolution.frag
@@ -0,0 +1,21 @@
+
+const int KernelSize = 9;
+
+//texture offsets
+uniform vec2 Offset[KernelSize];
+//convolution kernel
+uniform vec4 KernelValue[KernelSize];
+uniform sampler2D srcTex;
+uniform vec4 ScaleFactor;
+uniform vec4 BaseColor;
+
+void main(void)
+{
+    int i;
+    vec4 sum = vec4(0.0);
+    for (i = 0; i < KernelSize; ++i) {
+        vec4 tmp = texture2D(srcTex, gl_TexCoord[0].st + Offset[i]);
+        sum += tmp * KernelValue[i];
+    }
+    gl_FragColor = sum * ScaleFactor + BaseColor;
+}
diff --git a/src/glsl/simplex-noise.glsl b/src/glsl/simplex-noise.glsl
new file mode 100644
index 0000000..b6833cb
--- /dev/null
+++ b/src/glsl/simplex-noise.glsl
@@ -0,0 +1,279 @@
+//
+// Description : Array and textureless GLSL 2D/3D/4D simplex
+// noise functions.
+// Author : Ian McEwan, Ashima Arts.
+// Maintainer : ijm
+// Lastmod : 20110223
+// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
+// Distributed under the Artistic License 2.0; See LICENCE file.
+//
+
+#define NORMALIZE_GRADIENTS
+#undef USE_CIRCLE
+#define COLLAPSE_SORTNET
+
+float permute(float x0,vec3 p) {
+  float x1 = mod(x0 * p.y, p.x);
+  return floor( mod( (x1 + p.z) *x0, p.x ));
+  }
+vec2 permute(vec2 x0,vec3 p) {
+  vec2 x1 = mod(x0 * p.y, p.x);
+  return floor( mod( (x1 + p.z) *x0, p.x ));
+  }
+vec3 permute(vec3 x0,vec3 p) {
+  vec3 x1 = mod(x0 * p.y, p.x);
+  return floor( mod( (x1 + p.z) *x0, p.x ));
+  }
+vec4 permute(vec4 x0,vec3 p) {
+  vec4 x1 = mod(x0 * p.y, p.x);
+  return floor( mod( (x1 + p.z) *x0, p.x ));
+  }
+
+uniform vec4 pParam;
+// Example
+// const vec4 pParam = vec4( 17.* 17., 34., 1., 7.);
+
+float taylorInvSqrt(float r)
+  {
+  return ( 0.83666002653408 + 0.7*0.85373472095314 - 0.85373472095314 * r );
+  }
+
+float simplexNoise2(vec2 v)
+  {
+  const vec2 C = vec2(0.211324865405187134, // (3.0-sqrt(3.0))/6.;
+                      0.366025403784438597); // 0.5*(sqrt(3.0)-1.);
+  const vec3 D = vec3( 0., 0.5, 2.0) * 3.14159265358979312;
+// First corner
+  vec2 i = floor(v + dot(v, C.yy) );
+  vec2 x0 = v - i + dot(i, C.xx);
+
+// Other corners
+  vec2 i1 = (x0.x > x0.y) ? vec2(1.,0.) : vec2(0.,1.) ;
+
+   // x0 = x0 - 0. + 0. * C
+  vec2 x1 = x0 - i1 + 1. * C.xx ;
+  vec2 x2 = x0 - 1. + 2. * C.xx ;
+
+// Permutations
+  i = mod(i, pParam.x);
+  vec3 p = permute( permute(
+             i.y + vec3(0., i1.y, 1. ), pParam.xyz)
+           + i.x + vec3(0., i1.x, 1. ), pParam.xyz);
+
+#ifndef USE_CIRCLE
+// ( N points uniformly over a line, mapped onto a diamond.)
+  vec3 x = fract(p / pParam.w) ;
+  vec3 h = 0.5 - abs(x) ;
+
+  vec3 sx = vec3(lessThan(x,D.xxx)) *2. -1.;
+  vec3 sh = vec3(lessThan(h,D.xxx));
+
+  vec3 a0 = x + sx*sh;
+  vec2 p0 = vec2(a0.x,h.x);
+  vec2 p1 = vec2(a0.y,h.y);
+  vec2 p2 = vec2(a0.z,h.z);
+
+#ifdef NORMALISE_GRADIENTS
+  p0 *= taylorInvSqrt(dot(p0,p0));
+  p1 *= taylorInvSqrt(dot(p1,p1));
+  p2 *= taylorInvSqrt(dot(p2,p2));
+#endif
+
+  vec3 g = 2.0 * vec3( dot(p0, x0), dot(p1, x1), dot(p2, x2) );
+#else
+// N points around a unit circle.
+  vec3 phi = D.z * mod(p,pParam.w) /pParam.w ;
+  vec4 a0 = sin(phi.xxyy+D.xyxy);
+  vec2 a1 = sin(phi.zz +D.xy);
+  vec3 g = vec3( dot(a0.xy, x0), dot(a0.zw, x1), dot(a1.xy, x2) );
+#endif
+// mix
+  vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.);
+  m = m*m ;
+  return 1.66666* 70.*dot(m*m, g);
+  }
+
+float simplexNoise3(vec3 v)
+  {
+  const vec2 C = vec2(1./6. , 1./3. ) ;
+  const vec4 D = vec4(0., 0.5, 1.0, 2.0);
+
+// First corner
+  vec3 i = floor(v + dot(v, C.yyy) );
+  vec3 x0 = v - i + dot(i, C.xxx) ;
+  
+// Other corners
+#ifdef COLLAPSE_SORTNET
+  vec3 g = vec3( greaterThan( x0.xyz, x0.yzx) );
+  vec3 l = vec3( lessThanEqual( x0.xyz, x0.yzx) );
+
+  vec3 i1 = g.xyz * l.zxy;
+  vec3 i2 = max( g.xyz, l.zxy);
+#else
+// Keeping this clean - let the compiler optimize.
+  vec3 q1;
+  q1.x = max(x0.x, x0.y);
+  q1.y = min(x0.x, x0.y);
+  q1.z = x0.z;
+
+  vec3 q2;
+  q2.x = max(q1.x,q1.z);
+  q2.z = min(q1.x,q1.z);
+  q2.y = q1.y;
+
+  vec3 q3;
+  q3.y = max(q2.y, q2.z);
+  q3.z = min(q2.y, q2.z);
+  q3.x = q2.x;
+
+  vec3 i1 = vec3(equal(q3.xxx, x0));
+  vec3 i2 = i1 + vec3(equal(q3.yyy, x0));
+#endif
+
+   // x0 = x0 - 0. + 0. * C
+  vec3 x1 = x0 - i1 + 1. * C.xxx;
+  vec3 x2 = x0 - i2 + 2. * C.xxx;
+  vec3 x3 = x0 - 1. + 3. * C.xxx;
+
+// Permutations
+  i = mod(i, pParam.x );
+  vec4 p = permute( permute( permute(
+             i.z + vec4(0., i1.z, i2.z, 1. ), pParam.xyz)
+           + i.y + vec4(0., i1.y, i2.y, 1. ), pParam.xyz)
+           + i.x + vec4(0., i1.x, i2.x, 1. ), pParam.xyz);
+
+// Gradients
+// ( N*N points uniformly over a square, mapped onto a octohedron.)
+  float n_ = 1.0/pParam.w ;
+  vec3 ns = n_ * D.wyz - D.xzx ;
+
+  vec4 j = p - pParam.w*pParam.w*floor(p * ns.z *ns.z); // mod(p,N*N)
+
+  vec4 x_ = floor(j * ns.z) ;
+  vec4 y_ = floor(j - pParam.w * x_ ) ; // mod(j,N)
+
+  vec4 x = x_ *ns.x + ns.yyyy;
+  vec4 y = y_ *ns.x + ns.yyyy;
+  vec4 h = 1. - abs(x) - abs(y);
+
+  vec4 b0 = vec4( x.xy, y.xy );
+  vec4 b1 = vec4( x.zw, y.zw );
+
+  vec4 s0 = vec4(lessThan(b0,D.xxxx)) *2. -1.;
+  vec4 s1 = vec4(lessThan(b1,D.xxxx)) *2. -1.;
+  vec4 sh = vec4(lessThan(h, D.xxxx));
+
+  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;
+  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;
+
+  vec3 p0 = vec3(a0.xy,h.x);
+  vec3 p1 = vec3(a0.zw,h.y);
+  vec3 p2 = vec3(a1.xy,h.z);
+  vec3 p3 = vec3(a1.zw,h.w);
+
+#ifdef NORMALISE_GRADIENTS
+  p0 *= taylorInvSqrt(dot(p0,p0));
+  p1 *= taylorInvSqrt(dot(p1,p1));
+  p2 *= taylorInvSqrt(dot(p2,p2));
+  p3 *= taylorInvSqrt(dot(p3,p3));
+#endif
+
+// Mix
+  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.);
+  m = m * m;
+//used to be 64.
+  return 48.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),
+                                dot(p2,x2), dot(p3,x3) ) );
+  }
+
+vec4 grad4(float j, vec4 ip)
+  {
+  const vec4 ones = vec4(1.,1.,1.,-1.);
+  vec4 p,s;
+
+  p.xyz = floor( fract (vec3(j) * ip.xyz) *pParam.w) * ip.z -1.0;
+  p.w = 1.5 - dot(abs(p.xyz), ones.xyz);
+  s = vec4(lessThan(p,vec4(0.)));
+  p.xyz = p.xyz + (s.xyz*2.-1.) * s.www;
+
+  return p;
+  }
+
+float simplexNoise4(vec4 v)
+  {
+  const vec2 C = vec2( 0.138196601125010504, // (5 - sqrt(5))/20 G4
+                        0.309016994374947451); // (sqrt(5) - 1)/4 F4
+// First corner
+  vec4 i = floor(v + dot(v, C.yyyy) );
+  vec4 x0 = v - i + dot(i, C.xxxx);
+
+// Other corners
+
+// Force existance of strict total ordering in sort.
+  vec4 q0 = floor(x0 * 1024.0) + vec4( 0., 1./4., 2./4. , 3./4.);
+  vec4 q1;
+  q1.xy = max(q0.xy,q0.zw); // x:z y:w
+  q1.zw = min(q0.xy,q0.zw);
+
+  vec4 q2;
+  q2.xz = max(q1.xz,q1.yw); // x:y z:w
+  q2.yw = min(q1.xz,q1.yw);
+  
+  vec4 q3;
+  q3.y = max(q2.y,q2.z); // y:z
+  q3.z = min(q2.y,q2.z);
+  q3.xw = q2.xw;
+
+  vec4 i1 = vec4(lessThanEqual(q3.xxxx, q0));
+  vec4 i2 = vec4(lessThanEqual(q3.yyyy, q0));
+  vec4 i3 = vec4(lessThanEqual(q3.zzzz, q0));
+
+   // x0 = x0 - 0. + 0. * C
+  vec4 x1 = x0 - i1 + 1. * C.xxxx;
+  vec4 x2 = x0 - i2 + 2. * C.xxxx;
+  vec4 x3 = x0 - i3 + 3. * C.xxxx;
+  vec4 x4 = x0 - 1. + 4. * C.xxxx;
+
+// Permutations
+  i = mod(i, pParam.x );
+  float j0 = permute( permute( permute( permute (
+              i.w, pParam.xyz) + i.z, pParam.xyz)
+            + i.y, pParam.xyz) + i.x, pParam.xyz);
+  vec4 j1 = permute( permute( permute( permute (
+             i.w + vec4(i1.w, i2.w, i3.w, 1. ), pParam.xyz)
+           + i.z + vec4(i1.z, i2.z, i3.z, 1. ), pParam.xyz)
+           + i.y + vec4(i1.y, i2.y, i3.y, 1. ), pParam.xyz)
+           + i.x + vec4(i1.x, i2.x, i3.x, 1. ), pParam.xyz);
+// Gradients
+// ( N*N*N points uniformly over a cube, mapped onto a 4-octohedron.)
+  vec4 ip = pParam ;
+  ip.xy *= pParam.w ;
+  ip.x *= pParam.w ;
+  ip = vec4(1.,1.,1.,2.) / ip ;
+
+  vec4 p0 = grad4(j0, ip);
+  vec4 p1 = grad4(j1.x, ip);
+  vec4 p2 = grad4(j1.y, ip);
+  vec4 p3 = grad4(j1.z, ip);
+  vec4 p4 = grad4(j1.w, ip);
+
+#ifdef NORMALISE_GRADIENTS
+  p0 *= taylorInvSqrt(dot(p0,p0));
+  p1 *= taylorInvSqrt(dot(p1,p1));
+  p2 *= taylorInvSqrt(dot(p2,p2));
+  p3 *= taylorInvSqrt(dot(p3,p3));
+  p4 *= taylorInvSqrt(dot(p4,p4));
+#endif
+
+// Mix
+  vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.);
+  vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.);
+  m0 = m0 * m0;
+  m1 = m1 * m1;
+  return 32. * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))
+               + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;
+
+  }
+
+
+
diff --git a/src/glsl/skinning.vert b/src/glsl/skinning.vert
new file mode 100644
index 0000000..28970ee
--- /dev/null
+++ b/src/glsl/skinning.vert
@@ -0,0 +1,24 @@
+// Vertex weighting/blendin shader
+// Brian Paul
+// 4 Nov 2008
+
+uniform mat4 mat0, mat1;
+attribute float weight;
+
+void main() 
+{
+   // simple diffuse shading
+   // Note that we should really transform the normal vector along with
+   // the postion below... someday.
+   vec3 lightVec = vec3(0, 0, 1);
+   vec3 norm = gl_NormalMatrix * gl_Normal;
+   float dot = 0.2 + max(0.0, dot(norm, lightVec));
+   gl_FrontColor = vec4(dot);
+
+   // compute sum of weighted transformations
+   vec4 pos0 = mat0 * gl_Vertex;
+   vec4 pos1 = mat1 * gl_Vertex;
+   vec4 pos = mix(pos0, pos1, weight);
+
+   gl_Position = gl_ModelViewProjectionMatrix * pos;
+}
diff --git a/src/perf/glslstateschange1.frag b/src/perf/glslstateschange1.frag
new file mode 100644
index 0000000..0839436
--- /dev/null
+++ b/src/perf/glslstateschange1.frag
@@ -0,0 +1,19 @@
+// Multi-texture fragment shader
+// Brian Paul
+
+// Composite second texture over first.
+// We're assuming the 2nd texture has a meaningful alpha channel.
+
+uniform sampler2D tex1;
+uniform sampler2D tex2;
+uniform vec4 UniV1;
+uniform vec4 UniV2;
+
+void main()
+{
+   vec4 t3;
+   vec4 t1 = texture2D(tex1, gl_TexCoord[0].xy);
+   vec4 t2 = texture2D(tex2, gl_TexCoord[1].xy);
+   t3 = mix(t1, t2, t2.w);
+   gl_FragColor = t3 + UniV1 + UniV2;
+}
diff --git a/src/perf/glslstateschange1.vert b/src/perf/glslstateschange1.vert
new file mode 100644
index 0000000..cef50db
--- /dev/null
+++ b/src/perf/glslstateschange1.vert
@@ -0,0 +1,14 @@
+// Multi-texture vertex shader
+// Brian Paul
+
+
+attribute vec4 TexCoord0, TexCoord1;
+attribute vec4 VertCoord;
+
+void main()
+{
+   gl_TexCoord[0] = TexCoord0;
+   gl_TexCoord[1] = TexCoord1;
+   // note: may use gl_Vertex or VertCoord here for testing:
+   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
diff --git a/src/perf/glslstateschange2.frag b/src/perf/glslstateschange2.frag
new file mode 100644
index 0000000..0df0319
--- /dev/null
+++ b/src/perf/glslstateschange2.frag
@@ -0,0 +1,17 @@
+// Multi-texture fragment shader
+// Brian Paul
+
+// Composite second texture over first.
+// We're assuming the 2nd texture has a meaningful alpha channel.
+
+uniform sampler2D tex1;
+uniform sampler2D tex2;
+uniform vec4 UniV1;
+uniform vec4 UniV2;
+
+void main()
+{
+   vec4 t1 = texture2D(tex1, gl_TexCoord[0].xy);
+   vec4 t2 = texture2D(tex2, gl_TexCoord[1].xy);
+   gl_FragColor = t1 + t2 + UniV1 + UniV2;
+}
diff --git a/src/perf/glslstateschange2.vert b/src/perf/glslstateschange2.vert
new file mode 100644
index 0000000..cef50db
--- /dev/null
+++ b/src/perf/glslstateschange2.vert
@@ -0,0 +1,14 @@
+// Multi-texture vertex shader
+// Brian Paul
+
+
+attribute vec4 TexCoord0, TexCoord1;
+attribute vec4 VertCoord;
+
+void main()
+{
+   gl_TexCoord[0] = TexCoord0;
+   gl_TexCoord[1] = TexCoord1;
+   // note: may use gl_Vertex or VertCoord here for testing:
+   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
diff --git a/src/vpglsl/infinite-loop.glsl b/src/vpglsl/infinite-loop.glsl
new file mode 100644
index 0000000..bc7ae4b
--- /dev/null
+++ b/src/vpglsl/infinite-loop.glsl
@@ -0,0 +1,8 @@
+void main() {
+   gl_Position = gl_Vertex;
+   vec4 sum = vec4(0);
+   for (int i = 1; i != 2; i += 2) {
+      sum += vec4(0.1, 0.1, 0.1, 0.1);
+   }
+   gl_FrontColor = sum;
+}
-- 
2.0.0