1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2012-2018 Rob Clark <[email protected]>
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Authors:
6*61046927SAndroid Build Coastguard Worker * Rob Clark <[email protected]>
7*61046927SAndroid Build Coastguard Worker */
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #include <assert.h>
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #include "freedreno_drmif.h"
12*61046927SAndroid Build Coastguard Worker #include "freedreno_priv.h"
13*61046927SAndroid Build Coastguard Worker #include "freedreno_ringbuffer.h"
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker struct fd_submit *
fd_submit_new(struct fd_pipe * pipe)16*61046927SAndroid Build Coastguard Worker fd_submit_new(struct fd_pipe *pipe)
17*61046927SAndroid Build Coastguard Worker {
18*61046927SAndroid Build Coastguard Worker struct fd_submit *submit = pipe->funcs->submit_new(pipe);
19*61046927SAndroid Build Coastguard Worker submit->refcnt = 1;
20*61046927SAndroid Build Coastguard Worker submit->pipe = fd_pipe_ref(pipe);
21*61046927SAndroid Build Coastguard Worker submit->dev = fd_device_ref(pipe->dev);
22*61046927SAndroid Build Coastguard Worker return submit;
23*61046927SAndroid Build Coastguard Worker }
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker void
fd_submit_del(struct fd_submit * submit)26*61046927SAndroid Build Coastguard Worker fd_submit_del(struct fd_submit *submit)
27*61046927SAndroid Build Coastguard Worker {
28*61046927SAndroid Build Coastguard Worker if (!unref(&submit->refcnt))
29*61046927SAndroid Build Coastguard Worker return;
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker if (submit->primary)
32*61046927SAndroid Build Coastguard Worker fd_ringbuffer_del(submit->primary);
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker struct fd_pipe *pipe = submit->pipe;
35*61046927SAndroid Build Coastguard Worker struct fd_device *dev = submit->dev;
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker submit->funcs->destroy(submit);
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker fd_pipe_del(pipe);
40*61046927SAndroid Build Coastguard Worker fd_device_del(dev);
41*61046927SAndroid Build Coastguard Worker }
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker struct fd_submit *
fd_submit_ref(struct fd_submit * submit)44*61046927SAndroid Build Coastguard Worker fd_submit_ref(struct fd_submit *submit)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker ref(&submit->refcnt);
47*61046927SAndroid Build Coastguard Worker return submit;
48*61046927SAndroid Build Coastguard Worker }
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker struct fd_fence *
fd_submit_flush(struct fd_submit * submit,int in_fence_fd,bool use_fence_fd)51*61046927SAndroid Build Coastguard Worker fd_submit_flush(struct fd_submit *submit, int in_fence_fd, bool use_fence_fd)
52*61046927SAndroid Build Coastguard Worker {
53*61046927SAndroid Build Coastguard Worker submit->fence = fd_pipe_emit_fence(submit->pipe, submit->primary);
54*61046927SAndroid Build Coastguard Worker return submit->funcs->flush(submit, in_fence_fd, use_fence_fd);
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker struct fd_ringbuffer *
fd_submit_new_ringbuffer(struct fd_submit * submit,uint32_t size,enum fd_ringbuffer_flags flags)58*61046927SAndroid Build Coastguard Worker fd_submit_new_ringbuffer(struct fd_submit *submit, uint32_t size,
59*61046927SAndroid Build Coastguard Worker enum fd_ringbuffer_flags flags)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker assert(!(flags & _FD_RINGBUFFER_OBJECT));
62*61046927SAndroid Build Coastguard Worker if (flags & FD_RINGBUFFER_STREAMING) {
63*61046927SAndroid Build Coastguard Worker assert(!(flags & FD_RINGBUFFER_GROWABLE));
64*61046927SAndroid Build Coastguard Worker assert(!(flags & FD_RINGBUFFER_PRIMARY));
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker struct fd_ringbuffer *ring =
67*61046927SAndroid Build Coastguard Worker submit->funcs->new_ringbuffer(submit, size, flags);
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker if (flags & FD_RINGBUFFER_PRIMARY) {
70*61046927SAndroid Build Coastguard Worker assert(!submit->primary);
71*61046927SAndroid Build Coastguard Worker submit->primary = fd_ringbuffer_ref(ring);
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker return ring;
75*61046927SAndroid Build Coastguard Worker }
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker struct fd_ringbuffer *
fd_ringbuffer_new_object(struct fd_pipe * pipe,uint32_t size)78*61046927SAndroid Build Coastguard Worker fd_ringbuffer_new_object(struct fd_pipe *pipe, uint32_t size)
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker return pipe->funcs->ringbuffer_new_object(pipe, size);
81*61046927SAndroid Build Coastguard Worker }
82