155 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 2014 Keith Packard
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that copyright
 | |
|  * notice and this permission notice appear in supporting documentation, and
 | |
|  * that the name of the copyright holders not be used in advertising or
 | |
|  * publicity pertaining to distribution of the software without specific,
 | |
|  * written prior permission.  The copyright holders make no representations
 | |
|  * about the suitability of this software for any purpose.  It is provided "as
 | |
|  * is" without express or implied warranty.
 | |
|  *
 | |
|  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 | |
|  * OF THIS SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #ifndef _GLAMOR_PROGRAM_H_
 | |
| #define _GLAMOR_PROGRAM_H_
 | |
| 
 | |
| typedef enum {
 | |
|     glamor_program_location_none = 0,
 | |
|     glamor_program_location_fg = 1,
 | |
|     glamor_program_location_bg = 2,
 | |
|     glamor_program_location_fillsamp = 4,
 | |
|     glamor_program_location_fillpos = 8,
 | |
|     glamor_program_location_font = 16,
 | |
|     glamor_program_location_bitplane = 32,
 | |
|     glamor_program_location_dash = 64,
 | |
|     glamor_program_location_atlas = 128,
 | |
| } glamor_program_location;
 | |
| 
 | |
| typedef enum {
 | |
|     glamor_program_flag_none = 0,
 | |
| } glamor_program_flag;
 | |
| 
 | |
| typedef enum {
 | |
|     glamor_program_alpha_normal,
 | |
|     glamor_program_alpha_ca_first,
 | |
|     glamor_program_alpha_ca_second,
 | |
|     glamor_program_alpha_dual_blend,
 | |
|     glamor_program_alpha_count
 | |
| } glamor_program_alpha;
 | |
| 
 | |
| typedef struct _glamor_program glamor_program;
 | |
| 
 | |
| typedef Bool (*glamor_use) (PixmapPtr pixmap, GCPtr gc, glamor_program *prog, void *arg);
 | |
| 
 | |
| typedef Bool (*glamor_use_render) (CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *prog);
 | |
| 
 | |
| typedef struct {
 | |
|     const char                          *name;
 | |
|     const int                           version;
 | |
|     char                                *vs_defines;
 | |
|     char                                *fs_defines;
 | |
|     const char                          *vs_vars;
 | |
|     const char                          *vs_exec;
 | |
|     const char                          *fs_vars;
 | |
|     const char                          *fs_exec;
 | |
|     const glamor_program_location       locations;
 | |
|     const glamor_program_flag           flags;
 | |
|     const char                          *source_name;
 | |
|     glamor_use                          use;
 | |
|     glamor_use_render                   use_render;
 | |
| } glamor_facet;
 | |
| 
 | |
| struct _glamor_program {
 | |
|     GLint                       prog;
 | |
|     GLint                       failed;
 | |
|     GLint                       matrix_uniform;
 | |
|     GLint                       fg_uniform;
 | |
|     GLint                       bg_uniform;
 | |
|     GLint                       fill_size_inv_uniform;
 | |
|     GLint                       fill_offset_uniform;
 | |
|     GLint                       font_uniform;
 | |
|     GLint                       bitplane_uniform;
 | |
|     GLint                       bitmul_uniform;
 | |
|     GLint                       dash_uniform;
 | |
|     GLint                       dash_length_uniform;
 | |
|     GLint                       atlas_uniform;
 | |
|     glamor_program_location     locations;
 | |
|     glamor_program_flag         flags;
 | |
|     glamor_use                  prim_use;
 | |
|     glamor_use                  fill_use;
 | |
|     glamor_program_alpha        alpha;
 | |
|     glamor_use_render           prim_use_render;
 | |
|     glamor_use_render           fill_use_render;
 | |
| };
 | |
| 
 | |
| typedef struct {
 | |
|     glamor_program      progs[4];
 | |
| } glamor_program_fill;
 | |
| 
 | |
| extern const glamor_facet glamor_fill_solid;
 | |
| 
 | |
| Bool
 | |
| glamor_build_program(ScreenPtr          screen,
 | |
|                      glamor_program     *prog,
 | |
|                      const glamor_facet *prim,
 | |
|                      const glamor_facet *fill,
 | |
|                      const char         *combine,
 | |
|                      const char         *defines);
 | |
| 
 | |
| Bool
 | |
| glamor_use_program(PixmapPtr            pixmap,
 | |
|                    GCPtr                gc,
 | |
|                    glamor_program       *prog,
 | |
|                    void                 *arg);
 | |
| 
 | |
| glamor_program *
 | |
| glamor_use_program_fill(PixmapPtr               pixmap,
 | |
|                         GCPtr                   gc,
 | |
|                         glamor_program_fill     *program_fill,
 | |
|                         const glamor_facet      *prim);
 | |
| 
 | |
| typedef enum {
 | |
|     glamor_program_source_solid,
 | |
|     glamor_program_source_picture,
 | |
|     glamor_program_source_1x1_picture,
 | |
|     glamor_program_source_count,
 | |
| } glamor_program_source;
 | |
| 
 | |
| typedef struct {
 | |
|     glamor_program      progs[glamor_program_source_count][glamor_program_alpha_count];
 | |
| } glamor_program_render;
 | |
| 
 | |
| static inline Bool
 | |
| glamor_is_component_alpha(PicturePtr mask) {
 | |
|     if (mask && mask->componentAlpha && PICT_FORMAT_RGB(mask->format))
 | |
|         return TRUE;
 | |
|     return FALSE;
 | |
| }
 | |
| 
 | |
| glamor_program *
 | |
| glamor_setup_program_render(CARD8                 op,
 | |
|                             PicturePtr            src,
 | |
|                             PicturePtr            mask,
 | |
|                             PicturePtr            dst,
 | |
|                             glamor_program_render *program_render,
 | |
|                             const glamor_facet    *prim,
 | |
|                             const char            *defines);
 | |
| 
 | |
| Bool
 | |
| glamor_use_program_render(glamor_program        *prog,
 | |
|                           CARD8                 op,
 | |
|                           PicturePtr            src,
 | |
|                           PicturePtr            dst);
 | |
| 
 | |
| #endif /* _GLAMOR_PROGRAM_H_ */
 |