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