OSDN Git Service

anv: Fix near plane clipping on Gen7/7.5.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 18 Jul 2016 21:15:49 +0000 (14:15 -0700)
committerEmil Velikov <emil.l.velikov@gmail.com>
Thu, 21 Jul 2016 15:01:05 +0000 (16:01 +0100)
The Gen7/7.5 clip code used APIMODE_OGL, while the Gen8+ clip code used
APIMODE_D3D.  The meaning hasn't changed, so one of these must be wrong.

It appears that the hardware documentation is completely wrong.  It
claims that the "API Mode" bit means:

   0h    APIMODE_OGL    NEAR_VP boundary == 0.0 (NDC)
   1h    APIMODE_D3D    NEAR_VP boundary == -1.0 (NDC)

However, DirectX typically uses 0.0 for the near plane, while unextended
OpenGL uses -1.0.  i965's gen6_clip_state.c uses APIMODE_D3D for the
GL_ZERO_TO_ONE case, so I believe the meanings are backwards from what
the documentation says.

Section 23.2 ("Primitive Clipping") of the Vulkan 1.0.21 specification
contains the following equations:

   -w_c <= x_c <= w_c
   -w_c <= y_c <= w_c
      0 <= z_c <= w_c

This means that Vulkan follows D3D semantics.

Cc: "12.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
(cherry picked from commit 0d77f08042b00cff81bebceb7877bc20f80c0965)

src/intel/vulkan/gen7_pipeline.c

index 01c04f3..a50d9c7 100644 (file)
@@ -124,7 +124,7 @@ genX(graphics_pipeline_create)(
       clip.FrontWinding             = vk_to_gen_front_face[rs_info->frontFace],
       clip.CullMode                 = vk_to_gen_cullmode[rs_info->cullMode],
       clip.ClipEnable               = !(extra && extra->use_rectlist),
-      clip.APIMode                  = APIMODE_OGL,
+      clip.APIMode                  = APIMODE_D3D,
       clip.ViewportXYClipTestEnable = true,
       clip.ViewportZClipTestEnable  = !pipeline->depth_clamp_enable,
       clip.ClipMode                 = CLIPMODE_NORMAL,