gallium/radeon: handle vertex shaders that disable clipping & viewport
authorMarek Olšák <marek.olsak@amd.com>
Wed, 13 Apr 2016 15:28:30 +0000 (17:28 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 15 Apr 2016 22:21:15 +0000 (00:21 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeon/r600_viewport.c

index a6abe09d438427c1928db2c7b729da77a57c3770..b23a780f803043a7474a2dd1846afae6c3dd82df 100644 (file)
@@ -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 */
index ea558cd22de6d06f3ae4a7884df65c6077add127..980c5ef17e652620b342015aed03ea20626a25b0 100644 (file)
@@ -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;