예제 #1
0
/* 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
 * rendering. */
static bool r600_decompress_subresource(struct pipe_context *ctx,
					struct pipe_resource *tex,
					unsigned level,
					unsigned first_layer, unsigned last_layer)
{
	struct r600_context *rctx = (struct r600_context *)ctx;
	struct r600_texture *rtex = (struct r600_texture*)tex;

	if (rtex->is_depth && !rtex->is_flushing_texture) {
		if (rctx->b.chip_class >= EVERGREEN ||
		    r600_can_read_depth(rtex)) {
			r600_blit_decompress_depth_in_place(rctx, rtex, false,
						   level, level,
						   first_layer, last_layer);
			if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
				r600_blit_decompress_depth_in_place(rctx, rtex, true,
							   level, level,
							   first_layer, last_layer);
			}
		} else {
			if (!r600_init_flushed_depth_texture(ctx, tex, NULL))
				return false; /* error */

			r600_blit_decompress_depth(ctx, rtex, NULL,
						   level, level,
						   first_layer, last_layer,
						   0, u_max_sample(tex));
		}
	} else if (rtex->cmask.size) {
		r600_blit_decompress_color(ctx, rtex, level, level,
					   first_layer, last_layer);
	}
	return true;
}
예제 #2
0
파일: r600_blit.c 프로젝트: iquiw/xsrc
void r600_decompress_depth_textures(struct r600_context *rctx,
			       struct r600_samplerview_state *textures)
{
	unsigned i;
	unsigned depth_texture_mask = textures->compressed_depthtex_mask;

	while (depth_texture_mask) {
		struct pipe_sampler_view *view;
		struct r600_texture *tex;

		i = u_bit_scan(&depth_texture_mask);

		view = &textures->views[i]->base;
		assert(view);

		tex = (struct r600_texture *)view->texture;
		assert(tex->is_depth && !tex->is_flushing_texture);

		if (rctx->b.chip_class >= EVERGREEN ||
		    r600_can_read_depth(tex)) {
			r600_blit_decompress_depth_in_place(rctx, tex,
						   view->u.tex.first_level, view->u.tex.last_level,
						   0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level));
		} else {
			r600_blit_decompress_depth(&rctx->b.b, tex, NULL,
						   view->u.tex.first_level, view->u.tex.last_level,
						   0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level),
						   0, u_max_sample(&tex->resource.b.b));
		}
	}
}
예제 #3
0
파일: r600_blit.c 프로젝트: Kalamatee/mesa
void r600_decompress_depth_textures(struct r600_context *rctx,
                                    struct r600_samplerview_state *textures)
{
    unsigned i;
    unsigned depth_texture_mask = textures->compressed_depthtex_mask;

    while (depth_texture_mask) {
        struct pipe_sampler_view *view;
        struct r600_pipe_sampler_view *rview;
        struct r600_texture *tex;

        i = u_bit_scan(&depth_texture_mask);

        view = &textures->views[i]->base;
        assert(view);
        rview = (struct r600_pipe_sampler_view*)view;

        tex = (struct r600_texture *)view->texture;
        assert(tex->db_compatible);

        if (r600_can_sample_zs(tex, rview->is_stencil_sampler)) {
            r600_blit_decompress_depth_in_place(rctx, tex,
                                                rview->is_stencil_sampler,
                                                view->u.tex.first_level, view->u.tex.last_level,
                                                0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level));
        } else {
            r600_blit_decompress_depth(&rctx->b.b, tex, NULL,
                                       view->u.tex.first_level, view->u.tex.last_level,
                                       0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level),
                                       0, u_max_sample(&tex->resource.b.b));
        }
    }
}