xref: /rockchip-linux_mpp/doc/design/3.mpp_buffer.txt (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisakaMpp buffer design (2016.10.12)
2*437bfbebSnyanmisaka================================================================================
3*437bfbebSnyanmisaka
4*437bfbebSnyanmisakaMpp buffer is the warpper of the buffer used by hardware. Hardware usually can
5*437bfbebSnyanmisakanot use the buffer malloc by cpu. Then we design MppBuffer for different memory
6*437bfbebSnyanmisakaallocator on different platform. Currently it is designed for ion buffer on
7*437bfbebSnyanmisakaAndroid and drm buffer on Linux. Later may support vb2_buffer in v4l2 devices.
8*437bfbebSnyanmisaka
9*437bfbebSnyanmisakaIn order to manage buffer usage in different user mpp buffer module introduces
10*437bfbebSnyanmisakaMppBufferGroup as bufffer manager. All MppBuffer will connect to its manager.
11*437bfbebSnyanmisakaMppBufferGroup provides allocator service and buffer reuse ability.
12*437bfbebSnyanmisaka
13*437bfbebSnyanmisakaDifferent MppBufferGroup has different allocator. And besides normal malloc/free
14*437bfbebSnyanmisakafunction the allocator can also accept buffer from external file descriptor.
15*437bfbebSnyanmisaka
16*437bfbebSnyanmisakaMppBufferGroup has two lists, unused buffer list and used buffer list. When
17*437bfbebSnyanmisakabuffer is free buffer will not be released immediately. Buffer will be moved to
18*437bfbebSnyanmisakaunused list for later reuse. There is a good reason for doing so. When video
19*437bfbebSnyanmisakaresolution comes to 4K the buffer size will be above 12M. It will take a long
20*437bfbebSnyanmisakatime to allocate buffer and generate map table for it. So reusing the buffer
21*437bfbebSnyanmisakawill save the allocate/free time.
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisakaHere is the diagram of Mpp buffer status transaction.
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka            +----------+     +---------+
26*437bfbebSnyanmisaka            |  create  |     |  commit |
27*437bfbebSnyanmisaka            +-----+----+     +----+----+
28*437bfbebSnyanmisaka                  |               |
29*437bfbebSnyanmisaka                  |               |
30*437bfbebSnyanmisaka                  |          +----v----+
31*437bfbebSnyanmisaka                  +----------+ unused  <-----------+
32*437bfbebSnyanmisaka                  |          +---------+           |
33*437bfbebSnyanmisaka                  |          |         |           |
34*437bfbebSnyanmisaka                  |          |         |           |
35*437bfbebSnyanmisaka            +-----v----+     |         |     +-----+----+
36*437bfbebSnyanmisaka            |  malloc  |     |         |     |   free   |
37*437bfbebSnyanmisaka            +----------+     |         |     +----------+
38*437bfbebSnyanmisaka            | inc_ref  |     +---------+     |  dec_ref |
39*437bfbebSnyanmisaka            +-----+----+                     +-----^----+
40*437bfbebSnyanmisaka                  |                                |
41*437bfbebSnyanmisaka                  |                                |
42*437bfbebSnyanmisaka                  |          +---------+           |
43*437bfbebSnyanmisaka                  +---------->  used   +-----------+
44*437bfbebSnyanmisaka                             +---------+
45*437bfbebSnyanmisaka                             |         |
46*437bfbebSnyanmisaka                             |         |
47*437bfbebSnyanmisaka                             |         |
48*437bfbebSnyanmisaka                             |         |
49*437bfbebSnyanmisaka                             |         |
50*437bfbebSnyanmisaka                             +----^----+
51*437bfbebSnyanmisaka                                  |
52*437bfbebSnyanmisaka                                  |
53*437bfbebSnyanmisaka                             +----+----+
54*437bfbebSnyanmisaka                             | import  |
55*437bfbebSnyanmisaka                             +---------+
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka
58