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