xref: /aosp_15_r20/external/mesa3d/src/mesa/vbo/vbo_save.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker 
3*61046927SAndroid Build Coastguard Worker Copyright 2002 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker 
5*61046927SAndroid Build Coastguard Worker All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker copy of this software and associated documentation files (the "Software"),
9*61046927SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
10*61046927SAndroid Build Coastguard Worker on the rights to use, copy, modify, merge, publish, distribute, sub
11*61046927SAndroid Build Coastguard Worker license, and/or sell copies of the Software, and to permit persons to whom
12*61046927SAndroid Build Coastguard Worker the Software is furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker The above copyright notice and this permission notice (including the next
15*61046927SAndroid Build Coastguard Worker paragraph) shall be included in all copies or substantial portions of the
16*61046927SAndroid Build Coastguard Worker Software.
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*61046927SAndroid Build Coastguard Worker IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*61046927SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21*61046927SAndroid Build Coastguard Worker VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22*61046927SAndroid Build Coastguard Worker DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23*61046927SAndroid Build Coastguard Worker OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24*61046927SAndroid Build Coastguard Worker USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker /*
29*61046927SAndroid Build Coastguard Worker  * Authors:
30*61046927SAndroid Build Coastguard Worker  *   Keith Whitwell <[email protected]>
31*61046927SAndroid Build Coastguard Worker  *
32*61046927SAndroid Build Coastguard Worker  */
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #ifndef VBO_SAVE_H
35*61046927SAndroid Build Coastguard Worker #define VBO_SAVE_H
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker #include "mesa/main/dlist.h"
38*61046927SAndroid Build Coastguard Worker #include "vbo.h"
39*61046927SAndroid Build Coastguard Worker #include "vbo_attrib.h"
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker /* For display lists, this structure holds a run of vertices of the
42*61046927SAndroid Build Coastguard Worker  * same format, and a strictly well-formed set of begin/end pairs,
43*61046927SAndroid Build Coastguard Worker  * starting on the first vertex and ending at the last.  Vertex
44*61046927SAndroid Build Coastguard Worker  * copying on buffer breaks is precomputed according to these
45*61046927SAndroid Build Coastguard Worker  * primitives, though there are situations where the copying will need
46*61046927SAndroid Build Coastguard Worker  * correction at execute-time, perhaps by replaying the list as
47*61046927SAndroid Build Coastguard Worker  * immediate mode commands.
48*61046927SAndroid Build Coastguard Worker  *
49*61046927SAndroid Build Coastguard Worker  * On executing this list, the 'current' values may be updated with
50*61046927SAndroid Build Coastguard Worker  * the values of the final vertex, and often no fixup of the start of
51*61046927SAndroid Build Coastguard Worker  * the vertex list is required.
52*61046927SAndroid Build Coastguard Worker  *
53*61046927SAndroid Build Coastguard Worker  * Eval and other commands that don't fit into these vertex lists are
54*61046927SAndroid Build Coastguard Worker  * compiled using the fallback opcode mechanism provided by dlist.c.
55*61046927SAndroid Build Coastguard Worker  */
56*61046927SAndroid Build Coastguard Worker struct vbo_save_vertex_list {
57*61046927SAndroid Build Coastguard Worker    union gl_dlist_node header;
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    /* Data used in vbo_save_playback_vertex_list */
60*61046927SAndroid Build Coastguard Worker    unsigned num_draws;
61*61046927SAndroid Build Coastguard Worker    uint8_t *modes;
62*61046927SAndroid Build Coastguard Worker    union {
63*61046927SAndroid Build Coastguard Worker       struct pipe_draw_start_count_bias *start_counts;
64*61046927SAndroid Build Coastguard Worker       struct pipe_draw_start_count_bias start_count;
65*61046927SAndroid Build Coastguard Worker    };
66*61046927SAndroid Build Coastguard Worker    uint8_t mode;
67*61046927SAndroid Build Coastguard Worker    bool draw_begins;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    int16_t private_refcount[VP_MODE_MAX];
70*61046927SAndroid Build Coastguard Worker    struct gl_context *ctx;
71*61046927SAndroid Build Coastguard Worker    struct pipe_vertex_state *state[VP_MODE_MAX];
72*61046927SAndroid Build Coastguard Worker    GLbitfield enabled_attribs[VP_MODE_MAX];
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    /* Cold: used during construction or to handle edge-cases.
75*61046927SAndroid Build Coastguard Worker     * It's not part of the structure because we want display list nodes
76*61046927SAndroid Build Coastguard Worker     * to be tightly packed to get cache hits. Without this, performance would
77*61046927SAndroid Build Coastguard Worker     * decrease by an order of magnitude with 10k display lists.
78*61046927SAndroid Build Coastguard Worker     */
79*61046927SAndroid Build Coastguard Worker    struct {
80*61046927SAndroid Build Coastguard Worker       struct gl_vertex_array_object *VAO[VP_MODE_MAX];
81*61046927SAndroid Build Coastguard Worker       struct _mesa_index_buffer ib;
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker       struct pipe_draw_info info;
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker       /* Copy of the final vertex from node->vertex_store->bufferobj.
86*61046927SAndroid Build Coastguard Worker        * Keep this in regular (non-VBO) memory to avoid repeated
87*61046927SAndroid Build Coastguard Worker        * map/unmap of the VBO when updating GL current data.
88*61046927SAndroid Build Coastguard Worker        */
89*61046927SAndroid Build Coastguard Worker       fi_type *current_data;
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker       GLuint vertex_count;         /**< number of vertices in this list */
92*61046927SAndroid Build Coastguard Worker       GLuint wrap_count;		/* number of copied vertices at start */
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker       struct _mesa_prim *prims;
95*61046927SAndroid Build Coastguard Worker       GLuint prim_count;
96*61046927SAndroid Build Coastguard Worker       GLuint min_index, max_index;
97*61046927SAndroid Build Coastguard Worker       GLuint bo_bytes_used;
98*61046927SAndroid Build Coastguard Worker    } *cold;
99*61046927SAndroid Build Coastguard Worker };
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker /**
103*61046927SAndroid Build Coastguard Worker  * Return the stride in bytes of the display list node.
104*61046927SAndroid Build Coastguard Worker  */
105*61046927SAndroid Build Coastguard Worker static inline GLsizei
_vbo_save_get_stride(const struct vbo_save_vertex_list * node)106*61046927SAndroid Build Coastguard Worker _vbo_save_get_stride(const struct vbo_save_vertex_list *node)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker    return node->cold->VAO[0]->BufferBinding[0].Stride;
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker /* Default size for the buffer holding the vertices and the indices.
112*61046927SAndroid Build Coastguard Worker  * A bigger buffer helps reducing the number of draw calls but may
113*61046927SAndroid Build Coastguard Worker  * waste memory.
114*61046927SAndroid Build Coastguard Worker  * 1MB was picked because a lower value reduces viewperf snx tests
115*61046927SAndroid Build Coastguard Worker  * performance but larger values cause high VRAM usage (because
116*61046927SAndroid Build Coastguard Worker  * larger buffers will be shared by more display lists which reduces
117*61046927SAndroid Build Coastguard Worker  * the likelyhood of freeing the buffer).
118*61046927SAndroid Build Coastguard Worker  */
119*61046927SAndroid Build Coastguard Worker #define VBO_SAVE_BUFFER_SIZE (1024 * 1024)
120*61046927SAndroid Build Coastguard Worker #define VBO_SAVE_PRIM_MODE_MASK 0x3f
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker struct vbo_save_vertex_store {
123*61046927SAndroid Build Coastguard Worker    fi_type *buffer_in_ram;
124*61046927SAndroid Build Coastguard Worker    GLuint buffer_in_ram_size;
125*61046927SAndroid Build Coastguard Worker    GLuint used;           /**< Number of 4-byte words used in buffer */
126*61046927SAndroid Build Coastguard Worker };
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker struct vbo_save_primitive_store {
129*61046927SAndroid Build Coastguard Worker    struct _mesa_prim *prims;
130*61046927SAndroid Build Coastguard Worker    GLuint used;
131*61046927SAndroid Build Coastguard Worker    GLuint size;
132*61046927SAndroid Build Coastguard Worker };
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker void vbo_save_init(struct gl_context *ctx);
136*61046927SAndroid Build Coastguard Worker void vbo_save_destroy(struct gl_context *ctx);
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker /* save_loopback.c:
139*61046927SAndroid Build Coastguard Worker  */
140*61046927SAndroid Build Coastguard Worker void _vbo_loopback_vertex_list(struct gl_context *ctx,
141*61046927SAndroid Build Coastguard Worker                                const struct vbo_save_vertex_list* node,
142*61046927SAndroid Build Coastguard Worker                                fi_type *buffer);
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker /* Callbacks:
145*61046927SAndroid Build Coastguard Worker  */
146*61046927SAndroid Build Coastguard Worker void
147*61046927SAndroid Build Coastguard Worker vbo_save_playback_vertex_list(struct gl_context *ctx, void *data, bool copy_to_current);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker void
150*61046927SAndroid Build Coastguard Worker vbo_save_playback_vertex_list_loopback(struct gl_context *ctx, void *data);
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker void
153*61046927SAndroid Build Coastguard Worker vbo_save_api_init(struct vbo_save_context *save);
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker #endif /* VBO_SAVE_H */
156