xorg_exa.c revision 416ee3c53eeb1664784f224a42e293e5fed783bc
184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/*
284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * All Rights Reserved.
484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz *
584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a
684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * copy of this software and associated documentation files (the
784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * "Software"), to deal in the Software without restriction, including
884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * without limitation the rights to use, copy, modify, merge, publish,
984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * distribute, sub license, and/or sell copies of the Software, and to
1084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * permit persons to whom the Software is furnished to do so, subject to
1184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * the following conditions:
1284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz *
1384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * The above copyright notice and this permission notice (including the
1484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * next paragraph) shall be included in all copies or substantial portions
1584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * of the Software.
1684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz *
1784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz *
2584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz *
2684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Author: Alan Hourihane <alanh@tungstengraphics.com>
2784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Author: Jakob Bornecrantz <wallbraker@gmail.com>
2884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz *
2984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */
3084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
3121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include "xorg_exa.h"
3284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "xorg_tracker.h"
3321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include "xorg_composite.h"
3421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
3521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <xorg-server.h>
3621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <xf86.h>
3721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <picturestr.h>
3821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <picture.h>
3984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
4084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_format.h"
4184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_context.h"
4284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_state.h"
4384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_inlines.h"
4484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
4517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "cso_cache/cso_context.h"
4617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
47f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer#include "util/u_rect.h"
48f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer
4984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/*
5084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Helper functions
5184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */
5284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
53b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzstatic void
54b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzexa_get_pipe_format(int depth, enum pipe_format *format, int *bbp)
5584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
5684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    switch (depth) {
5784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 32:
58b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_A8R8G8B8_UNORM;
59b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 32);
60b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
6184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 24:
62b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_X8R8G8B8_UNORM;
63b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 32);
64b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
6584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 16:
66b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_R5G6B5_UNORM;
67b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 16);
68b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
6984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 15:
70b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_A1R5G5B5_UNORM;
71b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 16);
72b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
7384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 8:
7484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 4:
7584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 1:
76b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_A8R8G8B8_UNORM; /* bad bad bad */
77b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
7884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    default:
7984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	assert(0);
80b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
8184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
8284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
8384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
8484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/*
8584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Static exported EXA functions
8684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */
8784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
8884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
8984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaWaitMarker(ScreenPtr pScreen, int marker)
9084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
9184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
9284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
9384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic int
9484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaMarkSync(ScreenPtr pScreen)
9584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
9684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return 1;
9784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
9884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
9984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
10084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareAccess(PixmapPtr pPix, int index)
10184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
10284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPix->drawable.pScreen;
10384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
10484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
10521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
10621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
10784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
10884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPix);
10984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
11084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
11184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
11284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
11384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv->tex)
11484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
115dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz
116dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    if (priv->map_count++ == 0)
11784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    {
11805aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer	if (exa->ctx->is_texture_referenced(exa->ctx, priv->tex, 0, 0) &
11905aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer	    PIPE_REFERENCED_FOR_WRITE)
12005aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer	    exa->ctx->flush(exa->ctx, 0, NULL);
12105aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer
12284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	priv->map_transfer =
12384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	    exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
12484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz					PIPE_TRANSFER_READ_WRITE,
12584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz					0, 0, priv->tex->width[0], priv->tex->height[0]);
12684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
12784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	pPix->devPrivate.ptr =
12884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	    exa->scrn->transfer_map(exa->scrn, priv->map_transfer);
12984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	pPix->devKind = priv->map_transfer->stride;
13084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
13184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
13284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return TRUE;
13384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
13484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
13584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
13684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaFinishAccess(PixmapPtr pPix, int index)
13784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
13884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPix->drawable.pScreen;
13984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
14084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
14121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
14221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
14384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPix);
14484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
14584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
14684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
14784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
14884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv->map_transfer)
14984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
15084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
151dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    if (--priv->map_count == 0) {
152dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	assert(priv->map_transfer);
153dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	exa->scrn->transfer_unmap(exa->scrn, priv->map_transfer);
154dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	exa->scrn->tex_transfer_destroy(priv->map_transfer);
155dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	priv->map_transfer = NULL;
156dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    }
15784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
15884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
15984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
16084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDone(PixmapPtr pPixmap)
16184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
16284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
16384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
16421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
16521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
16684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
16784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
16884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
16984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
17084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (priv->src_surf)
1715e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer	exa->scrn->tex_surface_destroy(priv->src_surf);
17284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv->src_surf = NULL;
17384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
17484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
17584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
17684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDoneComposite(PixmapPtr pPixmap)
17784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
17884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
17984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
18084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
18184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
18284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg)
18384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
18484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
18584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
18621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
18721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
18884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
18984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (1)
19084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz        return FALSE;
19184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
19284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (pPixmap->drawable.depth < 15)
19384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
19484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
19584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask))
19684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
19784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
19884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv || !priv->tex)
19984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
20084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
20184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (alu != GXcopy)
20284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
20384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
20484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!exa->ctx || !exa->ctx->surface_fill)
20584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
20684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
20784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv->color = fg;
20884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
20984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return TRUE;
21084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
21184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
21284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
21384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1)
21484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
21584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
21684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
21721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
21821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
21984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    struct pipe_surface *surf =
22084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
22184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz				   PIPE_BUFFER_USAGE_GPU_READ |
22284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz				   PIPE_BUFFER_USAGE_GPU_WRITE);
22384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
22484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    exa->ctx->surface_fill(exa->ctx, surf, x0, y0, x1 - x0, y1 - y0,
22584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz			   priv->color);
22684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
2275e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    exa->scrn->tex_surface_destroy(surf);
22884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
22984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
23084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
23184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir,
23284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	       int ydir, int alu, Pixel planeMask)
23384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
23484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
23584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
23621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
23721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
23821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap);
23984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
24084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (alu != GXcopy)
24184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
24284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
24384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (pSrcPixmap->drawable.depth < 15 || pDstPixmap->drawable.depth < 15)
24484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
24584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
24684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask))
24784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
24884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
24984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv || !src_priv)
25084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
25184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
25284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv->tex || !src_priv->tex)
25384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
25484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
25584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!exa->ctx || !exa->ctx->surface_copy)
25684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
25784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
25884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv->src_surf =
25984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	exa->scrn->get_tex_surface(exa->scrn, src_priv->tex, 0, 0, 0,
26084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz				   PIPE_BUFFER_USAGE_GPU_READ |
26184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz				   PIPE_BUFFER_USAGE_GPU_WRITE);
26284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
263dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    return TRUE;
26484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
26584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
26684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
26784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
26884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	int width, int height)
26984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
27084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
27184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
27221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
27321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
27484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    struct pipe_surface *surf =
27584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
27684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz				   PIPE_BUFFER_USAGE_GPU_READ |
27784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz				   PIPE_BUFFER_USAGE_GPU_WRITE);
27884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
279f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantz    exa->ctx->surface_copy(exa->ctx, surf, dstX, dstY, priv->src_surf,
28084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz			   srcX, srcY, width, height);
2815e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    exa->scrn->tex_surface_destroy(surf);
28284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
28384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
28484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
28584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareComposite(int op, PicturePtr pSrcPicture,
28684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		    PicturePtr pMaskPicture, PicturePtr pDstPicture,
28784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		    PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
28884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
28921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
29021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
29121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   struct exa_context *exa = ms->exa;
29221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
29321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture,
29421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                    pDstPicture);
29584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
29684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
29784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
29884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
29984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	     int dstX, int dstY, int width, int height)
30084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
30121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
30221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
30321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   struct exa_context *exa = ms->exa;
30421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDst);
30521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
30621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   xorg_composite(exa, priv, srcX, srcY, maskX, maskY,
30721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                  dstX, dstY, width, height);
30884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
30984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
31084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
31184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCheckComposite(int op,
31284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		  PicturePtr pSrcPicture, PicturePtr pMaskPicture,
31384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		  PicturePtr pDstPicture)
31484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
31521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   return xorg_composite_accelerated(op,
31621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                     pSrcPicture,
31721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                     pMaskPicture,
31821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                     pDstPicture);
31984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
32084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
32184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void *
32284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCreatePixmap(ScreenPtr pScreen, int size, int align)
32384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
32421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
32584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
32621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    priv = xcalloc(1, sizeof(struct exa_pixmap_priv));
32784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
32884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return NULL;
32984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
33084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return priv;
33184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
33284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
33384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
33484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
33584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
33621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = (struct exa_pixmap_priv *)dPriv;
33784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
33884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
33984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
34084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
34184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
34284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
34384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (priv->tex)
3445e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer	ms->screen->texture_destroy(priv->tex);
34584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
34684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    xfree(priv);
34784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
34884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
34984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
35084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPixmapIsOffscreen(PixmapPtr pPixmap)
35184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
35221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
35384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
35484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
35584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
35684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
35784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
35884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
35984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (priv->tex)
36084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return TRUE;
36184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
36284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return FALSE;
36384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
36484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
3653905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint
3663905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_displayed_usage(PixmapPtr pPixmap)
3673905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{
3683905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    struct exa_pixmap_priv *priv;
3693905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
3703905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
3713905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (!priv) {
3723905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	FatalError("NO PIXMAP PRIVATE\n");
3733905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	return 0;
3743905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    }
3753905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
376416ee3c53eeb1664784f224a42e293e5fed783bcMichel Dänzer    priv->flags |= PIPE_TEXTURE_USAGE_PRIMARY;
3773905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
3783905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    return 0;
3793905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz}
3803905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
3813905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint
3823905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_shared_usage(PixmapPtr pPixmap)
3833905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{
3843905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    struct exa_pixmap_priv *priv;
3853905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
3863905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
3873905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (!priv) {
3883905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	FatalError("NO PIXMAP PRIVATE\n");
3893905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	return 0;
3903905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    }
3913905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
392416ee3c53eeb1664784f224a42e293e5fed783bcMichel Dänzer    priv->flags |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
3933905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
3943905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    return 0;
3953905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz}
3963905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
39784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzunsigned
3983905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
39984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
40084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPixmap->drawable.pScreen;
40184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
40284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
40321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
40484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    struct pipe_buffer *buffer = NULL;
40584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    unsigned handle;
40684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    unsigned stride;
40784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
40884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!ms->exa) {
40984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	FatalError("NO MS->EXA\n");
41084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return 0;
41184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
41284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
41384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
41484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
41584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv) {
41684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	FatalError("NO PIXMAP PRIVATE\n");
41784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return 0;
41884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
41984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
420303cbb45b558a2b94e6922252cf57d115ba60b82Jakob Bornecrantz    ms->api->buffer_from_texture(ms->api, priv->tex, &buffer, &stride);
421303cbb45b558a2b94e6922252cf57d115ba60b82Jakob Bornecrantz    ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle);
4225e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer    pipe_buffer_reference(&buffer, NULL);
4233905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (stride_out)
4243905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	*stride_out = stride;
4253905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
42684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return handle;
42784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
42884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
42984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
43084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
43184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		      int depth, int bitsPerPixel, int devKind,
43284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		      pointer pPixData)
43384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
43484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPixmap->drawable.pScreen;
43584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
43621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
43784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
43821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
43984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
44084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
44184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
44284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
44384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (depth <= 0)
44484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	depth = pPixmap->drawable.depth;
44584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
44684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (bitsPerPixel <= 0)
44784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	bitsPerPixel = pPixmap->drawable.bitsPerPixel;
44884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
44984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (width <= 0)
45084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	width = pPixmap->drawable.width;
45184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
45284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (height <= 0)
45384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	height = pPixmap->drawable.height;
45484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
45584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (width <= 0 || height <= 0 || depth <= 0)
45684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
45784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
45884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    miModifyPixmapHeader(pPixmap, width, height, depth,
45984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz			     bitsPerPixel, devKind, NULL);
46084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
46184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    /* Deal with screen resize */
4623905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (priv->tex && (priv->tex->width[0] != width ||
4633905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz		      priv->tex->height[0] != height ||
4643905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz		      priv->tex_flags != priv->flags)) {
46584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	pipe_texture_reference(&priv->tex, NULL);
46684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
46784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
468b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer    if (!priv->tex
469b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#ifdef DRM_MODE_FEATURE_DIRTYFB
470b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer	&& priv->flags
471b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#endif
472b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer	) {
47384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	struct pipe_texture template;
47484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
47584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	memset(&template, 0, sizeof(template));
47684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	template.target = PIPE_TEXTURE_2D;
477b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	exa_get_pipe_format(depth, &template.format, &bitsPerPixel);
47884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	pf_get_block(template.format, &template.block);
47984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	template.width[0] = width;
48084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	template.height[0] = height;
48184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	template.depth[0] = 1;
48284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	template.last_level = 0;
4833905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET | priv->flags;
4843905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	priv->tex_flags = priv->flags;
48584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	priv->tex = exa->scrn->texture_create(exa->scrn, &template);
48684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
48784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
488b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#ifdef DRM_MODE_FEATURE_DIRTYFB
489b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer    if (!priv->tex) {
490b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer	if (pPixData)
491b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer	    pPixmap->devPrivate.ptr = pPixData;
492b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer	else
493b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer	    pPixmap->devPrivate.ptr = xalloc(pPixmap->drawable.height * pPixmap->devKind);
494b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer    } else
495b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#endif
496f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer    if (pPixData) {
497f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer	struct pipe_transfer *transfer =
498f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer	    exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
499f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer					PIPE_TRANSFER_WRITE,
500f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer					0, 0, width, height);
5018604a896a60a5f3f81d6ebecf827aeaddf8c640cBrian Paul        util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
502f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer                       &priv->tex->block, transfer->stride, 0, 0,
503f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer                       width, height, pPixData, pPixmap->devKind, 0, 0);
504f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer        exa->scrn->transfer_unmap(exa->scrn, transfer);
505f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer        exa->scrn->tex_transfer_destroy(transfer);
506f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer    }
507f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer
50884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return TRUE;
50984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
51084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
51184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstruct pipe_texture *
51284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_get_texture(PixmapPtr pPixmap)
51384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
51421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
51584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    struct pipe_texture *tex = NULL;
51684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    pipe_texture_reference(&tex, priv->tex);
51784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return tex;
51884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
51984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
52084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid
52184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_close(ScrnInfoPtr pScrn)
52284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
52384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
52421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
52584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
52617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    if (exa->cso) {
52717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin       cso_release_all(exa->cso);
52817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin       cso_destroy_context(exa->cso);
52917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    }
53017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
53184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (exa->ctx)
53284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	exa->ctx->destroy(exa->ctx);
53384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
53484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    exaDriverFini(pScrn->pScreen);
53584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    xfree(exa);
53684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ms->exa = NULL;
53784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
53884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
53984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid *
54084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_init(ScrnInfoPtr pScrn)
54184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
54284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
54321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa;
54484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ExaDriverPtr pExa;
54584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
54621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    exa = xcalloc(1, sizeof(struct exa_context));
54784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!exa)
54884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return NULL;
54984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
55084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    pExa = exaDriverAlloc();
55184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!pExa) {
55284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	goto out_err;
55384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
55484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
55584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    memset(pExa, 0, sizeof(*pExa));
55617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
55717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->exa_major         = 2;
55817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->exa_minor         = 2;
55917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->memoryBase        = 0;
56017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->memorySize        = 0;
56117076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->offScreenBase     = 0;
56284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    pExa->pixmapOffsetAlign = 0;
56317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->pixmapPitchAlign  = 1;
56417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->flags             = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS;
56517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->maxX              = 8191; /* FIXME */
56617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->maxY              = 8191; /* FIXME */
56717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
56817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->WaitMarker         = ExaWaitMarker;
56917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->MarkSync           = ExaMarkSync;
57017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->PrepareSolid       = ExaPrepareSolid;
57117076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->Solid              = ExaSolid;
57217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->DoneSolid          = ExaDone;
57317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->PrepareCopy        = ExaPrepareCopy;
57417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->Copy               = ExaCopy;
57517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->DoneCopy           = ExaDone;
57617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->CheckComposite     = ExaCheckComposite;
57717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->PrepareComposite   = ExaPrepareComposite;
57817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->Composite          = ExaComposite;
57917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->DoneComposite      = ExaDoneComposite;
58017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->PixmapIsOffscreen  = ExaPixmapIsOffscreen;
58117076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->PrepareAccess      = ExaPrepareAccess;
58217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->FinishAccess       = ExaFinishAccess;
58317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->CreatePixmap       = ExaCreatePixmap;
58417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    pExa->DestroyPixmap      = ExaDestroyPixmap;
58584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    pExa->ModifyPixmapHeader = ExaModifyPixmapHeader;
58684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
58784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!exaDriverInit(pScrn->pScreen, pExa)) {
58884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	goto out_err;
58984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
59084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
59184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    exa->scrn = ms->screen;
592303cbb45b558a2b94e6922252cf57d115ba60b82Jakob Bornecrantz    exa->ctx = ms->api->create_context(ms->api, exa->scrn);
59384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    /* Share context with DRI */
59484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ms->ctx = exa->ctx;
59584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
59617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin    exa->cso = cso_create_context(exa->ctx);
59717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
59884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return (void *)exa;
59984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
60084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz  out_err:
60184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    xorg_exa_close(pScrn);
60284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
60384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return NULL;
60484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
60584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
60684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* vim: set sw=4 ts=8 sts=4: */
607