Hi,
I work at VMware on the team responsible for virtualizing 3D
graphics. Part of the implementation of our virtual graphics device on
Mac OS X is a shader translator that generates GLSL code.
We recently found a fairly nasty crasher bug in the GLSL compiler- I
already filed Apple bug 6034337 on this issue, but I thought the
engineers on this list might be interested in the details as well. I
have a shader which will trigger the crash 100% on my system (Mac Pro,
10.5.3, NVidia GeForce 7300 GT).
As far as we know, it's possible to hit this crash any time the GLSL
runtime decides to emulate a vertex shader in software rather than
running it on the GPU. The crash occurs in the LLVM translator that
Apple is using to generate x86 code for software emulated shaders.
The shader is attached. It's a translated version of a DirectX (Shader
Model 2) vertex shader from Portal. I can use it to repro this bug
trivially:
1. Open GLSLEditorSample
2. File -> New
3. Paste in the text of bug-286135.glsl
4. Tick the "Use Program" checkbox in the "GLSL Shader Program" window
5. At this point, the app will either crash immediately or the UI
will hang (beachball).
Both in GLSLEditorSample and in our production VMware code, we observe
various categories of crashes which have stack corruption as their
root cause. Typically we'll crash with a SIGSEGV or SIGILL- which we
internally try to handle, resulting in a secondary failure due to the
already corrupted stack. In the GLSLEditorSample, the final symptom is
either an immediate segfault or a UI hang (beachball) for a minute or
so followed by a segfault.
In both cases, we see backtraces similar to the one attached to this
mail. Note that the crash was not on a thread created by the app, but
on the internal thread used by Apple for LLVM translation. Apple's
separate LLVM translation thread is stuck in very deep recursion via
the isReachable function, which exhausts stack space and causes
secondary and tertiary failures.
Obviously we're interested in a fix for this bug, but there are a
couple of other secondary questions we have:
- Is there any way (other than trial and error) to understand why
a shader is running in software? We've identified several potential
causes: too many instructions, using an operation that isn't
supported by the GPU backend, phase of the moon... Is there anything
we can do to help ourselves (and Apple?) understand why individual
shaders are running in software? So far we've been using various
interactive debug tools to investigate software-emulated shaders,
but it would be really helpful to get some concrete information from
Apple's GLSL backend when a shader fails to run in software.
- Currently we're disabling all software shaders, because it's better
for us to render incorrectly than to crash the virtual machine.
I would be really greatful to get any hints on what kinds of program
constructs will cause this bug to trigger, so we can work around it
in a less heavy-handed way.
Attached is the backtrace and sample shader mentioned above.
Thank you in advance for any help you may be able to offer!
--Micah
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0xb0228ffc
[Switching to process 2707 thread 0x4703]
0x94cb6d63 in tiny_free_list_add_ptr ()
(gdb) bt
#0 0x94cb6d63 in tiny_free_list_add_ptr ()
#1 0x94cb589c in tiny_malloc_from_free_list ()
#2 0x94cae3ed in szone_malloc ()
#3 0x94cae2f8 in malloc_zone_malloc ()
#4 0x94cae28c in malloc ()
#5 0x94726598 in operator new ()
#6 0x90553537 in std::_Rb_tree<llvm::SUnit*, llvm::SUnit*, std::_Identity<llvm::SUnit*>, std::less<llvm::SUnit*>, std::allocator<llvm::SUnit*> >::_M_insert ()
#7 0x90553639 in std::_Rb_tree<llvm::SUnit*, llvm::SUnit*, std::_Identity<llvm::SUnit*>, std::less<llvm::SUnit*>, std::allocator<llvm::SUnit*> >::insert_unique ()
#8 0x903410e0 in isReachable ()
#9 0x90341116 in isReachable ()
...
#8142 0x90341116 in isReachable ()
#8143 0x90341116 in isReachable ()
#8144 0x90341116 in isReachable ()
#8145 0x90341116 in isReachable ()
#8146 0x902e1952 in (anonymous namespace)::BURegReductionPriorityQueue<(anonymous namespace)::bu_ls_rr_sort>::AddPseudoTwoAddrDeps ()
#8147 0x902e15ee in (anonymous namespace)::BURegReductionPriorityQueue<(anonymous namespace)::bu_ls_rr_sort>::initNodes ()
#8148 0x902de5de in (anonymous namespace)::ScheduleDAGRRList::Schedule ()
#8149 0x902de590 in llvm::ScheduleDAG::Run ()
#8150 0x902de21f in llvm::SelectionDAGISel::ScheduleAndEmitDAG ()
#8151 0x902d3adb in (anonymous namespace)::X86DAGToDAGISel::InstructionSelectBasicBlock ()
#8152 0x902a3b2d in llvm::SelectionDAGISel::SelectBasicBlock ()
#8153 0x902a23e3 in llvm::SelectionDAGISel::runOnFunction ()
#8154 0x902a2282 in (anonymous namespace)::X86DAGToDAGISel::runOnFunction ()
#8155 0x9022753c in llvm::FPPassManager::runOnFunction ()
#8156 0x90226e81 in llvm::FunctionPassManagerImpl::run ()
#8157 0x90226d85 in llvm::FunctionPassManager::run ()
#8158 0x902883dc in llvm::JIT::runJITOnFunction ()
#8159 0x90288132 in llvm::JIT::getPointerToFunction ()
#8160 0x9028803b in glvmGenerateModularFunctionPointer ()
#8161 0x9047186e in glvmBuildVPTransformFunction ()
#8162 0x9020e0da in glvm_deferred_build_modular ()
#8163 0x9020d3da in glvmDoWork ()
#8164 0x94cde6f5 in _pthread_start ()
#8165 0x94cde5b2 in thread_start ()
// Translated shader for bytecode with hash e9dcb77f4feb0764
/*
* Program Identity:
*
* Vertex Shader 28, Pixel Shader 451
*
* Samplers
* [ 0] type=2 fmtClass=0 gamma=1.000000
* [ 1] type=2 fmtClass=0 gamma=2.200000
* [ 2] type=3 fmtClass=0 gamma=2.200000
* [ 3] type=2 fmtClass=0 gamma=2.200000
* [ 4] type=2 fmtClass=0 gamma=1.000000
* [ 5] type=2 fmtClass=0 gamma=1.000000
* [ 6] type=2 fmtClass=0 gamma=1.000000
* [ 7] type=2 fmtClass=0 gamma=1.000000
* [ 8] type=2 fmtClass=0 gamma=1.000000
* [ 9] type=2 fmtClass=0 gamma=1.000000
* [10] type=2 fmtClass=0 gamma=1.000000
* [11] type=2 fmtClass=0 gamma=1.000000
* [12] type=2 fmtClass=0 gamma=1.000000
* [13] type=2 fmtClass=0 gamma=1.000000
* [14] type=2 fmtClass=0 gamma=1.000000
* [15] type=2 fmtClass=0 gamma=2.200000
*
* Vertex Arrays
* [ 0] type=2 method=0 usage=0 usageIndex=0
* [ 1] type=1 method=0 usage=1 usageIndex=0
* [ 2] type=4 method=0 usage=2 usageIndex=0
* [ 3] type=2 method=0 usage=3 usageIndex=0
* [ 4] type=1 method=0 usage=5 usageIndex=0
* [ 5] type=3 method=0 usage=6 usageIndex=0
* [ 6] type=3 method=0 usage=0 usageIndex=1
* [ 7] type=2 method=0 usage=3 usageIndex=1
*
* Output Gamma = 2.200000
*
* Max float constants = VS:217 PS:31
*
* Translated const array size = 217
*
* Uses relative addressing = 1
*
*/
// Declarations
ivec4 A[1];
bvec4 P[1];
uniform mat4 PositionXForm;
vec4 V[16], O[12], R[32];
void shader_fn (int aL);
attribute vec4 Position0;
attribute vec4 BlendWeight0;
attribute vec4 BlendIndices0;
attribute vec4 TexCoord0;
attribute vec4 Position1;
// Main Function
uniform vec4 C[217];
void
main (void)
{
for (int i = 0; i < 16; ++i)
{
V[i] = vec4 (0.0, 0.0, 0.0, 1.0);
} for (int i = 0; i < 12; ++i)
{
O[i] = vec4 (0.0, 0.0, 0.0, 1.0);
} for (int i = 0; i < 32; ++i)
{
R[i] = vec4 (0.0, 0.0, 0.0, 1.0);
} V[0] = vec4 (Position0.x, Position0.y, Position0.z, 1.0);
V[1] = vec4 (BlendWeight0.x, BlendWeight0.y, 0.0, 1.0);
V[2] =
vec4 (BlendIndices0.x, BlendIndices0.y, BlendIndices0.z,
BlendIndices0.w).zyxw;
V[3] = vec4 (TexCoord0.x, TexCoord0.y, 0.0, 1.0);
V[4] = vec4 (Position1.x, Position1.y, Position1.z, Position1.w);
shader_fn (0);
gl_Position = O[0];
gl_Position = PositionXForm * gl_Position;
gl_FrontColor.xyz = O[2].xyz;
gl_FogFragCoord = O[3].w;
gl_TexCoord[0] = O[4];
gl_TexCoord[1] = O[5];
gl_TexCoord[2] = O[6];
gl_TexCoord[3] = O[7];
gl_TexCoord[4].xyz = O[8].xyz;
gl_TexCoord[5].xyz = O[9].xyz;
gl_TexCoord[6] = O[10];
gl_TexCoord[7] = O[11];
}
// Samplers
// Shader Code
vec4
ADD (vec4 v0, vec4 v1)
{
return v0 + v1;
}
vec4
MAD (vec4 v0, vec4 v1, vec4 v2)
{
return v0 * v1 + v2;
}
vec4
MUL (vec4 v0, vec4 v1)
{
return v0 * v1;
}
vec4
RCP (vec4 v)
{
return 1.0 / v;
}
vec4
RSQ (vec4 v)
{
return vec4 (1.0 / sqrt (abs (v.x)));
}
vec4
DP3 (vec4 v0, vec4 v1)
{
return vec4 (dot (v0.xyz, v1.xyz)) + vec4 (0.0);
}
vec4
DP4 (vec4 v0, vec4 v1)
{
return vec4 (dot (v0, v1)) + vec4 (0.0);
}
vec4
MIN (vec4 v0, vec4 v1)
{
return min (v0, v1);
}
vec4
MAX (vec4 v0, vec4 v1)
{
return max (v0, v1);
}
vec4
SLT (vec4 v0, vec4 v1)
{
return vec4 ((v0.x < v1.x) ? 1.0 : 0.0, (v0.y < v1.y) ? 1.0 : 0.0,
(v0.z < v1.z) ? 1.0 : 0.0, (v0.w < v1.w) ? 1.0 : 0.0);
}
vec4
POW (vec4 v0, vec4 v1)
{
return pow (abs (v0), v1);
}
vec4
NRM (vec4 v)
{
v.rgb = normalize (v.rgb);
return v;
}
ivec4
MOVA (vec4 v)
{
return ivec4 (v + (sign (v) * 0.5));
}
vec4
ID (vec4 x)
{
return x;
}
ivec4
ID (ivec4 x)
{
return x;
}
bvec4
ID (bvec4 x)
{
return x;
}
void
shader_fn (int aL)
{
R[0].xyz = MUL (ID (V[2].zyxw), ID (C[1].xxxx)).xyz;
A[0].xyz = MOVA (R[0]).xyz;
R[1].w = ADD (ID (V[1].yyyy), ID (V[1].xxxx)).w;
R[0] = MUL (ID (V[1].yyyy), C[58 + A[0].y]);
R[2].w = ADD (-ID (R[1].wwww), ID (C[0].yyyy)).w;
R[0] = MAD (C[58 + A[0].x], ID (V[1].xxxx), R[0]);
R[1] = MAD (C[58 + A[0].z], ID (R[2].wwww), R[0]);
R[0].xyz = (V[4]).xyz;
R[0].xyz = MAD (R[0], ID (C[13].xxxx), V[0]).xyz;
R[0].w = (ID (V[0].wwww)).w;
R[2].x = DP4 (R[0], R[1]).x;
R[1] = MUL (ID (V[1].yyyy), C[59 + A[0].y]);
R[3] = MAD (C[59 + A[0].x], ID (V[1].xxxx), R[1]);
R[1] = MUL (ID (V[1].yyyy), C[60 + A[0].y]);
R[3] = MAD (C[59 + A[0].z], ID (R[2].wwww), R[3]);
R[1] = MAD (C[60 + A[0].x], ID (V[1].xxxx), R[1]);
R[2].y = DP4 (R[0], R[3]).y;
R[1] = MAD (C[60 + A[0].z], ID (R[2].wwww), R[1]);
R[2].z = DP4 (R[0], R[1]).z;
R[2].w = (ID (C[0].yyyy)).w;
O[0].x = DP4 (R[2], C[8]).x;
R[0].x = DP3 (-C[51], -C[51]).x;
R[0].w = RSQ (ID (R[0].xxxx)).w;
R[1].xyz = ADD (R[2], -C[48]).xyz;
R[0].xyz = MUL (ID (R[0].wwww), -ID (C[51].zxyw)).xyz;
R[3].xyz = NRM (R[1]).xyz;
O[0].y = DP4 (R[2], C[9]).y;
R[1].xyz = MUL (R[0], ID (R[3].yzxw)).xyz;
R[11].z = DP4 (R[2], C[10]).z;
R[1].xyz = MAD (ID (R[0].zxyw), ID (R[3].zxyw), -R[1]).xyz;
R[0].w = MAD (-ID (R[11].zzzz), ID (C[16].wwww), ID (C[16].xxxx)).w;
R[0].xyz = NRM (R[1]).xyz;
O[3].w = MAX (ID (R[0].wwww), ID (C[16].zzzz)).w;
R[1].xyz = MUL (ID (R[3].zxyw), ID (R[0].yzxw)).xyz;
R[1].xyz = MAD (ID (R[3].yzxw), ID (R[0].zxyw), -R[1]).xyz;
R[5].xyz = ADD (R[2], -C[2]).xyz;
R[4].xyz = NRM (R[1]).xyz;
R[1].xyz = NRM (R[5]).xyz;
O[2].xyz = MAD (R[4], ID (C[0].wwww), ID (C[0].wwww)).xyz;
R[6].y = DP3 (R[1], R[4]).y;
R[6].x = DP3 (R[1], R[0]).x;
R[4].xyz = ADD (-R[2], C[34]).xyz;
O[9].xyz = (R[0]).xyz;
R[0].z = DP3 (R[4], R[4]).z;
R[6].z = DP3 (R[1], R[3]).z;
R[1].y = RSQ (ID (R[0].zzzz)).y;
R[0].x = DP3 (R[6], R[6]).x;
R[5].xyz = MUL (R[4], ID (R[1].yyyy)).xyz;
R[0].w = RSQ (ID (R[0].xxxx)).w;
R[0].x = DP3 (C[33], -R[5]).x;
O[6].xyz = MUL (R[6], ID (R[0].wwww)).xyz;
R[0].w = ADD (ID (R[0].xxxx), -ID (C[35].zzzz)).w;
R[4].xyz = MAD (R[4], -ID (R[1].yyyy), -C[33]).xyz;
R[0].w = MUL (ID (R[0].wwww), ID (C[35].wwww)).w;
R[5].xyz = MAD (ID (C[32].wwww), R[4], R[5]).xyz;
R[3].w = MAX (ID (R[0].wwww), ID (C[1].zzzz)).w;
R[1].xz = (ID (C[0].yyyy)).xz;
R[0].yw = (ID (C[0].yyyy)).yw;
R[1].w = POW (ID (R[3].wwww), ID (C[35].xxxx)).w;
R[1].xyz = MUL (ID (R[0].wzzw), R[1]).xyz;
R[0].w = MIN (ID (R[1].wwww), ID (C[0].yyyy)).w;
R[0].x = DP3 (C[36], R[1]).x;
R[1].w = RCP (ID (R[0].xxxx)).w;
R[1].xyz = NRM (-C[50]).xyz;
R[0].w = MAD (ID (R[1].wwww), ID (R[0].wwww), -ID (R[1].wwww)).w;
R[0].x = DP3 (R[3], R[1]).x;
R[1].w = MAD (ID (C[33].wwww), ID (R[0].wwww), ID (R[1].wwww)).w;
R[3].w = MUL (ID (R[0].xxxx), ID (C[1].yyyy)).w;
R[0].w = ADD (-ID (R[1].wwww), ID (C[0].yyyy)).w;
R[6].xyz = MAD (ID (R[3].wwww), R[1], R[3]).xyz;
R[1].y = MAD (ID (C[32].wwww), ID (R[0].wwww), ID (R[1].wwww)).y;
R[4].xyz = NRM (R[6]).xyz;
R[1].x = DP3 (R[4], R[5]).x;
R[6].xyz = ADD (-R[2], C[29]).xyz;
R[11].y = DP3 (R[3], R[5]).y;
R[0].x = DP3 (R[6], R[6]).x;
R[0].w = MAD (ID (R[1].xxxx), ID (C[0].wwww), ID (C[0].wwww)).w;
R[7].y = RSQ (ID (R[0].xxxx)).y;
R[0].w = MUL (ID (R[0].wwww), ID (R[0].wwww)).w;
R[5].xyz = MUL (R[6], ID (R[7].yyyy)).xyz;
R[8].xyz = MUL (ID (R[0].wwww), C[32]).xyz;
R[1].x = DP3 (C[28], -R[5]).x;
R[9].xyz = MUL (ID (R[1].yyyy), R[8]).xyz;
R[0].w = ADD (ID (R[1].xxxx), -ID (C[30].zzzz)).w;
R[0].w = MUL (ID (R[0].wwww), ID (C[30].wwww)).w;
R[7].xz = (ID (C[0].yyyy)).xz;
R[1].w = MAX (ID (R[0].wwww), ID (C[1].zzzz)).w;
R[0].xyz = MUL (ID (R[0].yxxw), R[7]).xyz;
R[0].w = POW (ID (R[1].wwww), ID (C[30].xxxx)).w;
R[0].x = DP3 (C[31], R[0]).x;
R[0].w = MIN (ID (R[0].wwww), ID (C[0].yyyy)).w;
R[1].w = RCP (ID (R[0].xxxx)).w;
R[0].xyz = MAD (R[6], -ID (R[7].yyyy), -C[28]).xyz;
R[0].w = MAD (ID (R[1].wwww), ID (R[0].wwww), -ID (R[1].wwww)).w;
R[5].xyz = MAD (ID (C[27].wwww), R[0], R[5]).xyz;
R[1].w = MAD (ID (C[28].wwww), ID (R[0].wwww), ID (R[1].wwww)).w;
R[0].w = ADD (-ID (R[1].wwww), ID (C[0].yyyy)).w;
R[6].xyz = ADD (-R[2], C[39]).xyz;
R[1].x = MAD (ID (C[27].wwww), ID (R[0].wwww), ID (R[1].wwww)).x;
R[0].x = DP3 (R[6], R[6]).x;
R[7].x = DP3 (R[4], R[5]).x;
R[7].y = RSQ (ID (R[0].xxxx)).y;
R[1].z = DP3 (R[3], R[5]).z;
R[5].xyz = MUL (R[6], ID (R[7].yyyy)).xyz;
R[0].w = MAD (ID (R[7].xxxx), ID (C[0].wwww), ID (C[0].wwww)).w;
R[7].x = DP3 (C[38], -R[5]).x;
R[1].w = MUL (ID (R[0].wwww), ID (R[0].wwww)).w;
R[0].w = ADD (ID (R[7].xxxx), -ID (C[40].zzzz)).w;
R[8].xyz = MUL (ID (R[1].wwww), C[27]).xyz;
R[1].w = MUL (ID (R[0].wwww), ID (C[40].wwww)).w;
R[7].xz = (ID (C[0].yyyy)).xz;
R[0].yw = (ID (C[0].yyyy)).yw;
R[3].w = MAX (ID (R[1].wwww), ID (C[1].zzzz)).w;
R[0].xyz = MUL (ID (R[0].yxxw), R[7]).xyz;
R[1].w = POW (ID (R[3].wwww), ID (C[40].xxxx)).w;
R[0].x = DP3 (C[41], R[0]).x;
R[1].w = MIN (ID (R[1].wwww), ID (C[0].yyyy)).w;
R[3].w = RCP (ID (R[0].xxxx)).w;
R[9].xyz = MAD (R[8], ID (R[1].xxxx), R[9]).xyz;
R[1].w = MAD (ID (R[3].wwww), ID (R[1].wwww), -ID (R[3].wwww)).w;
R[0].xyz = MAD (R[6], -ID (R[7].yyyy), -C[38]).xyz;
R[3].w = MAD (ID (C[38].wwww), ID (R[1].wwww), ID (R[3].wwww)).w;
R[6].xyz = MAD (ID (C[37].wwww), R[0], R[5]).xyz;
R[1].w = ADD (-ID (R[3].wwww), ID (C[0].yyyy)).w;
R[0].x = MAD (ID (C[37].wwww), ID (R[1].wwww), ID (R[3].wwww)).x;
R[5].xyz = ADD (-R[2], C[44]).xyz;
R[7].x = DP3 (R[4], R[6]).x;
R[0].z = DP3 (R[5], R[5]).z;
R[11].x = DP3 (R[3], R[6]).x;
R[8].y = RSQ (ID (R[0].zzzz)).y;
R[1].w = MAD (ID (R[7].xxxx), ID (C[0].wwww), ID (C[0].wwww)).w;
R[7].xyz = MUL (R[5], ID (R[8].yyyy)).xyz;
R[1].w = MUL (ID (R[1].wwww), ID (R[1].wwww)).w;
R[8].x = DP3 (C[43], -R[7]).x;
R[6].xyz = MUL (ID (R[1].wwww), C[37]).xyz;
R[1].w = ADD (ID (R[8].xxxx), -ID (C[45].zzzz)).w;
R[1].w = MUL (ID (R[1].wwww), ID (C[45].wwww)).w;
R[8].xz = (ID (C[0].yyyy)).xz;
R[1].w = MAX (ID (R[1].wwww), ID (C[1].zzzz)).w;
R[10].xyz = MUL (ID (R[0].wzzw), R[8]).xyz;
R[0].w = POW (ID (R[1].wwww), ID (C[45].xxxx)).w;
R[8].x = DP3 (C[46], R[10]).x;
R[0].w = MIN (ID (R[0].wwww), ID (C[0].yyyy)).w;
R[1].w = RCP (ID (R[8].xxxx)).w;
R[6].xyz = MAD (R[6], ID (R[0].xxxx), R[9]).xyz;
R[0].w = MAD (ID (R[1].wwww), ID (R[0].wwww), -ID (R[1].wwww)).w;
R[5].xyz = MAD (R[5], -ID (R[8].yyyy), -C[43]).xyz;
R[1].w = MAD (ID (C[43].wwww), ID (R[0].wwww), ID (R[1].wwww)).w;
R[5].xyz = MAD (ID (C[42].wwww), R[5], R[7]).xyz;
R[0].w = ADD (-ID (R[1].wwww), ID (C[0].yyyy)).w;
R[0].y = MAD (ID (C[42].wwww), ID (R[0].wwww), ID (R[1].wwww)).y;
R[8].x = DP3 (R[4], R[5]).x;
R[7].x = DP3 (R[3], R[5]).x;
O[8].xyz = (R[3]).xyz;
R[0].w = MAD (ID (R[8].xxxx), ID (C[0].wwww), ID (C[0].wwww)).w;
R[3].xyz = SLT (R[4], ID (C[0].xxxx)).xyz;
R[4].xyz = MUL (R[4], R[4]).xyz;
A[0].xyz = MOVA (R[3]).xyz;
R[0].w = MUL (ID (R[0].wwww), ID (R[0].wwww)).w;
R[5].xyz = MUL (ID (R[4].yyyy), C[23 + A[0].y]).xyz;
R[3].xyz = MUL (ID (R[0].wwww), C[42]).xyz;
R[5].xyz = MAD (ID (R[4].xxxx), C[21 + A[0].x], R[5]).xyz;
R[3].xyz = MAD (R[3], ID (R[0].yyyy), R[6]).xyz;
R[4].xyz = MAD (ID (R[4].zzzz), C[25 + A[0].z], R[5]).xyz;
O[5].xyz = ADD (R[3], R[4]).xyz;
O[4].w = DP4 (C[50], R[2]).w;
O[4].z = DP4 (C[51], R[2]).z;
R[11].w = DP4 (R[2], C[11]).w;
O[7].xyz = (R[2]).xyz;
O[0].zw = (R[11]).zw;
O[7].w = (ID (R[11].zzzz)).w;
O[4].xy = (V[3]).xy;
O[5].w = (ID (C[0].xxxx)).w;
O[6].w = (ID (C[0].xxxx)).w;
R[1].w = MAD (ID (R[1].zzzz), ID (C[0].wwww), ID (C[0].wwww)).w;
R[0].w = MAD (ID (R[11].yyyy), ID (C[0].wwww), ID (C[0].wwww)).w;
R[1].z = MUL (ID (R[1].wwww), ID (R[1].wwww)).z;
R[1].w = MUL (ID (R[0].wwww), ID (R[0].wwww)).w;
R[2].w = MAD (ID (R[11].xxxx), ID (C[0].wwww), ID (C[0].wwww)).w;
R[0].w = MAD (ID (R[7].xxxx), ID (C[0].wwww), ID (C[0].wwww)).w;
R[0].z = MUL (ID (R[2].wwww), ID (R[2].wwww)).z;
R[0].w = MUL (ID (R[0].wwww), ID (R[0].wwww)).w;
O[10] = (R[1]);
O[11] = (R[0]);
}
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Mac-opengl mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden