glamor_pixmap.c revision ed6184df
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 */
38void
39glamor_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
54void
55glamor_pixmap_init(ScreenPtr screen)
56{
57
58}
59
60void
61glamor_pixmap_fini(ScreenPtr screen)
62{
63}
64
65void
66glamor_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
76void
77glamor_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
87int
88glamor_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
99int
100glamor_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
111Bool
112glamor_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
122Bool
123glamor_set_alu(ScreenPtr screen, unsigned char alu)
124{
125    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
126
127    if (glamor_priv->is_gles) {
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