Home | History | Annotate | Line # | Download | only in glamor
      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 
     26 typedef 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 
     38 typedef enum {
     39     glamor_program_flag_none = 0,
     40 } glamor_program_flag;
     41 
     42 typedef 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_dual_blend_gles2,
     48     glamor_program_alpha_count
     49 } glamor_program_alpha;
     50 
     51 typedef struct _glamor_program glamor_program;
     52 
     53 typedef Bool (*glamor_use) (PixmapPtr pixmap, GCPtr gc, glamor_program *prog, void *arg);
     54 
     55 typedef Bool (*glamor_use_render) (CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *prog);
     56 
     57 typedef struct {
     58     const char                          *name;
     59     const int                           version;
     60     char                                *vs_extensions;
     61     const char                          *fs_extensions;
     62     const char                          *vs_vars;
     63     const char                          *vs_exec;
     64     const char                          *fs_vars;
     65     const char                          *fs_exec;
     66     const glamor_program_location       locations;
     67     const glamor_program_flag           flags;
     68     const char                          *source_name;
     69     glamor_use                          use;
     70     glamor_use_render                   use_render;
     71 } glamor_facet;
     72 
     73 struct _glamor_program {
     74     GLint                       prog;
     75     GLint                       failed;
     76     GLint                       matrix_uniform;
     77     GLint                       fg_uniform;
     78     GLint                       bg_uniform;
     79     GLint                       fill_size_inv_uniform;
     80     GLint                       fill_offset_uniform;
     81     GLint                       font_uniform;
     82     GLint                       bitplane_uniform;
     83     GLint                       bitmul_uniform;
     84     GLint                       dash_uniform;
     85     GLint                       dash_length_uniform;
     86     GLint                       atlas_uniform;
     87     glamor_program_location     locations;
     88     glamor_program_flag         flags;
     89     glamor_use                  prim_use;
     90     glamor_use                  fill_use;
     91     glamor_program_alpha        alpha;
     92     glamor_use_render           prim_use_render;
     93     glamor_use_render           fill_use_render;
     94 };
     95 
     96 typedef struct {
     97     glamor_program      progs[4];
     98 } glamor_program_fill;
     99 
    100 extern const glamor_facet glamor_fill_solid;
    101 
    102 Bool
    103 glamor_build_program(ScreenPtr          screen,
    104                      glamor_program     *prog,
    105                      const glamor_facet *prim,
    106                      const glamor_facet *fill,
    107                      const char         *combine,
    108                      const char         *defines);
    109 
    110 Bool
    111 glamor_use_program(PixmapPtr            pixmap,
    112                    GCPtr                gc,
    113                    glamor_program       *prog,
    114                    void                 *arg);
    115 
    116 glamor_program *
    117 glamor_use_program_fill(PixmapPtr               pixmap,
    118                         GCPtr                   gc,
    119                         glamor_program_fill     *program_fill,
    120                         const glamor_facet      *prim);
    121 
    122 typedef enum {
    123     glamor_program_source_solid,
    124     glamor_program_source_picture,
    125     glamor_program_source_1x1_picture,
    126     glamor_program_source_count,
    127 } glamor_program_source;
    128 
    129 typedef struct {
    130     glamor_program      progs[glamor_program_source_count][glamor_program_alpha_count];
    131 } glamor_program_render;
    132 
    133 static inline Bool
    134 glamor_is_component_alpha(PicturePtr mask) {
    135     if (mask && mask->componentAlpha && PICT_FORMAT_RGB(mask->format))
    136         return TRUE;
    137     return FALSE;
    138 }
    139 
    140 glamor_program *
    141 glamor_setup_program_render(CARD8                 op,
    142                             PicturePtr            src,
    143                             PicturePtr            mask,
    144                             PicturePtr            dst,
    145                             glamor_program_render *program_render,
    146                             const glamor_facet    *prim,
    147                             const char            *defines);
    148 
    149 Bool
    150 glamor_use_program_render(glamor_program        *prog,
    151                           CARD8                 op,
    152                           PicturePtr            src,
    153                           PicturePtr            dst);
    154 
    155 #endif /* _GLAMOR_PROGRAM_H_ */
    156