gallium: add polygon offset clamp state
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 24 Sep 2011 11:22:29 +0000 (13:22 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 28 Sep 2011 14:28:17 +0000 (16:28 +0200)
This is required for D3D1x and supported by hardware.

src/gallium/auxiliary/draw/draw_pipe_offset.c
src/gallium/auxiliary/util/u_dump_state.c
src/gallium/docs/source/cso/rasterizer.rst
src/gallium/drivers/trace/tr_dump_state.c
src/gallium/include/pipe/p_state.h

index 8afbbfa1569c026ee25dc3ab6e187e18407b0218..3da52b10624ed7345ee9cfc16efb2df7892e1911 100644 (file)
@@ -43,6 +43,7 @@ struct offset_stage {
 
    float scale;
    float units;
+   float clamp;
 };
 
 
@@ -90,6 +91,10 @@ static void do_offset_tri( struct draw_stage *stage,
 
    float zoffset = offset->units + MAX2(dzdx, dzdy) * offset->scale;
 
+   if (offset->clamp)
+      zoffset = (offset->clamp < 0.0f) ? MAX2(zoffset, offset->clamp) :
+                                         MIN2(zoffset, offset->clamp);
+
    /*
     * Note: we're applying the offset and clamping per-vertex.
     * Ideally, the offset is applied per-fragment prior to fragment shading.
@@ -125,6 +130,7 @@ static void offset_first_tri( struct draw_stage *stage,
 
    offset->units = (float) (stage->draw->rasterizer->offset_units * stage->draw->mrd);
    offset->scale = stage->draw->rasterizer->offset_scale;
+   offset->clamp = stage->draw->rasterizer->offset_clamp;
 
    stage->tri = offset_tri;
    stage->tri( stage, header );
index 6bb369966324a1aab510760d7e89604b21cc5a60..8a7ec584846ab8fb090b03749f968ff25523b796 100644 (file)
@@ -332,6 +332,7 @@ util_dump_rasterizer_state(struct os_stream *stream, const struct pipe_rasterize
    util_dump_member(stream, float, state, point_size);
    util_dump_member(stream, float, state, offset_units);
    util_dump_member(stream, float, state, offset_scale);
+   util_dump_member(stream, float, state, offset_clamp);
 
    util_dump_struct_end(stream);
 }
index e10c16ed900eeb1d35ab89606ac530fc59efff07..a3836d9286ade43e9ab6601695ef3ddb23ce5327 100644 (file)
@@ -119,6 +119,8 @@ offset_units
     Specifies the polygon offset bias
 offset_scale
     Specifies the polygon offset scale
+offset_clamp
+    Upper (if > 0) or lower (if < 0) bound on the polygon offset result
 
 
 
index 652ffa7a94bfc1dc0976867a9d9a0ccd829b32c4..cbe4cb6b8c4d286300d90ff3968a8594ca3cbe9a 100644 (file)
@@ -149,6 +149,7 @@ void trace_dump_rasterizer_state(const struct pipe_rasterizer_state *state)
    trace_dump_member(float, state, point_size);
    trace_dump_member(float, state, offset_units);
    trace_dump_member(float, state, offset_scale);
+   trace_dump_member(float, state, offset_clamp);
 
    trace_dump_struct_end();
 }
index 90a856018525fcaa090f613dc35e0b949b0b9dbc..37e0679e15f456b0f61946d281c298f897fd64cc 100644 (file)
@@ -130,6 +130,7 @@ struct pipe_rasterizer_state
    float point_size;           /**< used when no per-vertex size */
    float offset_units;
    float offset_scale;
+   float offset_clamp;
 };