[Mesa-dev] [PATCH] st/mesa: adjust Z coordinates for quad clearing
Brian Paul
brianp at vmware.com
Tue Aug 5 09:21:11 PDT 2014
On 08/05/2014 10:16 AM, Roland Scheidegger wrote:
> Am 04.08.2014 18:08, schrieb Brian Paul:
>> Specify the quad's Z position in clip coordinate space, not
>> normalized Z space. Use viewport scale, translation = 0.5, 0.5.
>>
>> Before, we were specifying the quad's Z position in [0,1] and using
>> viewport scale=1.0, translate=0.0. That works fine, unless your
>> driver needs to work in clip coordinate space and needs to
>> reconstruct viewport near/far values from the scale/translation
>> factors. The VMware svga driver falls into that category.
>>
>> When we did that reconstruction we wound up with near=-1 and far=1
>> which are outside the limits of [0,1]. In some cases, this caused
>> the quad to be drawn at the wrong depth. In other cases it was
>> clipped away.
>>
>> Fixes some scissored depth clears with VMware driver. This should
>> have no effect on other drivers.
>> ---
>> src/mesa/state_tracker/st_cb_clear.c | 7 +++++--
>> 1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
>> index 4bfa8d7..4ca6de3 100644
>> --- a/src/mesa/state_tracker/st_cb_clear.c
>> +++ b/src/mesa/state_tracker/st_cb_clear.c
>> @@ -173,6 +173,9 @@ draw_quad(struct st_context *st,
>> return;
>> }
>>
>> + /* Convert Z from [0,1] to [-1,1] range */
>> + z = z * 2.0f - 1.0f;
>> +
>> /* positions */
>> vertices[0][0][0] = x0;
>> vertices[0][0][1] = y0;
>> @@ -319,11 +322,11 @@ clear_with_quad(struct gl_context *ctx, unsigned clear_buffers)
>> struct pipe_viewport_state vp;
>> vp.scale[0] = 0.5f * fb_width;
>> vp.scale[1] = fb_height * (invert ? -0.5f : 0.5f);
>> - vp.scale[2] = 1.0f;
>> + vp.scale[2] = 0.5;
> 0.5f for consistency? Same below.
Done.
>
>> vp.scale[3] = 1.0f;
>> vp.translate[0] = 0.5f * fb_width;
>> vp.translate[1] = 0.5f * fb_height;
>> - vp.translate[2] = 0.0f;
>> + vp.translate[2] = 0.5;
>> vp.translate[3] = 0.0f;
>> cso_set_viewport(st->cso_context, &vp);
>> }
>>
>
> Other than that,
> Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Thanks!
>
> I thought though the same math is used in other places too, but I could
> be wrong.
We're already using the 0.5 value for scale and translate in the
glBitmap, glDrawPixels, glCopyPixels functions. So, I'm really just
making the glClear code work the same way. I can note that in the
commit msg.
-Brian
More information about the mesa-dev
mailing list