armchair_architect
Newcomer
On the topic of MUL through the SF pipeline, I think there must be something missing from the patent diagram Jawed posted. Assuming interpolation is done by evaluating plane equations as Bob hinted, and assuming you're doing perspective-correct interpolation (required by DX9, default in DX10 unless the shader chooses otherwise on a per-vector basis) you need to do for each pixel:
value = (A*x + B*y + C) * interp_w
The final multiply is for perspective correction. If interpolation throughput has been measured at 1 clock, then multiply-by-w must be done as part of the interpolation (in the SF unit) rather than a second dependent operation in the MAD unitBefore I saw the SF diagram Jawed posted I'd assumed it was this perspective-correction MUL that was being used for SF-MUL.
(Here's how perspective-correct interpolation works, for anyone not familiar with it:
The vertex shader outputs float4 position and whatever other attributes it wants. Position XYZ and all the other attributes are divided by the pos.w value before being used for clipping, rasterization, and plane equation setup. So evaluating plane equations actually gives you the interpolated value of attr/pos.w. This is multiplied by the interpolated pos.w value (what I called interp_w above) to get the final interpolated attr value. The interpolated pos.w is the reciprocal of the value obtained from evaluating a plane equation built from the per-vertex 1/pos.w.)
value = (A*x + B*y + C) * interp_w
The final multiply is for perspective correction. If interpolation throughput has been measured at 1 clock, then multiply-by-w must be done as part of the interpolation (in the SF unit) rather than a second dependent operation in the MAD unitBefore I saw the SF diagram Jawed posted I'd assumed it was this perspective-correction MUL that was being used for SF-MUL.
(Here's how perspective-correct interpolation works, for anyone not familiar with it:
The vertex shader outputs float4 position and whatever other attributes it wants. Position XYZ and all the other attributes are divided by the pos.w value before being used for clipping, rasterization, and plane equation setup. So evaluating plane equations actually gives you the interpolated value of attr/pos.w. This is multiplied by the interpolated pos.w value (what I called interp_w above) to get the final interpolated attr value. The interpolated pos.w is the reciprocal of the value obtained from evaluating a plane equation built from the per-vertex 1/pos.w.)