示例#1
0
struct vc4_bo *
vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
                          struct winsys_handle *whandle,
                          unsigned *out_stride)
{
        struct vc4_screen *screen = vc4_screen(pscreen);
        struct vc4_bo *bo;

        if (whandle->type != DRM_API_HANDLE_TYPE_SHARED) {
                fprintf(stderr,
                        "Attempt to import unsupported handle type %d\n",
                        whandle->type);
                return NULL;
        }

        bo = vc4_bo_open_name(screen, whandle->handle, whandle->stride);
        if (!bo) {
                fprintf(stderr, "Open name %d failed\n", whandle->handle);
                return NULL;
        }

        *out_stride = whandle->stride;

        return bo;
}
示例#2
0
struct pipe_context *
vc4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
{
    struct vc4_screen *screen = vc4_screen(pscreen);
    struct vc4_context *vc4;

    /* Prevent dumping of the shaders built during context setup. */
    uint32_t saved_shaderdb_flag = vc4_debug & VC4_DEBUG_SHADERDB;
    vc4_debug &= ~VC4_DEBUG_SHADERDB;

    vc4 = rzalloc(NULL, struct vc4_context);
    if (!vc4)
        return NULL;
    struct pipe_context *pctx = &vc4->base;

    vc4->screen = screen;

    pctx->screen = pscreen;
    pctx->priv = priv;
    pctx->destroy = vc4_context_destroy;
    pctx->flush = vc4_pipe_flush;
    pctx->invalidate_resource = vc4_invalidate_resource;

    vc4_draw_init(pctx);
    vc4_state_init(pctx);
    vc4_program_init(pctx);
    vc4_query_init(pctx);
    vc4_resource_context_init(pctx);

    vc4_job_init(vc4);

    vc4->fd = screen->fd;

    util_slab_create(&vc4->transfer_pool, sizeof(struct vc4_transfer),
                     16, UTIL_SLAB_SINGLETHREADED);
    vc4->blitter = util_blitter_create(pctx);
    if (!vc4->blitter)
        goto fail;

    vc4->primconvert = util_primconvert_create(pctx,
                       (1 << PIPE_PRIM_QUADS) - 1);
    if (!vc4->primconvert)
        goto fail;

    vc4->uploader = u_upload_create(pctx, 16 * 1024,
                                    PIPE_BIND_INDEX_BUFFER,
                                    PIPE_USAGE_STREAM);

    vc4_debug |= saved_shaderdb_flag;

    vc4->sample_mask = (1 << VC4_MAX_SAMPLES) - 1;

    return &vc4->base;

fail:
    pctx->destroy(pctx);
    return NULL;
}
示例#3
0
struct pipe_context *
vc4_context_create(struct pipe_screen *pscreen, void *priv)
{
        struct vc4_screen *screen = vc4_screen(pscreen);
        struct vc4_context *vc4;

        /* Prevent dumping of the shaders built during context setup. */
        uint32_t saved_shaderdb_flag = vc4_debug & VC4_DEBUG_SHADERDB;
        vc4_debug &= ~VC4_DEBUG_SHADERDB;

        vc4 = rzalloc(NULL, struct vc4_context);
        if (vc4 == NULL)
                return NULL;
        struct pipe_context *pctx = &vc4->base;

        vc4->screen = screen;

        pctx->screen = pscreen;
        pctx->priv = priv;
        pctx->destroy = vc4_context_destroy;
        pctx->flush = vc4_pipe_flush;

        vc4_draw_init(pctx);
        vc4_state_init(pctx);
        vc4_program_init(pctx);
        vc4_query_init(pctx);
        vc4_resource_context_init(pctx);

        vc4_init_cl(vc4, &vc4->bcl);
        vc4_init_cl(vc4, &vc4->rcl);
        vc4_init_cl(vc4, &vc4->shader_rec);
        vc4_init_cl(vc4, &vc4->bo_handles);

        vc4->dirty = ~0;
        vc4->fd = screen->fd;

        util_slab_create(&vc4->transfer_pool, sizeof(struct vc4_transfer),
                         16, UTIL_SLAB_SINGLETHREADED);
        vc4->blitter = util_blitter_create(pctx);
        if (!vc4->blitter)
                goto fail;

        vc4->primconvert = util_primconvert_create(pctx,
                                                   (1 << PIPE_PRIM_QUADS) - 1);
        if (!vc4->primconvert)
                goto fail;

        vc4_debug |= saved_shaderdb_flag;

        return &vc4->base;

fail:
        pctx->destroy(pctx);
        return NULL;
}
示例#4
0
static boolean
vc4_fence_finish(struct pipe_screen *pscreen,
		 struct pipe_context *ctx,
                 struct pipe_fence_handle *pf,
                 uint64_t timeout_ns)
{
        struct vc4_screen *screen = vc4_screen(pscreen);
        struct vc4_fence *f = (struct vc4_fence *)pf;

        return vc4_wait_seqno(screen, f->seqno, timeout_ns, "fence wait");
}
static void
vc4_resource_bo_alloc(struct vc4_resource *rsc)
{
    struct pipe_resource *prsc = &rsc->base.b;
    struct pipe_screen *pscreen = prsc->screen;

    vc4_bo_unreference(&rsc->bo);
    rsc->bo = vc4_bo_alloc(vc4_screen(pscreen),
                           rsc->slices[0].offset +
                           rsc->slices[0].size +
                           rsc->cube_map_stride * (prsc->array_size - 1),
                           "resource");
}
struct vc4_bo *
vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
                          struct winsys_handle *whandle)
{
        struct vc4_screen *screen = vc4_screen(pscreen);

        switch (whandle->type) {
        case DRM_API_HANDLE_TYPE_SHARED:
                return vc4_bo_open_name(screen, whandle->handle, whandle->stride);
        case DRM_API_HANDLE_TYPE_FD:
                return vc4_bo_open_dmabuf(screen, whandle->handle, whandle->stride);
        default:
                fprintf(stderr,
                        "Attempt to import unsupported handle type %d\n",
                        whandle->type);
                return NULL;
        }
}