Пример #1
0
static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
			      unsigned offset, unsigned size, unsigned value)
{
	struct r600_context *rctx = (struct r600_context*)ctx;

	if (rctx->screen->b.has_cp_dma &&
	    rctx->b.chip_class >= EVERGREEN &&
	    offset % 4 == 0 && size % 4 == 0) {
		evergreen_cp_dma_clear_buffer(rctx, dst, offset, size, value);
	} else if (rctx->screen->b.has_streamout && offset % 4 == 0 && size % 4 == 0) {
		union pipe_color_union clear_value;
		clear_value.ui[0] = value;

		r600_blitter_begin(ctx, R600_DISABLE_RENDER_COND);
		util_blitter_clear_buffer(rctx->blitter, dst, offset, size,
					  1, &clear_value);
		r600_blitter_end(ctx);
	} else {
		uint32_t *map = r600_buffer_map_sync_with_rings(&rctx->b, r600_resource(dst),
								 PIPE_TRANSFER_WRITE);
		size /= 4;
		for (unsigned i = 0; i < size; i++)
			*map++ = value;
	}
}
Пример #2
0
static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
			      unsigned offset, unsigned size, unsigned char value)
{
	struct r600_context *rctx = (struct r600_context*)ctx;
	uint32_t v = value;

	if (rctx->screen->has_cp_dma &&
	    rctx->b.chip_class >= EVERGREEN &&
	    offset % 4 == 0 && size % 4 == 0) {
		uint32_t clear_value = v | (v << 8) | (v << 16) | (v << 24);

		evergreen_cp_dma_clear_buffer(rctx, dst, offset, size, clear_value);
	} else if (rctx->screen->has_streamout && offset % 4 == 0 && size % 4 == 0) {
		union pipe_color_union clear_value;

		clear_value.ui[0] = v | (v << 8) | (v << 16) | (v << 24);

		r600_flag_resource_cache_flush(rctx, dst);

		r600_blitter_begin(ctx, R600_DISABLE_RENDER_COND);
		util_blitter_clear_buffer(rctx->blitter, dst, offset, size,
					  1, &clear_value);
		r600_blitter_end(ctx);

		/* Flush again in case the 3D engine has been prefetching the resource. */
		r600_flag_resource_cache_flush(rctx, dst);
	} else {
		char *map = r600_buffer_mmap_sync_with_rings(rctx, r600_resource(dst),
							     PIPE_TRANSFER_WRITE);
		memset(map + offset, value, size);
	}
}