1/* GSK - The GTK Scene Kit
2 *
3 * Copyright 2020 Red Hat Inc
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef __GSK_GL_SHADER_H__
20#define __GSK_GL_SHADER_H__
21
22#if !defined (__GSK_H_INSIDE__) && !defined (GTK_COMPILATION)
23#error "Only <gsk/gsk.h> can be included directly."
24#endif
25
26#include <stdarg.h>
27
28#include <gsk/gsktypes.h>
29#include <gsk/gskenums.h>
30
31G_BEGIN_DECLS
32
33#define GSK_TYPE_SHADER_ARGS_BUILDER (gsk_shader_args_builder_get_type ())
34
35/**
36 * GskShaderArgsBuilder:
37 *
38 * An object to build the uniforms data for a `GskGLShader`.
39 */
40typedef struct _GskShaderArgsBuilder GskShaderArgsBuilder;
41
42#define GSK_TYPE_GL_SHADER (gsk_gl_shader_get_type ())
43
44GDK_AVAILABLE_IN_ALL
45G_DECLARE_FINAL_TYPE (GskGLShader, gsk_gl_shader, GSK, GL_SHADER, GObject)
46
47GDK_AVAILABLE_IN_ALL
48GskGLShader * gsk_gl_shader_new_from_bytes (GBytes *sourcecode);
49GDK_AVAILABLE_IN_ALL
50GskGLShader * gsk_gl_shader_new_from_resource (const char *resource_path);
51GDK_AVAILABLE_IN_ALL
52gboolean gsk_gl_shader_compile (GskGLShader *shader,
53 GskRenderer *renderer,
54 GError **error);
55GDK_AVAILABLE_IN_ALL
56GBytes * gsk_gl_shader_get_source (GskGLShader *shader);
57GDK_AVAILABLE_IN_ALL
58const char * gsk_gl_shader_get_resource (GskGLShader *shader);
59GDK_AVAILABLE_IN_ALL
60int gsk_gl_shader_get_n_textures (GskGLShader *shader);
61GDK_AVAILABLE_IN_ALL
62int gsk_gl_shader_get_n_uniforms (GskGLShader *shader);
63GDK_AVAILABLE_IN_ALL
64const char * gsk_gl_shader_get_uniform_name (GskGLShader *shader,
65 int idx);
66GDK_AVAILABLE_IN_ALL
67int gsk_gl_shader_find_uniform_by_name (GskGLShader *shader,
68 const char *name);
69GDK_AVAILABLE_IN_ALL
70GskGLUniformType gsk_gl_shader_get_uniform_type (GskGLShader *shader,
71 int idx);
72GDK_AVAILABLE_IN_ALL
73int gsk_gl_shader_get_uniform_offset (GskGLShader *shader,
74 int idx);
75GDK_AVAILABLE_IN_ALL
76gsize gsk_gl_shader_get_args_size (GskGLShader *shader);
77
78
79/* Helpers for managing shader args */
80
81GDK_AVAILABLE_IN_ALL
82GBytes * gsk_gl_shader_format_args_va (GskGLShader *shader,
83 va_list uniforms);
84GDK_AVAILABLE_IN_ALL
85GBytes * gsk_gl_shader_format_args (GskGLShader *shader,
86 ...) G_GNUC_NULL_TERMINATED;
87
88GDK_AVAILABLE_IN_ALL
89float gsk_gl_shader_get_arg_float (GskGLShader *shader,
90 GBytes *args,
91 int idx);
92GDK_AVAILABLE_IN_ALL
93gint32 gsk_gl_shader_get_arg_int (GskGLShader *shader,
94 GBytes *args,
95 int idx);
96GDK_AVAILABLE_IN_ALL
97guint32 gsk_gl_shader_get_arg_uint (GskGLShader *shader,
98 GBytes *args,
99 int idx);
100GDK_AVAILABLE_IN_ALL
101gboolean gsk_gl_shader_get_arg_bool (GskGLShader *shader,
102 GBytes *args,
103 int idx);
104GDK_AVAILABLE_IN_ALL
105void gsk_gl_shader_get_arg_vec2 (GskGLShader *shader,
106 GBytes *args,
107 int idx,
108 graphene_vec2_t *out_value);
109GDK_AVAILABLE_IN_ALL
110void gsk_gl_shader_get_arg_vec3 (GskGLShader *shader,
111 GBytes *args,
112 int idx,
113 graphene_vec3_t *out_value);
114GDK_AVAILABLE_IN_ALL
115void gsk_gl_shader_get_arg_vec4 (GskGLShader *shader,
116 GBytes *args,
117 int idx,
118 graphene_vec4_t *out_value);
119
120GDK_AVAILABLE_IN_ALL
121GType gsk_shader_args_builder_get_type (void) G_GNUC_CONST;
122
123GDK_AVAILABLE_IN_ALL
124GskShaderArgsBuilder *gsk_shader_args_builder_new (GskGLShader *shader,
125 GBytes *initial_values);
126GDK_AVAILABLE_IN_ALL
127GBytes * gsk_shader_args_builder_to_args (GskShaderArgsBuilder *builder);
128GDK_AVAILABLE_IN_ALL
129GBytes * gsk_shader_args_builder_free_to_args (GskShaderArgsBuilder *builder);
130GDK_AVAILABLE_IN_ALL
131GskShaderArgsBuilder *gsk_shader_args_builder_ref (GskShaderArgsBuilder *builder);
132GDK_AVAILABLE_IN_ALL
133void gsk_shader_args_builder_unref (GskShaderArgsBuilder *builder);
134
135GDK_AVAILABLE_IN_ALL
136void gsk_shader_args_builder_set_float (GskShaderArgsBuilder *builder,
137 int idx,
138 float value);
139GDK_AVAILABLE_IN_ALL
140void gsk_shader_args_builder_set_int (GskShaderArgsBuilder *builder,
141 int idx,
142 gint32 value);
143GDK_AVAILABLE_IN_ALL
144void gsk_shader_args_builder_set_uint (GskShaderArgsBuilder *builder,
145 int idx,
146 guint32 value);
147GDK_AVAILABLE_IN_ALL
148void gsk_shader_args_builder_set_bool (GskShaderArgsBuilder *builder,
149 int idx,
150 gboolean value);
151GDK_AVAILABLE_IN_ALL
152void gsk_shader_args_builder_set_vec2 (GskShaderArgsBuilder *builder,
153 int idx,
154 const graphene_vec2_t *value);
155GDK_AVAILABLE_IN_ALL
156void gsk_shader_args_builder_set_vec3 (GskShaderArgsBuilder *builder,
157 int idx,
158 const graphene_vec3_t *value);
159GDK_AVAILABLE_IN_ALL
160void gsk_shader_args_builder_set_vec4 (GskShaderArgsBuilder *builder,
161 int idx,
162 const graphene_vec4_t *value);
163
164
165G_END_DECLS
166
167#endif /* __GSK_GL_SHADER_H__ */
168

source code of gtk/gsk/gskglshader.h