1 - Please explain the odd failures in getAttrib and uniform
location -- code snippets etc...

My guess is that you are exceeding the texture indirection limit
on the i945...

As a suggestion try this equivalent shader...

**#define VECTORIZED 1**

**// it would me better (more efficent) to just add more tex
coords**

**// 1 texcoord per sample would mean less work per fragment**

**uniform sampler2D tex;**

**#if VECTORIZED**

**uniform vec2 _1_wh; // == 1/w,1/h**

**#else**

**uniform float height;**

**uniform float width;**

**#endif**

**void main()**

**{**

**#if VECTORIZED**

**// setup texcoords**

** ****vec2
stMinusOne = gl_TexCoord[0].st - _1_wh;**

** ****vec2
stPlusOne = gl_TexCoord[0].st + _1_wh;**

** ****vec2
tc0 = vec2(gl_TexCoord[0].s, stMinusOne.y);**

** ****vec2
tc1 = vec2(stMinusOne.x, gl_TexCoord[0].t);**

** ****vec2
tc3 = vec2(stPlusOne.x, gl_TexCoord[0].t);**

** ****vec2
tc4 = vec2(gl_TexCoord[0].s, stPlusOne.y);**

**// do all texturing at once -- minimize texture indirections**

** ****vec4
t0 = texture2D(tex, tc0);**

** ****vec4
t1 = texture2D(tex, tc1);**

** ****vec4
t2 = texture2D(tex, gl_TexCoord[0].st);**

** ****vec4
t3 = texture2D(tex, tc3);**

** ****vec4
t4 = texture2D(tex, tc4);**

**// do not multiply by 1.0**

** ****//
3x3 gaussian blur**

** ****gl_FragColor
= (**

** ****t0
+**

** ****t1
+**

** ****t2*4.0
+**

** ****t3
+**

** ****t4**

** ****)
* (1.0 / 8.0);**

**#else**

** ****float
/ height;**

** ****float
/ width;**

** ****float
s = gl_TexCoord[0].s;**

** ****float
sMinusOne = s - oneOffX;**

** ****float
sPlusOne = s + oneOffX;**

** ****float
t = gl_TexCoord[0].t;**

** ****float
tMinusOne = t - oneOffY;**

** ****float
tPlusOne = t + oneOffY;**

** ****vec2
tc0 = vec2(s, tMinusOne);**

** ****vec2
tc1 = vec2(sMinusOne, t);**

** ****vec2
tc3 = vec2(sPlusOne, t);**

** ****vec2
tc4 = vec2(s, tPlusOne);**

** ****vec4
t0 = texture2D(tex, tc0);**

** ****vec4
t1 = texture2D(tex, tc1);**

** ****vec4
t2 = texture2D(tex, gl_TexCoord[0].st);**

** ****vec4
t3 = texture2D(tex, tc3);**

** ****vec4
t4 = texture2D(tex, tc4);**

** ****//
3x3 gaussian blur**

** ****gl_FragColor
= (**

** ****t0*1.0
+**

** ****t1*1.0
+**

** **

** ****t2*4.0
+**

** **

** ****t3*1.0
+**

** ****t4*1.0**

** ****)
* (1.0 / 8.0);**

**#endif**

**}**

---------

I added a vectorized version for comparison

It is slightly better than the non-vectorized version ~50% # of
math ops

Now you could make this even better by adding your texcoord
generation (which is basically a per vertex operation) into the vertex
shader

** ****vec2
stMinusOne = gl_TexCoord[0].st - _1_wh;**

** ****vec2
stPlusOne = gl_TexCoord[0].st + _1_wh;**

** ****vec2
tc0 = vec2(gl_TexCoord[0].s, stMinusOne.y);**

** ****vec2
tc1 = vec2(stMinusOne.x, gl_TexCoord[0].t);**

** ****vec2
tc3 = vec2(stPlusOne.x, gl_TexCoord[0].t);**

** ****vec2
tc4 = vec2(gl_TexCoord[0].s, stPlusOne.y);**

Is done once per pixel -- but since its all on varyings -- it
could be hoisted to the vertex shader

---------

I have not tried this on an i945 -- so if you still have sw
fallback problems please email