Example #1
0
static void
fd_resource_transfer_unmap(struct pipe_context *pctx,
		struct pipe_transfer *ptrans)
{
	struct fd_context *ctx = fd_context(pctx);
	struct fd_resource *rsc = fd_resource(ptrans->resource);
	struct fd_transfer *trans = fd_transfer(ptrans);

	if (trans->staging && !(ptrans->usage & PIPE_TRANSFER_FLUSH_EXPLICIT)) {
		struct pipe_box box;
		u_box_2d(0, 0, ptrans->box.width, ptrans->box.height, &box);
		fd_resource_flush(trans, &box);
	}

	if (!(ptrans->usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
		fd_bo_cpu_fini(rsc->bo);
		if (rsc->stencil)
			fd_bo_cpu_fini(rsc->stencil->bo);
	}

	util_range_add(&rsc->valid_buffer_range,
				   ptrans->box.x,
				   ptrans->box.x + ptrans->box.width);

	pipe_resource_reference(&ptrans->resource, NULL);
	util_slab_free(&ctx->transfer_pool, ptrans);

	free(trans->staging);
}
static void
fd_resource_transfer_unmap(struct pipe_context *pctx,
		struct pipe_transfer *ptrans)
{
	struct fd_context *ctx = fd_context(pctx);
	struct fd_resource *rsc = fd_resource(ptrans->resource);
	if (!(ptrans->usage & PIPE_TRANSFER_UNSYNCHRONIZED))
		fd_bo_cpu_fini(rsc->bo);
	pipe_resource_reference(&ptrans->resource, NULL);
	util_slab_free(&ctx->transfer_pool, ptrans);
}
Example #3
0
int main(int argc, char *argv[])
{
	struct fd_device *dev;
	struct fd_pipe *pipe;
	struct fd_ringbuffer *ring;
	struct fd_bo *bo;
	uint32_t i = 0;
	uint32_t *ptr;
	int fd, ret;

	fd = drmOpen("msm", NULL);
	if (fd < 0) {
		printf("failed to initialize DRM\n");
		return fd;
	}

	dev = fd_device_new(fd);
	if (!dev) {
		printf("failed to initialize freedreno device\n");
		return -1;
	}

	pipe = fd_pipe_new(dev, FD_PIPE_3D);
	if (!pipe) {
		printf("failed to initialize freedreno pipe\n");
		return -1;
	}

	ring = fd_ringbuffer_new(pipe, 4096);
	if (!ring) {
		printf("failed to initialize freedreno ring\n");
		return -1;
	}

	bo = fd_bo_new(dev, 4096, 0);

#define BASE REG_A3XX_GRAS_CL_VPORT_XOFFSET
#define SIZE 6

	OUT_PKT0(ring, REG_AXXX_CP_SCRATCH_REG4, 1);
	OUT_RING(ring, 0x123);

	OUT_PKT0(ring, BASE, SIZE);
	for (i = 0; i < SIZE; i++)
		OUT_RING(ring, i);

	/* this adds the value of CP_SCRATCH_REG4 to 0x111 and writes
	 * to REG_BASE+2
	 */
	OUT_PKT3(ring, CP_SET_CONSTANT, 3);
	OUT_RING(ring, 0x80000000 | CP_REG(BASE + 2));
	OUT_RING(ring, REG_AXXX_CP_SCRATCH_REG4);
	OUT_RING(ring, 0x111);

	/* read back all the regs: */
	for (i = 0; i < SIZE; i++) {
		OUT_PKT3(ring, CP_REG_TO_MEM, 2);
		OUT_RING(ring, BASE + i);
		OUT_RELOCW(ring, bo, i * 4, 0, 0);
	}

	fd_ringbuffer_flush(ring);

	/* and read back the values: */
	fd_bo_cpu_prep(bo, pipe, DRM_FREEDRENO_PREP_READ);
	ptr = fd_bo_map(bo);
	for (i = 0; i < SIZE; i++) {
		printf("%02x: %08x\n", i, ptr[i]);
	}
	fd_bo_cpu_fini(bo);

	return 0;
}