xref: /aosp_15_r20/external/mesa3d/src/freedreno/drm/freedreno_ringbuffer.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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