From: Marek Olšák <marek.ol...@amd.com>

This will be needed by u_blitter.
---
 src/gallium/drivers/radeon/r600_viewport.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_viewport.c 
b/src/gallium/drivers/radeon/r600_viewport.c
index 2de1382..f7fc536 100644
--- a/src/gallium/drivers/radeon/r600_viewport.c
+++ b/src/gallium/drivers/radeon/r600_viewport.c
@@ -316,50 +316,69 @@ static void r600_emit_viewports(struct 
r600_common_context *rctx)
                u_bit_scan_consecutive_range(&mask, &start, &count);
 
                radeon_set_context_reg_seq(cs, R_02843C_PA_CL_VPORT_XSCALE +
                                               start * 4 * 6, count * 6);
                for (i = start; i < start+count; i++)
                        r600_emit_one_viewport(rctx, &states[i]);
        }
        rctx->viewports.dirty_mask = 0;
 }
 
+static void r600_get_zmin_zmax(const struct pipe_viewport_state *vp,
+                              bool clip_halfz, float *zmin, float *zmax)
+{
+       /* For some reason, setting zmin == zmax breaks things.
+        * Setting zmin = 0 && zmin = 1 works around it.
+        * u_blitter sets scale = 0 && translate = Z to force a certain Z
+        * value. The clamp would have no effect anyway, but it would be nice
+        * to know what the problem is with zmin == zmax.
+        */
+       if (vp->scale[2] == 0) {
+               assert(vp->translate[2] >= 0 && vp->translate[2] <= 1);
+               *zmin = 0;
+               *zmax = 1;
+               return;
+       }
+
+       util_viewport_zmin_zmax(vp, clip_halfz, zmin, zmax);
+}
+
 static void r600_emit_depth_ranges(struct r600_common_context *rctx)
 {
        struct radeon_winsys_cs *cs = rctx->gfx.cs;
        struct pipe_viewport_state *states = rctx->viewports.states;
        unsigned mask = rctx->viewports.depth_range_dirty_mask;
        float zmin, zmax;
 
        /* The simple case: Only 1 viewport is active. */
        if (!rctx->vs_writes_viewport_index) {
                if (!(mask & 1))
                        return;
 
-               util_viewport_zmin_zmax(&states[0], rctx->clip_halfz, &zmin, 
&zmax);
+               r600_get_zmin_zmax(&states[0], rctx->clip_halfz, &zmin, &zmax);
 
                radeon_set_context_reg_seq(cs, R_0282D0_PA_SC_VPORT_ZMIN_0, 2);
                radeon_emit(cs, fui(zmin));
                radeon_emit(cs, fui(zmax));
                rctx->viewports.depth_range_dirty_mask &= ~1; /* clear one bit 
*/
                return;
        }
 
        while (mask) {
                int start, count, i;
 
                u_bit_scan_consecutive_range(&mask, &start, &count);
 
                radeon_set_context_reg_seq(cs, R_0282D0_PA_SC_VPORT_ZMIN_0 +
                                           start * 4 * 2, count * 2);
                for (i = start; i < start+count; i++) {
-                       util_viewport_zmin_zmax(&states[i], rctx->clip_halfz, 
&zmin, &zmax);
+                       r600_get_zmin_zmax(&states[i], rctx->clip_halfz, &zmin, 
&zmax);
                        radeon_emit(cs, fui(zmin));
                        radeon_emit(cs, fui(zmax));
                }
        }
        rctx->viewports.depth_range_dirty_mask = 0;
 }
 
 static void r600_emit_viewport_states(struct r600_common_context *rctx,
                                      struct r600_atom *atom)
 {
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to