static struct pipe_texture * nouveau_drm_pt_from_name(struct drm_api *api, struct pipe_screen *pscreen, struct pipe_texture *templ, const char *name, unsigned stride, unsigned handle) { struct nouveau_device *dev = nouveau_screen(pscreen)->device; struct pipe_texture *pt; struct pipe_buffer *pb; int ret; pb = CALLOC(1, sizeof(struct pipe_buffer) + sizeof(struct nouveau_bo*)); if (!pb) return NULL; ret = nouveau_bo_handle_ref(dev, handle, (struct nouveau_bo**)(pb+1)); if (ret) { debug_printf("%s: ref name 0x%08x failed with %d\n", __func__, handle, ret); FREE(pb); return NULL; } pipe_reference_init(&pb->reference, 1); pb->screen = pscreen; pb->alignment = 0; pb->usage = PIPE_BUFFER_USAGE_GPU_READ_WRITE | PIPE_BUFFER_USAGE_CPU_READ_WRITE; pb->size = nouveau_bo(pb)->size; pt = pscreen->texture_blanket(pscreen, templ, &stride, pb); pipe_buffer_reference(&pb, NULL); return pt; }
static void * init(DRI2Buffer *dri2buf) { struct nouveau_bo *bo = NULL; int ret = nouveau_bo_handle_ref(dev, dri2buf->name, &bo); if (ret) { ERROR_MSG("nouveau_bo_handle_ref failed: %d", ret); return NULL; } return bo; }
struct nouveau_bo * nouveau_screen_bo_from_handle(struct pipe_screen *pscreen, struct winsys_handle *whandle, unsigned *out_stride) { struct nouveau_device *dev = nouveau_screen(pscreen)->device; struct nouveau_bo *bo = 0; int ret; ret = nouveau_bo_handle_ref(dev, whandle->handle, &bo); if (ret) { debug_printf("%s: ref name 0x%08x failed with %d\n", __FUNCTION__, whandle->handle, ret); return NULL; } *out_stride = whandle->stride; return bo; }