1 /*
2  * Copyright © 2001 Keith Packard
3  * Copyright © 2008 Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22  * IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Eric Anholt <eric@anholt.net>
26  *    Zhigang Gong <zhigang.gong@linux.intel.com>
27  *
28  */
29 
30 #include <stdlib.h>
31 
32 #include "glamor_priv.h"
33 /**
34  * Sets the offsets to add to coordinates to make them address the same bits in
35  * the backing drawable. These coordinates are nonzero only for redirected
36  * windows.
37  */
38 void
glamor_get_drawable_deltas(DrawablePtr drawable,PixmapPtr pixmap,int * x,int * y)39 glamor_get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap,
40                            int *x, int *y)
41 {
42 #ifdef COMPOSITE
43     if (drawable->type == DRAWABLE_WINDOW) {
44         *x = -pixmap->screen_x;
45         *y = -pixmap->screen_y;
46         return;
47     }
48 #endif
49 
50     *x = 0;
51     *y = 0;
52 }
53 
54 void
glamor_pixmap_init(ScreenPtr screen)55 glamor_pixmap_init(ScreenPtr screen)
56 {
57 
58 }
59 
60 void
glamor_pixmap_fini(ScreenPtr screen)61 glamor_pixmap_fini(ScreenPtr screen)
62 {
63 }
64 
65 void
glamor_set_destination_pixmap_fbo(glamor_screen_private * glamor_priv,glamor_pixmap_fbo * fbo,int x0,int y0,int width,int height)66 glamor_set_destination_pixmap_fbo(glamor_screen_private *glamor_priv,
67                                   glamor_pixmap_fbo *fbo, int x0, int y0,
68                                   int width, int height)
69 {
70     glamor_make_current(glamor_priv);
71 
72     glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb);
73     glViewport(x0, y0, width, height);
74 }
75 
76 void
glamor_set_destination_pixmap_priv_nc(glamor_screen_private * glamor_priv,PixmapPtr pixmap,glamor_pixmap_private * pixmap_priv)77 glamor_set_destination_pixmap_priv_nc(glamor_screen_private *glamor_priv,
78                                       PixmapPtr pixmap,
79                                       glamor_pixmap_private *pixmap_priv)
80 {
81     int w, h;
82 
83     PIXMAP_PRIV_GET_ACTUAL_SIZE(pixmap, pixmap_priv, w, h);
84     glamor_set_destination_pixmap_fbo(glamor_priv, pixmap_priv->fbo, 0, 0, w, h);
85 }
86 
87 int
glamor_set_destination_pixmap_priv(glamor_screen_private * glamor_priv,PixmapPtr pixmap,glamor_pixmap_private * pixmap_priv)88 glamor_set_destination_pixmap_priv(glamor_screen_private *glamor_priv,
89                                    PixmapPtr pixmap,
90                                    glamor_pixmap_private *pixmap_priv)
91 {
92     if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
93         return -1;
94 
95     glamor_set_destination_pixmap_priv_nc(glamor_priv, pixmap, pixmap_priv);
96     return 0;
97 }
98 
99 int
glamor_set_destination_pixmap(PixmapPtr pixmap)100 glamor_set_destination_pixmap(PixmapPtr pixmap)
101 {
102     int err;
103     glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
104     ScreenPtr screen = pixmap->drawable.pScreen;
105     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
106 
107     err = glamor_set_destination_pixmap_priv(glamor_priv, pixmap, pixmap_priv);
108     return err;
109 }
110 
111 Bool
glamor_set_planemask(int depth,unsigned long planemask)112 glamor_set_planemask(int depth, unsigned long planemask)
113 {
114     if (glamor_pm_is_solid(depth, planemask)) {
115         return GL_TRUE;
116     }
117 
118     glamor_fallback("unsupported planemask %lx\n", planemask);
119     return GL_FALSE;
120 }
121 
122 Bool
glamor_set_alu(ScreenPtr screen,unsigned char alu)123 glamor_set_alu(ScreenPtr screen, unsigned char alu)
124 {
125     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
126 
127     if (glamor_priv->gl_flavor == GLAMOR_GL_ES2) {
128         if (alu != GXcopy)
129             return FALSE;
130         else
131             return TRUE;
132     }
133 
134     if (alu == GXcopy) {
135         glDisable(GL_COLOR_LOGIC_OP);
136         return TRUE;
137     }
138     glEnable(GL_COLOR_LOGIC_OP);
139     switch (alu) {
140     case GXclear:
141         glLogicOp(GL_CLEAR);
142         break;
143     case GXand:
144         glLogicOp(GL_AND);
145         break;
146     case GXandReverse:
147         glLogicOp(GL_AND_REVERSE);
148         break;
149     case GXandInverted:
150         glLogicOp(GL_AND_INVERTED);
151         break;
152     case GXnoop:
153         glLogicOp(GL_NOOP);
154         break;
155     case GXxor:
156         glLogicOp(GL_XOR);
157         break;
158     case GXor:
159         glLogicOp(GL_OR);
160         break;
161     case GXnor:
162         glLogicOp(GL_NOR);
163         break;
164     case GXequiv:
165         glLogicOp(GL_EQUIV);
166         break;
167     case GXinvert:
168         glLogicOp(GL_INVERT);
169         break;
170     case GXorReverse:
171         glLogicOp(GL_OR_REVERSE);
172         break;
173     case GXcopyInverted:
174         glLogicOp(GL_COPY_INVERTED);
175         break;
176     case GXorInverted:
177         glLogicOp(GL_OR_INVERTED);
178         break;
179     case GXnand:
180         glLogicOp(GL_NAND);
181         break;
182     case GXset:
183         glLogicOp(GL_SET);
184         break;
185     default:
186         glamor_fallback("unsupported alu %x\n", alu);
187         return FALSE;
188     }
189 
190     return TRUE;
191 }
192