client-node: move to per node memory

Remove the per-port memory and only use per-node memory. This will
make it possible to share memory between ports in the future.
Keep refs to memory on the buffers and free (close) the memory
when no longer used.
This commit is contained in:
Wim Taymans 2017-12-01 17:24:03 +01:00
parent 4019da39c1
commit c1aa3b4625
6 changed files with 218 additions and 199 deletions

View file

@ -68,8 +68,6 @@ struct buffer {
struct spa_buffer buffer;
struct spa_meta metas[4];
struct spa_data datas[4];
off_t offset;
size_t size;
bool outstanding;
};
@ -540,11 +538,10 @@ spa_proxy_node_port_set_io(struct spa_node *node,
if ((mem = pw_memblock_find(data)) == NULL)
return -EINVAL;
pw_client_node_resource_port_add_mem(this->resource,
direction, port_id,
memid,
t->data.MemFd,
mem->fd, mem->flags);
pw_client_node_resource_add_mem(this->resource,
memid,
t->data.MemFd,
mem->fd, mem->flags);
pw_client_node_resource_port_set_io(this->resource,
this->seq,
@ -567,7 +564,6 @@ spa_proxy_node_port_use_buffers(struct spa_node *node,
struct impl *impl;
struct port *port;
uint32_t i, j;
size_t n_mem;
struct pw_client_node_buffer *mb;
struct pw_type *t;
@ -598,11 +594,10 @@ spa_proxy_node_port_use_buffers(struct spa_node *node,
if (this->resource == NULL)
return 0;
n_mem = this->membase;
for (i = 0; i < n_buffers; i++) {
struct buffer *b = &port->buffers[i];
struct pw_memblock *m;
size_t data_size;
size_t data_size, size;
void *baseptr;
b->outbuf = buffers[i];
@ -632,21 +627,20 @@ spa_proxy_node_port_use_buffers(struct spa_node *node,
}
mb[i].buffer = &b->buffer;
mb[i].mem_id = n_mem++;
mb[i].mem_id = this->membase++;
mb[i].offset = SPA_PTRDIFF(baseptr, m->ptr + m->offset);
mb[i].size = data_size;
pw_client_node_resource_port_add_mem(this->resource,
direction,
port_id,
mb[i].mem_id,
t->data.MemFd,
m->fd, m->flags);
pw_client_node_resource_add_mem(this->resource,
mb[i].mem_id,
t->data.MemFd,
m->fd, m->flags);
for (j = 0; j < buffers[i]->n_metas; j++)
memcpy(&b->buffer.metas[j], &buffers[i]->metas[j], sizeof(struct spa_meta));
b->buffer.n_metas = j;
size = 0;
for (j = 0; j < buffers[i]->n_datas; j++) {
struct spa_data *d = &buffers[i]->datas[j];
@ -654,18 +648,16 @@ spa_proxy_node_port_use_buffers(struct spa_node *node,
if (d->type == t->data.DmaBuf ||
d->type == t->data.MemFd) {
pw_client_node_resource_port_add_mem(this->resource,
direction,
port_id,
n_mem,
d->type,
d->fd,
d->flags);
b->buffer.datas[j].data = SPA_UINT32_TO_PTR(n_mem);
n_mem++;
pw_client_node_resource_add_mem(this->resource,
this->membase,
d->type,
d->fd,
d->flags);
b->buffer.datas[j].data = SPA_UINT32_TO_PTR(this->membase);
this->membase++;
} else if (d->type == t->data.MemPtr) {
b->buffer.datas[j].data = SPA_INT_TO_PTR(b->size);
b->size += d->maxsize;
b->buffer.datas[j].data = SPA_INT_TO_PTR(size);
size += d->maxsize;
} else {
b->buffer.datas[j].type = SPA_ID_INVALID;
b->buffer.datas[j].data = 0;