135c4bbdfSmrg/* 235c4bbdfSmrg * Copyright © 2001 Keith Packard 335c4bbdfSmrg * Copyright © 2008 Intel Corporation 435c4bbdfSmrg * 535c4bbdfSmrg * Permission is hereby granted, free of charge, to any person obtaining a 635c4bbdfSmrg * copy of this software and associated documentation files (the "Software"), 735c4bbdfSmrg * to deal in the Software without restriction, including without limitation 835c4bbdfSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 935c4bbdfSmrg * and/or sell copies of the Software, and to permit persons to whom the 1035c4bbdfSmrg * Software is furnished to do so, subject to the following conditions: 1135c4bbdfSmrg * 1235c4bbdfSmrg * The above copyright notice and this permission notice (including the next 1335c4bbdfSmrg * paragraph) shall be included in all copies or substantial portions of the 1435c4bbdfSmrg * Software. 1535c4bbdfSmrg * 1635c4bbdfSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1735c4bbdfSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1835c4bbdfSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1935c4bbdfSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2035c4bbdfSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2135c4bbdfSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2235c4bbdfSmrg * IN THE SOFTWARE. 2335c4bbdfSmrg * 2435c4bbdfSmrg * Authors: 2535c4bbdfSmrg * Eric Anholt <eric@anholt.net> 2635c4bbdfSmrg * Zhigang Gong <zhigang.gong@linux.intel.com> 2735c4bbdfSmrg * 2835c4bbdfSmrg */ 2935c4bbdfSmrg 3035c4bbdfSmrg#include <stdlib.h> 3135c4bbdfSmrg 3235c4bbdfSmrg#include "glamor_priv.h" 3335c4bbdfSmrg/** 3435c4bbdfSmrg * Sets the offsets to add to coordinates to make them address the same bits in 3535c4bbdfSmrg * the backing drawable. These coordinates are nonzero only for redirected 3635c4bbdfSmrg * windows. 3735c4bbdfSmrg */ 3835c4bbdfSmrgvoid 3935c4bbdfSmrgglamor_get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap, 4035c4bbdfSmrg int *x, int *y) 4135c4bbdfSmrg{ 4235c4bbdfSmrg#ifdef COMPOSITE 4335c4bbdfSmrg if (drawable->type == DRAWABLE_WINDOW) { 4435c4bbdfSmrg *x = -pixmap->screen_x; 4535c4bbdfSmrg *y = -pixmap->screen_y; 4635c4bbdfSmrg return; 4735c4bbdfSmrg } 4835c4bbdfSmrg#endif 4935c4bbdfSmrg 5035c4bbdfSmrg *x = 0; 5135c4bbdfSmrg *y = 0; 5235c4bbdfSmrg} 5335c4bbdfSmrg 5435c4bbdfSmrgvoid 5535c4bbdfSmrgglamor_pixmap_init(ScreenPtr screen) 5635c4bbdfSmrg{ 5735c4bbdfSmrg 5835c4bbdfSmrg} 5935c4bbdfSmrg 6035c4bbdfSmrgvoid 6135c4bbdfSmrgglamor_pixmap_fini(ScreenPtr screen) 6235c4bbdfSmrg{ 6335c4bbdfSmrg} 6435c4bbdfSmrg 6535c4bbdfSmrgvoid 6635c4bbdfSmrgglamor_set_destination_pixmap_fbo(glamor_screen_private *glamor_priv, 6735c4bbdfSmrg glamor_pixmap_fbo *fbo, int x0, int y0, 6835c4bbdfSmrg int width, int height) 6935c4bbdfSmrg{ 7035c4bbdfSmrg glamor_make_current(glamor_priv); 7135c4bbdfSmrg 7235c4bbdfSmrg glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb); 7335c4bbdfSmrg glViewport(x0, y0, width, height); 7435c4bbdfSmrg} 7535c4bbdfSmrg 7635c4bbdfSmrgvoid 7735c4bbdfSmrgglamor_set_destination_pixmap_priv_nc(glamor_screen_private *glamor_priv, 7835c4bbdfSmrg PixmapPtr pixmap, 7935c4bbdfSmrg glamor_pixmap_private *pixmap_priv) 8035c4bbdfSmrg{ 8135c4bbdfSmrg int w, h; 8235c4bbdfSmrg 8335c4bbdfSmrg PIXMAP_PRIV_GET_ACTUAL_SIZE(pixmap, pixmap_priv, w, h); 8435c4bbdfSmrg glamor_set_destination_pixmap_fbo(glamor_priv, pixmap_priv->fbo, 0, 0, w, h); 8535c4bbdfSmrg} 8635c4bbdfSmrg 8735c4bbdfSmrgint 8835c4bbdfSmrgglamor_set_destination_pixmap_priv(glamor_screen_private *glamor_priv, 8935c4bbdfSmrg PixmapPtr pixmap, 9035c4bbdfSmrg glamor_pixmap_private *pixmap_priv) 9135c4bbdfSmrg{ 9235c4bbdfSmrg if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) 9335c4bbdfSmrg return -1; 9435c4bbdfSmrg 9535c4bbdfSmrg glamor_set_destination_pixmap_priv_nc(glamor_priv, pixmap, pixmap_priv); 9635c4bbdfSmrg return 0; 9735c4bbdfSmrg} 9835c4bbdfSmrg 9935c4bbdfSmrgint 10035c4bbdfSmrgglamor_set_destination_pixmap(PixmapPtr pixmap) 10135c4bbdfSmrg{ 10235c4bbdfSmrg int err; 10335c4bbdfSmrg glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); 10435c4bbdfSmrg ScreenPtr screen = pixmap->drawable.pScreen; 10535c4bbdfSmrg glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); 10635c4bbdfSmrg 10735c4bbdfSmrg err = glamor_set_destination_pixmap_priv(glamor_priv, pixmap, pixmap_priv); 10835c4bbdfSmrg return err; 10935c4bbdfSmrg} 11035c4bbdfSmrg 11135c4bbdfSmrgBool 11235c4bbdfSmrgglamor_set_planemask(int depth, unsigned long planemask) 11335c4bbdfSmrg{ 11435c4bbdfSmrg if (glamor_pm_is_solid(depth, planemask)) { 11535c4bbdfSmrg return GL_TRUE; 11635c4bbdfSmrg } 11735c4bbdfSmrg 11835c4bbdfSmrg glamor_fallback("unsupported planemask %lx\n", planemask); 11935c4bbdfSmrg return GL_FALSE; 12035c4bbdfSmrg} 12135c4bbdfSmrg 12235c4bbdfSmrgBool 12335c4bbdfSmrgglamor_set_alu(ScreenPtr screen, unsigned char alu) 12435c4bbdfSmrg{ 12535c4bbdfSmrg glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); 12635c4bbdfSmrg 127ed6184dfSmrg if (glamor_priv->is_gles) { 12835c4bbdfSmrg if (alu != GXcopy) 12935c4bbdfSmrg return FALSE; 13035c4bbdfSmrg else 13135c4bbdfSmrg return TRUE; 13235c4bbdfSmrg } 13335c4bbdfSmrg 13435c4bbdfSmrg if (alu == GXcopy) { 13535c4bbdfSmrg glDisable(GL_COLOR_LOGIC_OP); 13635c4bbdfSmrg return TRUE; 13735c4bbdfSmrg } 13835c4bbdfSmrg glEnable(GL_COLOR_LOGIC_OP); 13935c4bbdfSmrg switch (alu) { 14035c4bbdfSmrg case GXclear: 14135c4bbdfSmrg glLogicOp(GL_CLEAR); 14235c4bbdfSmrg break; 14335c4bbdfSmrg case GXand: 14435c4bbdfSmrg glLogicOp(GL_AND); 14535c4bbdfSmrg break; 14635c4bbdfSmrg case GXandReverse: 14735c4bbdfSmrg glLogicOp(GL_AND_REVERSE); 14835c4bbdfSmrg break; 14935c4bbdfSmrg case GXandInverted: 15035c4bbdfSmrg glLogicOp(GL_AND_INVERTED); 15135c4bbdfSmrg break; 15235c4bbdfSmrg case GXnoop: 15335c4bbdfSmrg glLogicOp(GL_NOOP); 15435c4bbdfSmrg break; 15535c4bbdfSmrg case GXxor: 15635c4bbdfSmrg glLogicOp(GL_XOR); 15735c4bbdfSmrg break; 15835c4bbdfSmrg case GXor: 15935c4bbdfSmrg glLogicOp(GL_OR); 16035c4bbdfSmrg break; 16135c4bbdfSmrg case GXnor: 16235c4bbdfSmrg glLogicOp(GL_NOR); 16335c4bbdfSmrg break; 16435c4bbdfSmrg case GXequiv: 16535c4bbdfSmrg glLogicOp(GL_EQUIV); 16635c4bbdfSmrg break; 16735c4bbdfSmrg case GXinvert: 16835c4bbdfSmrg glLogicOp(GL_INVERT); 16935c4bbdfSmrg break; 17035c4bbdfSmrg case GXorReverse: 17135c4bbdfSmrg glLogicOp(GL_OR_REVERSE); 17235c4bbdfSmrg break; 17335c4bbdfSmrg case GXcopyInverted: 17435c4bbdfSmrg glLogicOp(GL_COPY_INVERTED); 17535c4bbdfSmrg break; 17635c4bbdfSmrg case GXorInverted: 17735c4bbdfSmrg glLogicOp(GL_OR_INVERTED); 17835c4bbdfSmrg break; 17935c4bbdfSmrg case GXnand: 18035c4bbdfSmrg glLogicOp(GL_NAND); 18135c4bbdfSmrg break; 18235c4bbdfSmrg case GXset: 18335c4bbdfSmrg glLogicOp(GL_SET); 18435c4bbdfSmrg break; 18535c4bbdfSmrg default: 18635c4bbdfSmrg glamor_fallback("unsupported alu %x\n", alu); 18735c4bbdfSmrg return FALSE; 18835c4bbdfSmrg } 18935c4bbdfSmrg 19035c4bbdfSmrg return TRUE; 19135c4bbdfSmrg} 192