[Mesa-dev] [PATCH 1/2] i965: Implement guardband clipping on Sandybridge.

Kenneth Graunke kenneth at whitecape.org
Fri May 11 15:07:33 PDT 2012


On 05/08/2012 04:07 PM, Eric Anholt wrote:
> On Fri,  4 May 2012 17:06:38 -0700, Kenneth Graunke<kenneth at whitecape.org>  wrote:
>> -   vp->xmin = -1.0;
>> -   vp->xmax = 1.0;
>> -   vp->ymin = -1.0;
>> -   vp->ymax = 1.0;
>> +   /* According to the Sandybridge PRM, Volume 2, Part 1, Section 6.3.8
>> +    * "Vertex X,Y Clamping and Quantization", the screen-aligned 2D
>> +    * bounding-box of an object must not exceed 16K pixels in either X or Y.
>> +    */
>> +   const float maximum_post_clamp_delta = 16384;
>> +   float gbx = maximum_post_clamp_delta / (float) ctx->Viewport.Width;
>> +   float gby = maximum_post_clamp_delta / (float) ctx->Viewport.Height;
>> +
>> +   vp->xmin = -gbx;
>> +   vp->xmax = gbx;
>> +   vp->ymin = -gby;
>> +   vp->ymax = gby;
>
> Aren't you letting primitives extend from -16384 to 16384 this way?

I don't think so.  I originally had this halved, but Paul and I worked 
through the math together and independenty decided this was right.

Here's my math:

NDC_VP_Width = 2   // since the viewport is -1.0 to 1.0

// Screen space viewport width is NDC VP width times some scale factor

Viewport.Width = NDC_VP_Width * scale
Viewport.Width = 2 * scale
scale = Viewport.Width / 2

// We can use the same scale factor to compute the GB NDC size:

16384 = NDC_GB_Width * scale
16384 = NDC_GB_Width * (Viewport.Width / 2)

16384 * (2 / Viewport.Width) = NDC_GB_Width

32768 / Viewport.Width = NDC_GB_Width

// The coordinates we want are [-width/2, width/2]:

GBX = NDC_GB_Width / 2
GBX = 16384 / Viewport.Width

--------------------------------

I also experimentally verified that my piglit test works at these 
numbers, and going much beyond this causes noticable issues.

Convinced?


More information about the mesa-dev mailing list