Exemplo n.º 1
0
static bool si_upload_descriptors(struct si_context *sctx,
                                  struct si_descriptors *desc)
{
    unsigned list_size = desc->num_elements * desc->element_dw_size * 4;
    void *ptr;

    if (!desc->list_dirty)
        return true;

    u_upload_alloc(sctx->b.uploader, 0, list_size,
                   &desc->buffer_offset,
                   (struct pipe_resource**)&desc->buffer, &ptr);
    if (!desc->buffer)
        return false; /* skip the draw call */

    util_memcpy_cpu_to_le32(ptr, desc->list, list_size);

    r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx, desc->buffer,
                          RADEON_USAGE_READ, RADEON_PRIO_SHADER_DATA);

    desc->list_dirty = false;
    desc->pointer_dirty = true;
    si_mark_atom_dirty(sctx, &sctx->shader_userdata.atom);
    return true;
}
Exemplo n.º 2
0
void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuffer,
                            const uint8_t *ptr, unsigned size, uint32_t *const_offset)
{
    void *tmp;

    u_upload_alloc(sctx->b.uploader, 0, size, const_offset,
                   (struct pipe_resource**)rbuffer, &tmp);
    util_memcpy_cpu_to_le32(tmp, ptr, size);
}
Exemplo n.º 3
0
static bool si_upload_descriptors(struct si_context *sctx,
				  struct si_descriptors *desc,
				  struct r600_atom * atom)
{
	unsigned list_size = desc->num_elements * desc->element_dw_size * 4;

	if (!desc->dirty_mask)
		return true;

	if (sctx->ce_ib) {
		uint32_t const* list = (uint32_t const*)desc->list;

		if (desc->ce_ram_dirty)
			si_reinitialize_ce_ram(sctx, desc);

		while(desc->dirty_mask) {
			int begin, count;
			u_bit_scan_consecutive_range(&desc->dirty_mask, &begin,
						     &count);

			begin *= desc->element_dw_size;
			count *= desc->element_dw_size;

			radeon_emit(sctx->ce_ib,
			            PKT3(PKT3_WRITE_CONST_RAM, count, 0));
			radeon_emit(sctx->ce_ib, desc->ce_offset + begin * 4);
			radeon_emit_array(sctx->ce_ib, list + begin, count);
		}

		if (!si_ce_upload(sctx, desc->ce_offset, list_size,
		                           &desc->buffer_offset, &desc->buffer))
			return false;
	} else {
		void *ptr;

		u_upload_alloc(sctx->b.uploader, 0, list_size, 256,
			&desc->buffer_offset,
			(struct pipe_resource**)&desc->buffer, &ptr);
		if (!desc->buffer)
			return false; /* skip the draw call */

		util_memcpy_cpu_to_le32(ptr, desc->list, list_size);

		radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx, desc->buffer,
	                            RADEON_USAGE_READ, RADEON_PRIO_DESCRIPTORS);
	}
	desc->pointer_dirty = true;
	desc->dirty_mask = 0;

	if (atom)
		si_mark_atom_dirty(sctx, atom);

	return true;
}