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