return nouveau_buffer_allocate(screen, buf, domain);
}
-static void
+void
nouveau_buffer_destroy(struct pipe_screen *pscreen,
struct pipe_resource *presource)
{
struct nv04_resource *res = nv04_resource(presource);
+ if (res->status & NOUVEAU_BUFFER_STATUS_USER_PTR) {
+ FREE(res);
+ return;
+ }
+
nouveau_buffer_release_gpu_storage(res);
if (res->data && !(res->status & NOUVEAU_BUFFER_STATUS_USER_MEMORY))
const struct u_resource_vtbl nouveau_buffer_vtbl =
{
- nouveau_buffer_destroy, /* resource_destroy */
+ NULL, /* resource_destroy */
nouveau_buffer_transfer_map, /* transfer_map */
nouveau_buffer_transfer_unmap, /* transfer_unmap */
};
-static void
-nouveau_user_ptr_destroy(struct pipe_screen *pscreen,
- struct pipe_resource *presource)
-{
- struct nv04_resource *res = nv04_resource(presource);
- FREE(res);
-}
-
static void *
nouveau_user_ptr_transfer_map(struct pipe_context *pipe,
struct pipe_resource *resource,
const struct u_resource_vtbl nouveau_user_ptr_buffer_vtbl =
{
- nouveau_user_ptr_destroy, /* resource_destroy */
+ NULL, /* resource_destroy */
nouveau_user_ptr_transfer_map, /* transfer_map */
nouveau_user_ptr_transfer_unmap, /* transfer_unmap */
};
uint32_t offset, uint32_t flags);
void
+nouveau_buffer_destroy(struct pipe_screen *pscreen,
+ struct pipe_resource *presource);
+
+void
nouveau_buffer_transfer_flush_region(struct pipe_context *pipe,
struct pipe_transfer *transfer,
const struct pipe_box *box);
return nouveau_screen_bo_get_handle(pscreen, mt->base.bo, stride, handle);
}
-static void
+void
nv30_miptree_destroy(struct pipe_screen *pscreen, struct pipe_resource *pt)
{
struct nv30_miptree *mt = nv30_miptree(pt);
}
const struct u_resource_vtbl nv30_miptree_vtbl = {
- nv30_miptree_destroy,
+ NULL,
nv30_miptree_transfer_map,
nv30_miptree_transfer_unmap,
};
}
}
+static void
+nv30_resource_destroy(struct pipe_screen *pscreen, struct pipe_resource *res)
+{
+ if (res->target == PIPE_BUFFER)
+ nouveau_buffer_destroy(pscreen, res);
+ else
+ nv30_miptree_destroy(pscreen, res);
+}
+
static struct pipe_resource *
nv30_resource_from_handle(struct pipe_screen *pscreen,
const struct pipe_resource *tmpl,
pscreen->resource_create = nv30_resource_create;
pscreen->resource_from_handle = nv30_resource_from_handle;
pscreen->resource_get_handle = nv30_miptree_get_handle;
- pscreen->resource_destroy = u_resource_destroy_vtbl;
+ pscreen->resource_destroy = nv30_resource_destroy;
}
void
unsigned usage);
void
+nv30_miptree_destroy(struct pipe_screen *pscreen, struct pipe_resource *pt);
+
+void
nv30_resource_copy_region(struct pipe_context *pipe,
struct pipe_resource *dst, unsigned dst_level,
unsigned dstx, unsigned dsty, unsigned dstz,
const struct u_resource_vtbl nv50_miptree_vtbl =
{
- nv50_miptree_destroy, /* resource_destroy */
+ NULL, /* resource_destroy */
nv50_miptree_transfer_map, /* transfer_map */
nv50_miptree_transfer_unmap, /* transfer_unmap */
};
}
}
+static void
+nv50_resource_destroy(struct pipe_screen *pscreen, struct pipe_resource *res)
+{
+ if (res->target == PIPE_BUFFER)
+ nouveau_buffer_destroy(pscreen, res);
+ else
+ nv50_miptree_destroy(pscreen, res);
+}
+
static struct pipe_resource *
nv50_resource_from_handle(struct pipe_screen * screen,
const struct pipe_resource *templ,
pscreen->resource_create = nv50_resource_create;
pscreen->resource_from_handle = nv50_resource_from_handle;
pscreen->resource_get_handle = nv50_miptree_get_handle;
- pscreen->resource_destroy = u_resource_destroy_vtbl;
+ pscreen->resource_destroy = nv50_resource_destroy;
}
const struct u_resource_vtbl nvc0_miptree_vtbl =
{
- nv50_miptree_destroy, /* resource_destroy */
+ NULL, /* resource_destroy */
nvc0_miptree_transfer_map, /* transfer_map */
nvc0_miptree_transfer_unmap, /* transfer_unmap */
};
}
static void
+nvc0_resource_destroy(struct pipe_screen *pscreen, struct pipe_resource *res)
+{
+ if (res->target == PIPE_BUFFER)
+ nouveau_buffer_destroy(pscreen, res);
+ else
+ nv50_miptree_destroy(pscreen, res);
+}
+
+static void
nvc0_query_dmabuf_modifiers(struct pipe_screen *screen,
enum pipe_format format, int max,
uint64_t *modifiers, unsigned int *external_only,
pscreen->is_dmabuf_modifier_supported = nvc0_is_dmabuf_modifier_supported;
pscreen->resource_from_handle = nvc0_resource_from_handle;
pscreen->resource_get_handle = nvc0_miptree_get_handle;
- pscreen->resource_destroy = u_resource_destroy_vtbl;
+ pscreen->resource_destroy = nvc0_resource_destroy;
pscreen->resource_from_user_memory = nvc0_resource_from_user_memory;
}