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