The patch seems unneeded, as a lot of nine apps with the disabled clipping behaviour are working fine.

It seems the bug is with the scissor bound computation:
for power of two RT, nine is removing a small offset to the viewport for radeon to workaround a raterizer
precision bug.

The scissor computation does convert to lowest (float->int), and for example an 1x1 RT gets a 0x0 scissor.
Thus the bug is the scissor computation

On 13/04/2016 17:37, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

This should fix Nine.
---
  src/gallium/drivers/radeon/r600_pipe_common.h |  1 +
  src/gallium/drivers/radeon/r600_viewport.c    | 20 +++++++++++++++++++-
  2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h 
b/src/gallium/drivers/radeon/r600_pipe_common.h
index a6abe09..b23a780 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -455,6 +455,7 @@ struct r600_common_context {
        struct r600_viewports           viewports;
        bool                            scissor_enabled;
        bool                            vs_writes_viewport_index;
+       bool                            vs_disables_clipping_viewport;
/* Additional context states. */
        unsigned flags; /* flush flags */
diff --git a/src/gallium/drivers/radeon/r600_viewport.c 
b/src/gallium/drivers/radeon/r600_viewport.c
index ea558cd..980c5ef 100644
--- a/src/gallium/drivers/radeon/r600_viewport.c
+++ b/src/gallium/drivers/radeon/r600_viewport.c
@@ -130,7 +130,12 @@ static void r600_emit_one_scissor(struct 
r600_common_context *rctx,
  {
        struct pipe_scissor_state final;
- r600_clamp_scissor(rctx, &final, vp_scissor);
+       if (rctx->vs_disables_clipping_viewport) {
+               final.minx = final.miny = 0;
+               final.maxx = final.maxy = GET_MAX_SCISSOR(rctx);
+       } else {
+               r600_clamp_scissor(rctx, &final, vp_scissor);
+       }
if (scissor)
                r600_clip_scissor(&final, scissor);
@@ -324,9 +329,22 @@ void r600_set_scissor_enable(struct r600_common_context 
*rctx, bool enable)
  void r600_update_vs_writes_viewport_index(struct r600_common_context *rctx,
                                          struct tgsi_shader_info *info)
  {
+       bool vs_window_space;
+
        if (!info)
                return;
+ /* When the VS disables clipping and viewport transformation. */
+       vs_window_space =
+               info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION];
+
+       if (rctx->vs_disables_clipping_viewport != vs_window_space) {
+               rctx->vs_disables_clipping_viewport = vs_window_space;
+               rctx->scissors.dirty_mask = (1 << R600_MAX_VIEWPORTS) - 1;
+               rctx->set_atom_dirty(rctx, &rctx->scissors.atom, true);
+       }
+
+       /* Viewport index handling. */
        rctx->vs_writes_viewport_index = info->writes_viewport_index;
        if (!rctx->vs_writes_viewport_index)
                return;

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

Reply via email to