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