1/* gskglbufferprivate.h
2 *
3 * Copyright 2020 Christian Hergert <chergert@redhat.com>
4 *
5 * This file is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License as published by the Free
7 * Software Foundation; either version 2.1 of the License, or (at your option)
8 * any later version.
9 *
10 * This file is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
13 * License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: LGPL-2.1-or-later
19 */
20
21#ifndef __GSK_GL_BUFFER_PRIVATE_H__
22#define __GSK_GL_BUFFER_PRIVATE_H__
23
24#include "gskgltypesprivate.h"
25
26G_BEGIN_DECLS
27
28typedef struct _GskGLBuffer
29{
30 guint8 *buffer;
31 gsize buffer_pos;
32 gsize buffer_len;
33 guint count;
34 GLenum target;
35 gsize element_size;
36} GskGLBuffer;
37
38void gsk_gl_buffer_init (GskGLBuffer *self,
39 GLenum target,
40 guint element_size);
41void gsk_gl_buffer_destroy (GskGLBuffer *buffer);
42GLuint gsk_gl_buffer_submit (GskGLBuffer *buffer);
43
44static inline gpointer
45gsk_gl_buffer_advance (GskGLBuffer *buffer,
46 guint count)
47{
48 gpointer ret;
49 gsize to_alloc = count * buffer->element_size;
50
51 if G_UNLIKELY (buffer->buffer_pos + to_alloc > buffer->buffer_len)
52 {
53 while (buffer->buffer_pos + to_alloc > buffer->buffer_len)
54 buffer->buffer_len *= 2;
55 buffer->buffer = g_realloc (mem: buffer->buffer, n_bytes: buffer->buffer_len);
56 }
57
58 ret = buffer->buffer + buffer->buffer_pos;
59
60 buffer->buffer_pos += to_alloc;
61 buffer->count += count;
62
63 return ret;
64}
65
66static inline void
67gsk_gl_buffer_retract (GskGLBuffer *buffer,
68 guint count)
69{
70 buffer->buffer_pos -= count * buffer->element_size;
71 buffer->count -= count;
72}
73
74static inline guint
75gsk_gl_buffer_get_offset (GskGLBuffer *buffer)
76{
77 return buffer->count;
78}
79
80G_END_DECLS
81
82#endif /* __GSK_GL_BUFFER_PRIVATE_H__ */
83

source code of gtk/gsk/gl/gskglbufferprivate.h