glamor_pixmap.c revision 35c4bbdf
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->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