1/*
2 * Copyright © 2014 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission.  The copyright holders make no representations
11 * about the suitability of this software for any purpose.  It is provided "as
12 * is" without express or implied warranty.
13 *
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20 * OF THIS SOFTWARE.
21 */
22
23#ifndef _GLAMOR_PROGRAM_H_
24#define _GLAMOR_PROGRAM_H_
25
26typedef enum {
27    glamor_program_location_none = 0,
28    glamor_program_location_fg = 1,
29    glamor_program_location_bg = 2,
30    glamor_program_location_fillsamp = 4,
31    glamor_program_location_fillpos = 8,
32    glamor_program_location_font = 16,
33    glamor_program_location_bitplane = 32,
34    glamor_program_location_dash = 64,
35    glamor_program_location_atlas = 128,
36} glamor_program_location;
37
38typedef enum {
39    glamor_program_flag_none = 0,
40} glamor_program_flag;
41
42typedef enum {
43    glamor_program_alpha_normal,
44    glamor_program_alpha_ca_first,
45    glamor_program_alpha_ca_second,
46    glamor_program_alpha_dual_blend,
47    glamor_program_alpha_count
48} glamor_program_alpha;
49
50typedef struct _glamor_program glamor_program;
51
52typedef Bool (*glamor_use) (PixmapPtr pixmap, GCPtr gc, glamor_program *prog, void *arg);
53
54typedef Bool (*glamor_use_render) (CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *prog);
55
56typedef struct {
57    const char                          *name;
58    const int                           version;
59    char                                *vs_defines;
60    char                                *fs_defines;
61    const char                          *vs_vars;
62    const char                          *vs_exec;
63    const char                          *fs_vars;
64    const char                          *fs_exec;
65    const glamor_program_location       locations;
66    const glamor_program_flag           flags;
67    const char                          *source_name;
68    glamor_use                          use;
69    glamor_use_render                   use_render;
70} glamor_facet;
71
72struct _glamor_program {
73    GLint                       prog;
74    GLint                       failed;
75    GLint                       matrix_uniform;
76    GLint                       fg_uniform;
77    GLint                       bg_uniform;
78    GLint                       fill_size_inv_uniform;
79    GLint                       fill_offset_uniform;
80    GLint                       font_uniform;
81    GLint                       bitplane_uniform;
82    GLint                       bitmul_uniform;
83    GLint                       dash_uniform;
84    GLint                       dash_length_uniform;
85    GLint                       atlas_uniform;
86    glamor_program_location     locations;
87    glamor_program_flag         flags;
88    glamor_use                  prim_use;
89    glamor_use                  fill_use;
90    glamor_program_alpha        alpha;
91    glamor_use_render           prim_use_render;
92    glamor_use_render           fill_use_render;
93};
94
95typedef struct {
96    glamor_program      progs[4];
97} glamor_program_fill;
98
99extern const glamor_facet glamor_fill_solid;
100
101Bool
102glamor_build_program(ScreenPtr          screen,
103                     glamor_program     *prog,
104                     const glamor_facet *prim,
105                     const glamor_facet *fill,
106                     const char         *combine,
107                     const char         *defines);
108
109Bool
110glamor_use_program(PixmapPtr            pixmap,
111                   GCPtr                gc,
112                   glamor_program       *prog,
113                   void                 *arg);
114
115glamor_program *
116glamor_use_program_fill(PixmapPtr               pixmap,
117                        GCPtr                   gc,
118                        glamor_program_fill     *program_fill,
119                        const glamor_facet      *prim);
120
121typedef enum {
122    glamor_program_source_solid,
123    glamor_program_source_picture,
124    glamor_program_source_1x1_picture,
125    glamor_program_source_count,
126} glamor_program_source;
127
128typedef struct {
129    glamor_program      progs[glamor_program_source_count][glamor_program_alpha_count];
130} glamor_program_render;
131
132static inline Bool
133glamor_is_component_alpha(PicturePtr mask) {
134    if (mask && mask->componentAlpha && PICT_FORMAT_RGB(mask->format))
135        return TRUE;
136    return FALSE;
137}
138
139glamor_program *
140glamor_setup_program_render(CARD8                 op,
141                            PicturePtr            src,
142                            PicturePtr            mask,
143                            PicturePtr            dst,
144                            glamor_program_render *program_render,
145                            const glamor_facet    *prim,
146                            const char            *defines);
147
148Bool
149glamor_use_program_render(glamor_program        *prog,
150                          CARD8                 op,
151                          PicturePtr            src,
152                          PicturePtr            dst);
153
154#endif /* _GLAMOR_PROGRAM_H_ */
155