nvir/gv100: enable support for tu1xx
[mesa.git] / src / gallium / drivers / r600 / r600_blit.c
index c52492e8c2d3b6a2e72a1d8508012d0acf471599..32154b11b7cc93b2c1a882176e303a88f5d094da 100644 (file)
@@ -24,7 +24,7 @@
 #include "compute_memory_pool.h"
 #include "evergreen_compute.h"
 #include "util/u_surface.h"
-#include "util/u_format.h"
+#include "util/format/u_format.h"
 #include "evergreend.h"
 
 enum r600_blitter_op /* bitmask */
@@ -54,6 +54,11 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
 {
        struct r600_context *rctx = (struct r600_context *)ctx;
 
+       if (rctx->cmd_buf_is_compute) {
+               rctx->b.gfx.flush(rctx, PIPE_FLUSH_ASYNC, NULL);
+               rctx->cmd_buf_is_compute = false;
+       }
+
        util_blitter_save_vertex_buffer_slot(rctx->blitter, rctx->vertex_buffer_state.vb);
        util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_fetch_shader.cso);
        util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader);
@@ -291,6 +296,40 @@ void r600_decompress_depth_textures(struct r600_context *rctx,
        }
 }
 
+void r600_decompress_depth_images(struct r600_context *rctx,
+                                 struct r600_image_state *images)
+{
+       unsigned i;
+       unsigned depth_texture_mask = images->compressed_depthtex_mask;
+
+       while (depth_texture_mask) {
+               struct r600_image_view *view;
+               struct r600_texture *tex;
+
+               i = u_bit_scan(&depth_texture_mask);
+
+               view = &images->views[i];
+               assert(view);
+
+               tex = (struct r600_texture *)view->base.resource;
+               assert(tex->db_compatible);
+
+               if (r600_can_sample_zs(tex, false)) {
+                       r600_blit_decompress_depth_in_place(rctx, tex,
+                                                           false,
+                                                           view->base.u.tex.level,
+                                                           view->base.u.tex.level,
+                                                           0, util_max_layer(&tex->resource.b.b, view->base.u.tex.level));
+               } else {
+                       r600_blit_decompress_depth(&rctx->b.b, tex, NULL,
+                                                  view->base.u.tex.level,
+                                                  view->base.u.tex.level,
+                                                  0, util_max_layer(&tex->resource.b.b, view->base.u.tex.level),
+                                                  0, u_max_sample(&tex->resource.b.b));
+               }
+       }
+}
+
 static void r600_blit_decompress_color(struct pipe_context *ctx,
                struct r600_texture *rtex,
                unsigned first_level, unsigned last_level,
@@ -360,6 +399,31 @@ void r600_decompress_color_textures(struct r600_context *rctx,
        }
 }
 
+void r600_decompress_color_images(struct r600_context *rctx,
+                                 struct r600_image_state *images)
+{
+       unsigned i;
+       unsigned mask = images->compressed_colortex_mask;
+
+       while (mask) {
+               struct r600_image_view *view;
+               struct r600_texture *tex;
+
+               i = u_bit_scan(&mask);
+
+               view = &images->views[i];
+               assert(view);
+
+               tex = (struct r600_texture *)view->base.resource;
+               assert(tex->cmask.size);
+
+               r600_blit_decompress_color(&rctx->b.b, tex,
+                                          view->base.u.tex.level, view->base.u.tex.level,
+                                          view->base.u.tex.first_layer,
+                                          view->base.u.tex.last_layer);
+       }
+}
+
 /* Helper for decompressing a portion of a color or depth resource before
  * blitting if any decompression is needed.
  * The driver doesn't decompress resources automatically while u_blitter is
@@ -377,7 +441,7 @@ static bool r600_decompress_subresource(struct pipe_context *ctx,
                        r600_blit_decompress_depth_in_place(rctx, rtex, false,
                                                   level, level,
                                                   first_layer, last_layer);
-                       if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
+                       if (rtex->surface.has_stencil) {
                                r600_blit_decompress_depth_in_place(rctx, rtex, true,
                                                           level, level,
                                                           first_layer, last_layer);
@@ -399,6 +463,7 @@ static bool r600_decompress_subresource(struct pipe_context *ctx,
 }
 
 static void r600_clear(struct pipe_context *ctx, unsigned buffers,
+                      const struct pipe_scissor_state *scissor_state,
                       const union pipe_color_union *color,
                       double depth, unsigned stencil)
 {
@@ -443,8 +508,7 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers,
                 * array are clear to different value. To simplify code just
                 * disable fast clear for texture array.
                 */
-               /* Only use htile for first level */
-               if (rtex->htile_buffer && !level &&
+               if (r600_htile_enabled(rtex, level) &&
                    fb->zsbuf->u.tex.first_layer == 0 &&
                    fb->zsbuf->u.tex.last_layer == util_max_layer(&rtex->resource.b.b, level)) {
                        if (rtex->depth_clear_value != depth) {
@@ -459,7 +523,8 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers,
        r600_blitter_begin(ctx, R600_CLEAR);
        util_blitter_clear(rctx->blitter, fb->width, fb->height,
                           util_framebuffer_get_num_layers(fb),
-                          buffers, color, depth, stencil);
+                          buffers, color, depth, stencil,
+                          util_framebuffer_get_num_samples(fb) > 1);
        r600_blitter_end(ctx);
 
        /* disable fast clear */
@@ -647,7 +712,7 @@ void r600_resource_copy_region(struct pipe_context *ctx,
         src_heightFL = u_minify(src->height0, src_level);
 
        util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstz);
-       util_blitter_default_src_texture(&src_templ, src, src_level);
+       util_blitter_default_src_texture(rctx->blitter, &src_templ, src, src_level);
 
        if (util_format_is_compressed(src->format) ||
            util_format_is_compressed(dst->format)) {