OSDN Git Service

gallium: Add a new clip_halfz rasterizer state.
authorJosé Fonseca <jfonseca@vmware.com>
Sat, 20 Apr 2013 11:24:44 +0000 (12:24 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Mon, 22 Apr 2013 17:39:06 +0000 (18:39 +0100)
gl_rasterization_rules lumps too many different flags.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_llvm.c
src/gallium/auxiliary/draw/draw_pt.h
src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
src/gallium/auxiliary/draw/draw_pt_post_vs.c
src/gallium/docs/source/cso/rasterizer.rst
src/gallium/include/pipe/p_state.h

index 0f98021..5272951 100644 (file)
@@ -712,6 +712,7 @@ draw_get_rasterizer_no_cull( struct draw_context *draw,
       rast.flatshade = flatshade;
       rast.front_ccw = 1;
       rast.gl_rasterization_rules = draw->rasterizer->gl_rasterization_rules;
       rast.flatshade = flatshade;
       rast.front_ccw = 1;
       rast.gl_rasterization_rules = draw->rasterizer->gl_rasterization_rules;
+      rast.clip_halfz = draw->rasterizer->clip_halfz;
 
       draw->rasterizer_no_cull[scissor][flatshade] =
          pipe->create_rasterizer_state(pipe, &rast);
 
       draw->rasterizer_no_cull[scissor][flatshade] =
          pipe->create_rasterizer_state(pipe, &rast);
index e0c0705..e1c08c6 100644 (file)
@@ -1669,7 +1669,7 @@ draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
    key->clip_z = llvm->draw->clip_z;
    key->clip_user = llvm->draw->clip_user;
    key->bypass_viewport = llvm->draw->identity_viewport;
    key->clip_z = llvm->draw->clip_z;
    key->clip_user = llvm->draw->clip_user;
    key->bypass_viewport = llvm->draw->identity_viewport;
-   key->clip_halfz = !llvm->draw->rasterizer->gl_rasterization_rules;
+   key->clip_halfz = llvm->draw->rasterizer->clip_halfz;
    key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE);
    key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable;
    key->has_gs = llvm->draw->gs.geometry_shader != NULL;
    key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE);
    key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable;
    key->has_gs = llvm->draw->gs.geometry_shader != NULL;
index 764d311..dca8368 100644 (file)
@@ -233,7 +233,7 @@ void draw_pt_post_vs_prepare( struct pt_post_vs *pvs,
                              boolean clip_user,
                               boolean guard_band,
                              boolean bypass_viewport,
                              boolean clip_user,
                               boolean guard_band,
                              boolean bypass_viewport,
-                             boolean opengl,
+                              boolean clip_halfz,
                              boolean need_edgeflags );
 
 struct pt_post_vs *draw_pt_post_vs_create( struct draw_context *draw );
                              boolean need_edgeflags );
 
 struct pt_post_vs *draw_pt_post_vs_create( struct draw_context *draw );
index ab32a80..664c594 100644 (file)
@@ -107,17 +107,14 @@ static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle,
                           vs->info.num_inputs,
                           fpme->vertex_size,
                           instance_id_index );
                           vs->info.num_inputs,
                           fpme->vertex_size,
                           instance_id_index );
-   /* XXX: it's not really gl rasterization rules we care about here,
-    * but gl vs dx9 clip spaces.
-    */
    draw_pt_post_vs_prepare( fpme->post_vs,
                            draw->clip_xy,
                            draw->clip_z,
                            draw->clip_user,
                             draw->guard_band_xy,
    draw_pt_post_vs_prepare( fpme->post_vs,
                            draw->clip_xy,
                            draw->clip_z,
                            draw->clip_user,
                             draw->guard_band_xy,
-                           draw->identity_viewport,
-                           (boolean)draw->rasterizer->gl_rasterization_rules,
-                           (draw->vs.edgeflag_output ? TRUE : FALSE) );
+                            draw->identity_viewport,
+                            draw->rasterizer->clip_halfz,
+                            (draw->vs.edgeflag_output ? TRUE : FALSE) );
 
    draw_pt_so_emit_prepare( fpme->so_emit, FALSE );
 
 
    draw_pt_so_emit_prepare( fpme->so_emit, FALSE );
 
index 31bd7ce..7ce845e 100644 (file)
@@ -158,17 +158,14 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
    fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float);
 
 
    fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float);
 
 
-   /* XXX: it's not really gl rasterization rules we care about here,
-    * but gl vs dx9 clip spaces.
-    */
    draw_pt_post_vs_prepare( fpme->post_vs,
                            draw->clip_xy,
                            draw->clip_z,
                            draw->clip_user,
                             draw->guard_band_xy,
    draw_pt_post_vs_prepare( fpme->post_vs,
                            draw->clip_xy,
                            draw->clip_z,
                            draw->clip_user,
                             draw->guard_band_xy,
-                           draw->identity_viewport,
-                           (boolean)draw->rasterizer->gl_rasterization_rules,
-                           (draw->vs.edgeflag_output ? TRUE : FALSE) );
+                            draw->identity_viewport,
+                            draw->rasterizer->clip_halfz,
+                            (draw->vs.edgeflag_output ? TRUE : FALSE) );
 
    draw_pt_so_emit_prepare( fpme->so_emit, gs == NULL );
 
 
    draw_pt_so_emit_prepare( fpme->so_emit, gs == NULL );
 
index a83bb59..0212656 100644 (file)
@@ -127,14 +127,14 @@ void draw_pt_post_vs_prepare( struct pt_post_vs *pvs,
                               boolean clip_user,
                               boolean guard_band,
                              boolean bypass_viewport,
                               boolean clip_user,
                               boolean guard_band,
                              boolean bypass_viewport,
-                             boolean opengl,
+                              boolean clip_halfz,
                              boolean need_edgeflags )
 {
    pvs->flags = 0;
 
    /* This combination not currently tested/in use:
     */
                              boolean need_edgeflags )
 {
    pvs->flags = 0;
 
    /* This combination not currently tested/in use:
     */
-   if (opengl)
+   if (!clip_halfz)
       guard_band = FALSE;
 
    if (clip_xy && !guard_band) {
       guard_band = FALSE;
 
    if (clip_xy && !guard_band) {
@@ -152,14 +152,14 @@ void draw_pt_post_vs_prepare( struct pt_post_vs *pvs,
       ASSIGN_4V( pvs->draw->plane[3],  0,  0.5,  0, 1 );
    }
 
       ASSIGN_4V( pvs->draw->plane[3],  0,  0.5,  0, 1 );
    }
 
-   if (clip_z && opengl) {
-      pvs->flags |= DO_CLIP_FULL_Z;
-      ASSIGN_4V( pvs->draw->plane[4],  0,  0,  1, 1 );
-   }
-
-   if (clip_z && !opengl) {
-      pvs->flags |= DO_CLIP_HALF_Z;
-      ASSIGN_4V( pvs->draw->plane[4],  0,  0,  1, 0 );
+   if (clip_z) {
+      if (clip_halfz) {
+         pvs->flags |= DO_CLIP_HALF_Z;
+         ASSIGN_4V( pvs->draw->plane[4],  0,  0,  1, 0 );
+      } else {
+         pvs->flags |= DO_CLIP_FULL_Z;
+         ASSIGN_4V( pvs->draw->plane[4],  0,  0,  1, 1 );
+      }
    }
 
    if (clip_user)
    }
 
    if (clip_user)
index 8338243..be4bad5 100644 (file)
@@ -242,6 +242,10 @@ gl_rasterization_rules
     Whether the rasterizer should use (0.5, 0.5) pixel centers. When not set,
     the rasterizer will use (0, 0) for pixel centers.
 
     Whether the rasterizer should use (0.5, 0.5) pixel centers. When not set,
     the rasterizer will use (0, 0) for pixel centers.
 
+clip_halfz
+    When true clip space in the z axis goes from [0..1] (D3D).  When false
+    [-1, 1] (GL)
+
 depth_clip
     When false, the near and far depth clipping planes of the view volume are
     disabled and the depth value will be clamped at the per-pixel level, after
 depth_clip
     When false, the near and far depth clipping planes of the view volume are
     disabled and the depth value will be clamped at the per-pixel level, after
index dfafd0b..5da3a53 100644 (file)
@@ -134,6 +134,12 @@ struct pipe_rasterizer_state
    unsigned depth_clip:1;
 
    /**
    unsigned depth_clip:1;
 
    /**
+    * When true clip space in the z axis goes from [0..1] (D3D).  When false
+    * [-1, 1] (GL).
+    */
+   unsigned clip_halfz:1;
+
+   /**
     * Enable bits for clipping half-spaces.
     * This applies to both user clip planes and shader clip distances.
     * Note that if the bound shader exports any clip distances, these
     * Enable bits for clipping half-spaces.
     * This applies to both user clip planes and shader clip distances.
     * Note that if the bound shader exports any clip distances, these