xorg_exa.c revision be94a1d3bc147320ac7bfd98235783359bfada5c
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"
343f15ea866fbd82d873943f80b09124a618692a7cZack Rusin#include "xorg_exa_tgsi.h"
3521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
3621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <xorg-server.h>
3721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <xf86.h>
3821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <picturestr.h>
3921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include <picture.h>
4084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
4184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_format.h"
4284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_context.h"
4384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_state.h"
4484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz#include "pipe/p_inlines.h"
4584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
4617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "cso_cache/cso_context.h"
4717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
48f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer#include "util/u_rect.h"
49f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer
50ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#define DEBUG_SOLID 0
51ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin
5284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/*
5384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Helper functions
5484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */
5584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
56b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzstatic void
57b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzexa_get_pipe_format(int depth, enum pipe_format *format, int *bbp)
5884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
5984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    switch (depth) {
6084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 32:
61b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_A8R8G8B8_UNORM;
62b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 32);
63b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
6484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 24:
65b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_X8R8G8B8_UNORM;
66b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 32);
67b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
6884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 16:
69b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_R5G6B5_UNORM;
70b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 16);
71b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
7284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 15:
73b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_A1R5G5B5_UNORM;
74b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	assert(*bbp == 16);
75b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
7684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 8:
77be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer	*format = PIPE_FORMAT_A8_UNORM;
78be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer	assert(*bbp == 8);
79be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer	break;
8084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 4:
8184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    case 1:
82b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	*format = PIPE_FORMAT_A8R8G8B8_UNORM; /* bad bad bad */
83b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
8484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    default:
8584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	assert(0);
86b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz	break;
8784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
8884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
8984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
9057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusinstatic void
91feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusinxorg_exa_init_state(struct exa_context *exa)
92feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin{
93feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin   struct pipe_depth_stencil_alpha_state dsa;
94feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin
95feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin   /* set common initial clip state */
96feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin   memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
97feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin   cso_set_depth_stencil_alpha(exa->cso, &dsa);
98feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin}
99feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin
100feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusinstatic void
10157d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusinxorg_exa_common_done(struct exa_context *exa)
10257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin{
10357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   exa->copy.src = NULL;
10457d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   exa->copy.dst = NULL;
10557d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   exa->has_solid_color = FALSE;
10657d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   exa->num_bound_samplers = 0;
10757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin}
10857d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin
10984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/*
11084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Static exported EXA functions
11184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */
11284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
11384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
11484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaWaitMarker(ScreenPtr pScreen, int marker)
11584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
11684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
11784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
11884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic int
11984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaMarkSync(ScreenPtr pScreen)
12084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
12184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return 1;
12284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
12384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
12484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
125385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaDownloadFromScreen(PixmapPtr pPix, int x,  int y, int w,  int h, char *dst,
126385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer		      int dst_pitch)
127385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{
128385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    ScreenPtr pScreen = pPix->drawable.pScreen;
129385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
130385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    modesettingPtr ms = modesettingPTR(pScrn);
131385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    struct exa_context *exa = ms->exa;
132385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix);
133385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    struct pipe_transfer *transfer;
134385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
135385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    if (!priv || !priv->tex)
136385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer	return FALSE;
137385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
1388c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin    if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) &
139385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer	PIPE_REFERENCED_FOR_WRITE)
1408c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin	exa->pipe->flush(exa->pipe, 0, NULL);
141385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
142385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
143385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer					   PIPE_TRANSFER_READ, x, y, w, h);
144385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    if (!transfer)
145385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer	return FALSE;
146385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
147385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    util_copy_rect((unsigned char*)dst, &priv->tex->block, dst_pitch, 0, 0,
148385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer		   w, h, exa->scrn->transfer_map(exa->scrn, transfer),
149385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer		   transfer->stride, 0, 0);
150385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
151385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    exa->scrn->transfer_unmap(exa->scrn, transfer);
152385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    exa->scrn->tex_transfer_destroy(transfer);
153385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
154385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    return TRUE;
155385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer}
156385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
157385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool
158385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaUploadToScreen(PixmapPtr pPix, int x, int y, int w, int h, char *src,
159385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer		  int src_pitch)
160385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{
161385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    ScreenPtr pScreen = pPix->drawable.pScreen;
162385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
163385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    modesettingPtr ms = modesettingPTR(pScrn);
164385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    struct exa_context *exa = ms->exa;
165385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix);
166385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    struct pipe_transfer *transfer;
167385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
168385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    if (!priv || !priv->tex)
169385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer	return FALSE;
170385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
171385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
172385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer					   PIPE_TRANSFER_WRITE, x, y, w, h);
173385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    if (!transfer)
174385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer	return FALSE;
175385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
176385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
177385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer		   &priv->tex->block, transfer->stride, 0, 0, w, h,
178385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer		   (unsigned char*)src, src_pitch, 0, 0);
179385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
180385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    exa->scrn->transfer_unmap(exa->scrn, transfer);
181385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    exa->scrn->tex_transfer_destroy(transfer);
182385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
183385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer    return TRUE;
184385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer}
185385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer
186385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool
18784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareAccess(PixmapPtr pPix, int index)
18884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
18984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPix->drawable.pScreen;
19084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
19184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
19221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
19321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
19484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
19584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPix);
19684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
19784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
19884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
19984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
20084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv->tex)
20184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
202dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz
203dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    if (priv->map_count++ == 0)
20484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    {
2058c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin	if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) &
20605aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer	    PIPE_REFERENCED_FOR_WRITE)
2078c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin	    exa->pipe->flush(exa->pipe, 0, NULL);
20805aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer
20984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	priv->map_transfer =
21084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	    exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
21184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz					PIPE_TRANSFER_READ_WRITE,
21284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz					0, 0, priv->tex->width[0], priv->tex->height[0]);
21384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
21484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	pPix->devPrivate.ptr =
21584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	    exa->scrn->transfer_map(exa->scrn, priv->map_transfer);
21684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	pPix->devKind = priv->map_transfer->stride;
21784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
21884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
21984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return TRUE;
22084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
22184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
22284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
22384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaFinishAccess(PixmapPtr pPix, int index)
22484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
22584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPix->drawable.pScreen;
22684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
22784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
22821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
22921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
23084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPix);
23184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
23284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
23384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
23484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
23584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv->map_transfer)
23684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
23784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
238dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    if (--priv->map_count == 0) {
239dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	assert(priv->map_transfer);
240dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	exa->scrn->transfer_unmap(exa->scrn, priv->map_transfer);
241dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	exa->scrn->tex_transfer_destroy(priv->map_transfer);
242dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz	priv->map_transfer = NULL;
243d80242c2546f795e37ce88955c823c054fdfe217Jakob Bornecrantz	pPix->devPrivate.ptr = NULL;
244dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz    }
24584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
24684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
24784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
24884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDone(PixmapPtr pPixmap)
24984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
25084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
25184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
25221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
25321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
25484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
25584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
25684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
25784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
258974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin#if 1
259974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin    xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, NULL);
260974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin#else
261ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    xorg_exa_finish(exa);
26216886c8be34fd17ed34c83ed2e83af2c825c989dZack Rusin#endif
26357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin    xorg_exa_common_done(exa);
26484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
26584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
26684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
26784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDoneComposite(PixmapPtr pPixmap)
26884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
26957d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
27057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
27157d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   struct exa_context *exa = ms->exa;
27284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
27357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   xorg_exa_common_done(exa);
27484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
27584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
27684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
27784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg)
27884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
27984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
28084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
28121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
28221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
28384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
284ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#if 0
2856be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin    debug_printf("ExaPrepareSolid - test\n");
286ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#endif
28784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (pPixmap->drawable.depth < 15)
28884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
28984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
29084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask))
29184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
29284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
29384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv || !priv->tex)
29484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
29584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
29684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (alu != GXcopy)
29784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
29884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
2998c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin    if (!exa->pipe)
30084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
30184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
302ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin
303ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#if DEBUG_SOLID
304ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    fg = 0xffff0000;
305ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#endif
306ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin
307ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#if 1
3086be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin    debug_printf("  ExaPrepareSolid(0x%x)\n", fg);
309ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#endif
3103167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin    return xorg_solid_bind_state(exa, priv, fg);
31184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
31284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
31384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
31484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1)
31584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
31684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
31784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
31821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
31921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
32084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
3216be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin    debug_printf("\tExaSolid(%d, %d, %d, %d)\n", x0, y0, x1, y1);
3226be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
3236be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin#if 0
3246be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin    if (x0 == 0 && y0 == 0 &&
3256be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin        x1 == priv->tex->width[0] &&
3266be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin        y1 == priv->tex->height[0]) {
327ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin       exa->ctx->clear(exa->pipe, PIPE_CLEAR_COLOR,
3286be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin                       exa->solid_color, 1., 0);
3296be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin    } else
3306be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin#endif
331ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin
332ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#if DEBUG_SOLID
333ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    xorg_solid(exa, priv, 0, 0, 300, 300);
334ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    xorg_solid(exa, priv, 300, 300, 350, 350);
335ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    xorg_solid(exa, priv, 350, 350, 500, 500);
336ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    xorg_solid(exa, priv,
337ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin               priv->tex->width[0] - 10,
338ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin               priv->tex->height[0] - 10,
339ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin               priv->tex->width[0],
340ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin               priv->tex->height[0]);
341ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#else
342ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin    xorg_solid(exa, priv, x0, y0, x1, y1) ;
343ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#endif
34484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
34584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
34684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
34784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir,
34884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	       int ydir, int alu, Pixel planeMask)
34984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
35084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
35184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
35221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
35321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
35421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap);
35584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
3563167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin    debug_printf("ExaPrepareCopy\n");
3573167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin
35884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (alu != GXcopy)
35984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
36084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
36184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (pSrcPixmap->drawable.depth < 15 || pDstPixmap->drawable.depth < 15)
36284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
36384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
36484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask))
36584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
36684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
36784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv || !src_priv)
36884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
36984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
37084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv->tex || !src_priv->tex)
37184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
37284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
3738c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin    if (!exa->pipe)
37484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
37584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
37657d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin    exa->copy.src = src_priv;
37757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin    exa->copy.dst = priv;
37884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
37985a716bf627080c5b57653ddfca199e752f6906eZack Rusin    /*XXX disabled until some issues with syncing are fixed */
38085a716bf627080c5b57653ddfca199e752f6906eZack Rusin    return FALSE;
38184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
38284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
38384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
38484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
38584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	int width, int height)
38684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
38757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
38857d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
38957d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   struct exa_context *exa = ms->exa;
39057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
39157d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin
39257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   debug_printf("\tExaCopy(srcx=%d, srcy=%d, dstX=%d, dstY=%d, w=%d, h=%d)\n",
39357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin                srcX, srcY, dstX, dstY, width, height);
39484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
39557d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   debug_assert(priv == exa->copy.dst);
3963167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin
39757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin   xorg_copy_pixmap(exa, exa->copy.dst, dstX, dstY,
39857d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin                    exa->copy.src, srcX, srcY,
39957d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin                    width, height);
40084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
40184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
40284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
40384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareComposite(int op, PicturePtr pSrcPicture,
40484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		    PicturePtr pMaskPicture, PicturePtr pDstPicture,
40584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		    PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
40684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
40721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
40821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
40921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   struct exa_context *exa = ms->exa;
41021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
4116be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   debug_printf("ExaPrepareComposite\n");
4123167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin
41321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture,
414f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                    pDstPicture,
415f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                    exaGetPixmapDriverPrivate(pSrc),
416f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                    exaGetPixmapDriverPrivate(pMask),
417f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                    exaGetPixmapDriverPrivate(pDst));
41884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
41984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
42084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
42184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
42284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	     int dstX, int dstY, int width, int height)
42384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
42421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
42521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
42621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   struct exa_context *exa = ms->exa;
42721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDst);
42821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
4296be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   debug_printf("\tExaComposite\n");
4303167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin
43121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   xorg_composite(exa, priv, srcX, srcY, maskX, maskY,
43221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                  dstX, dstY, width, height);
43384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
43484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
43584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
43684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCheckComposite(int op,
43784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		  PicturePtr pSrcPicture, PicturePtr pMaskPicture,
43884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		  PicturePtr pDstPicture)
43984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
44021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin   return xorg_composite_accelerated(op,
44121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                     pSrcPicture,
44221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                     pMaskPicture,
44321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                     pDstPicture);
44484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
44584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
44684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void *
44784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCreatePixmap(ScreenPtr pScreen, int size, int align)
44884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
44921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
45084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
45121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    priv = xcalloc(1, sizeof(struct exa_pixmap_priv));
45284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
45384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return NULL;
45484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
45584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return priv;
45684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
45784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
45884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void
45984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
46084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
46121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = (struct exa_pixmap_priv *)dPriv;
46284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
46384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
46484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
46584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
46684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return;
46784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
46884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (priv->tex)
4695e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer	ms->screen->texture_destroy(priv->tex);
47084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
47184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    xfree(priv);
47284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
47384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
47484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
47584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPixmapIsOffscreen(PixmapPtr pPixmap)
47684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
47721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
47884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
47984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
48084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
48184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv)
48284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
48384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
48484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (priv->tex)
48584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return TRUE;
48684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
48784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return FALSE;
48884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
48984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
4903905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint
4913905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_displayed_usage(PixmapPtr pPixmap)
4923905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{
4933905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    struct exa_pixmap_priv *priv;
4943905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
4953905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
4963905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (!priv) {
4973905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	FatalError("NO PIXMAP PRIVATE\n");
4983905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	return 0;
4993905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    }
5003905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
501416ee3c53eeb1664784f224a42e293e5fed783bcMichel Dänzer    priv->flags |= PIPE_TEXTURE_USAGE_PRIMARY;
5023905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
5033905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    return 0;
5043905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz}
5053905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
5063905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint
5073905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_shared_usage(PixmapPtr pPixmap)
5083905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{
5093905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    struct exa_pixmap_priv *priv;
5103905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
5113905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
5123905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (!priv) {
5133905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	FatalError("NO PIXMAP PRIVATE\n");
5143905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	return 0;
5153905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    }
5163905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
517416ee3c53eeb1664784f224a42e293e5fed783bcMichel Dänzer    priv->flags |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
5183905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
5193905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    return 0;
5203905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz}
5213905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
52284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzunsigned
5233905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
52484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
52584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPixmap->drawable.pScreen;
52684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
52784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
52821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv;
52984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    unsigned handle;
53084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    unsigned stride;
53184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
53284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!ms->exa) {
53384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	FatalError("NO MS->EXA\n");
53484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return 0;
53584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
53684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
53784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    priv = exaGetPixmapDriverPrivate(pPixmap);
53884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
53984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (!priv) {
54084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	FatalError("NO PIXMAP PRIVATE\n");
54184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return 0;
54284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    }
54384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
5441e5014f7dfabcaf1f4b5608eb08e97179446eb09Jakob Bornecrantz    ms->api->local_handle_from_texture(ms->api, ms->screen, priv->tex, &stride, &handle);
5453905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz    if (stride_out)
5463905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz	*stride_out = stride;
5473905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz
54884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return handle;
54984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
55084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
55184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool
55284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
55384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		      int depth, int bitsPerPixel, int devKind,
55484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz		      pointer pPixData)
55584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
55684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScreenPtr pScreen = pPixmap->drawable.pScreen;
55784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
55821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
55984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    modesettingPtr ms = modesettingPTR(pScrn);
56021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin    struct exa_context *exa = ms->exa;
56184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
56240e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer    if (!priv || pPixData)
56384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
56484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
56584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (depth <= 0)
56684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	depth = pPixmap->drawable.depth;
56784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
56884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (bitsPerPixel <= 0)
56984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	bitsPerPixel = pPixmap->drawable.bitsPerPixel;
57084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
57184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (width <= 0)
57284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	width = pPixmap->drawable.width;
57384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
57484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (height <= 0)
57584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	height = pPixmap->drawable.height;
57684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
57784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    if (width <= 0 || height <= 0 || depth <= 0)
57884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz	return FALSE;
57984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
58084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    miModifyPixmapHeader(pPixmap, width, height, depth,
58184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz			     bitsPerPixel, devKind, NULL);
58284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
58384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    /* Deal with screen resize */
5843c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer    if (!priv->tex ||
5853c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer        (priv->tex->width[0] != width ||
5863c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer         priv->tex->height[0] != height ||
5873c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer         priv->tex_flags != priv->flags)) {
5883c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	struct pipe_texture *texture = NULL;
58984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
590b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#ifdef DRM_MODE_FEATURE_DIRTYFB
5913c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	if (priv->flags)
592b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#endif
5933c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	{
5943c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    struct pipe_texture template;
5953c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer
5963c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    memset(&template, 0, sizeof(template));
5973c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    template.target = PIPE_TEXTURE_2D;
5983c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    exa_get_pipe_format(depth, &template.format, &bitsPerPixel);
5993c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    pf_get_block(template.format, &template.block);
6003c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    template.width[0] = width;
6013c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    template.height[0] = height;
6023c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    template.depth[0] = 1;
6033c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    template.last_level = 0;
6043c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET | priv->flags;
6053c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    priv->tex_flags = priv->flags;
6063c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    texture = exa->scrn->texture_create(exa->scrn, &template);
6073c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer
6083c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    if (priv->tex) {
6093c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		struct pipe_surface *dst_surf;
61057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin                struct pipe_surface *src_surf;
6113c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer
6123c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		dst_surf = exa->scrn->get_tex_surface(exa->scrn, texture, 0, 0, 0,
6133c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer						      PIPE_BUFFER_USAGE_GPU_WRITE);
61457d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin		src_surf = exa_gpu_surface(exa, priv);
6158c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin		exa->pipe->surface_copy(exa->pipe, dst_surf, 0, 0, src_surf,
6168c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin                                        0, 0, min(width, texture->width[0]),
6178c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin                                        min(height, texture->height[0]));
6183c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		exa->scrn->tex_surface_destroy(dst_surf);
61957d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin		exa->scrn->tex_surface_destroy(src_surf);
6207b32da0b11a769be057cdd3e619d582b433bbb0eJakob Bornecrantz	    } else if (pPixmap->devPrivate.ptr) {
6213c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		struct pipe_transfer *transfer;
6223c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer
6233c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		if (priv->map_count != 0)
6243c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		     FatalError("doing ExaModifyPixmapHeader on mapped buffer\n");
6253c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer
6263c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		transfer =
6273c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		    exa->scrn->get_tex_transfer(exa->scrn, texture, 0, 0, 0,
6283c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer						PIPE_TRANSFER_WRITE,
6293c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer						0, 0, width, height);
6303c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
6313c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer			       &texture->block, transfer->stride, 0, 0,
6323c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer			       width, height, pPixmap->devPrivate.ptr,
6333c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer			       pPixmap->devKind, 0, 0);
6343c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		exa->scrn->transfer_unmap(exa->scrn, transfer);
6353c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer		exa->scrn->tex_transfer_destroy(transfer);
636e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer
637e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer		xfree(pPixmap->devPrivate.ptr);
638e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer		pPixmap->devPrivate.ptr = NULL;
6393c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    }
6403c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	}
641b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#ifdef DRM_MODE_FEATURE_DIRTYFB
6423c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	else {
6433c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    xfree(pPixmap->devPrivate.ptr);
6443c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	    pPixmap->devPrivate.ptr = xalloc(pPixmap->drawable.height *
6453c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer					     pPixmap->devKind);
6463c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	}
647b2e1b258812167ce8d33f5978f877439e280a1e4Michel Dänzer#endif
64840e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer
6493c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer	pipe_texture_reference(&priv->tex, texture);
650f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer    }
651f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer
65284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz    return TRUE;
65384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
65484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
65584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstruct pipe_texture *
65684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_get_texture(PixmapPtr pPixmap)
65784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
658f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
659f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct pipe_texture *tex = NULL;
660f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pipe_texture_reference(&tex, priv->tex);
661f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   return tex;
66284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
66384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
66484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid
66584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_close(ScrnInfoPtr pScrn)
66684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
667f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
668f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct exa_context *exa = ms->exa;
669f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct pipe_constant_buffer *vsbuf = &exa->vs_const_buffer;
670f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct pipe_constant_buffer *fsbuf = &exa->fs_const_buffer;
67184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
672f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (exa->shaders) {
673f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      xorg_shaders_destroy(exa->shaders);
674f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   }
6753f15ea866fbd82d873943f80b09124a618692a7cZack Rusin
676f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (vsbuf && vsbuf->buffer)
677f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      pipe_buffer_reference(&vsbuf->buffer, NULL);
678f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
679f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (fsbuf && fsbuf->buffer)
680f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      pipe_buffer_reference(&fsbuf->buffer, NULL);
681f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
682f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (exa->cso) {
683f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      cso_release_all(exa->cso);
684f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      cso_destroy_context(exa->cso);
685f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   }
68617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
6878c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   if (exa->pipe)
6888c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin      exa->pipe->destroy(exa->pipe);
68984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
690f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   exaDriverFini(pScrn->pScreen);
691f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   xfree(exa);
692f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   ms->exa = NULL;
69384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
69484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
69584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid *
69684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_init(ScrnInfoPtr pScrn)
69784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{
698f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   modesettingPtr ms = modesettingPTR(pScrn);
699f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct exa_context *exa;
700f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   ExaDriverPtr pExa;
701f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
702f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   exa = xcalloc(1, sizeof(struct exa_context));
703f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (!exa)
704f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      return NULL;
705f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
706f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa = exaDriverAlloc();
707f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (!pExa) {
708f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      goto out_err;
709f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   }
710f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
711f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   memset(pExa, 0, sizeof(*pExa));
712f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
713f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->exa_major         = 2;
714f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->exa_minor         = 2;
715f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->memoryBase        = 0;
716f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->memorySize        = 0;
717f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->offScreenBase     = 0;
718f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->pixmapOffsetAlign = 0;
719f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->pixmapPitchAlign  = 1;
720f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->flags             = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS;
721e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_SUPPORTS_PREPARE_AUX
722e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer   pExa->flags            |= EXA_SUPPORTS_PREPARE_AUX;
723e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif
724e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_MIXED_PIXMAPS
725e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer   pExa->flags            |= EXA_MIXED_PIXMAPS;
726e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif
727f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->maxX              = 8191; /* FIXME */
728f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->maxY              = 8191; /* FIXME */
729f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
730f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->WaitMarker         = ExaWaitMarker;
731f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->MarkSync           = ExaMarkSync;
732f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->PrepareSolid       = ExaPrepareSolid;
733f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->Solid              = ExaSolid;
734f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->DoneSolid          = ExaDone;
735f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->PrepareCopy        = ExaPrepareCopy;
736f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->Copy               = ExaCopy;
737f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->DoneCopy           = ExaDone;
738f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->CheckComposite     = ExaCheckComposite;
739f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->PrepareComposite   = ExaPrepareComposite;
740f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->Composite          = ExaComposite;
741f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->DoneComposite      = ExaDoneComposite;
742f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->PixmapIsOffscreen  = ExaPixmapIsOffscreen;
743385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer   pExa->DownloadFromScreen = ExaDownloadFromScreen;
744385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer   pExa->UploadToScreen     = ExaUploadToScreen;
745f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->PrepareAccess      = ExaPrepareAccess;
746f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->FinishAccess       = ExaFinishAccess;
747f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->CreatePixmap       = ExaCreatePixmap;
748f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->DestroyPixmap      = ExaDestroyPixmap;
749f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   pExa->ModifyPixmapHeader = ExaModifyPixmapHeader;
750f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
751f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   if (!exaDriverInit(pScrn->pScreen, pExa)) {
752f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin      goto out_err;
753f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   }
754f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
755f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   exa->scrn = ms->screen;
7568c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   exa->pipe = ms->api->create_context(ms->api, exa->scrn);
757f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   /* Share context with DRI */
7588c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   ms->ctx = exa->pipe;
759f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
7608c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   exa->cso = cso_create_context(exa->pipe);
761f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   exa->shaders = xorg_shaders_create(exa);
762f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
763feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin   xorg_exa_init_state(exa);
764feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin
765f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   return (void *)exa;
766f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
767f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinout_err:
768f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   xorg_exa_close(pScrn);
769f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
770f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   return NULL;
771f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin}
77284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
773f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstruct pipe_surface *
774f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinexa_gpu_surface(struct exa_context *exa, struct exa_pixmap_priv *priv)
775f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin{
776f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   return exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
777f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                     PIPE_BUFFER_USAGE_GPU_READ |
778f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                     PIPE_BUFFER_USAGE_GPU_WRITE);
77984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
78084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz}
78184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz
782974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_flush(struct exa_context *exa, uint pipeFlushFlags,
783974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin                    struct pipe_fence_handle **fence)
784974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{
7858c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   exa->pipe->flush(exa->pipe, pipeFlushFlags, fence);
786974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin}
787974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin
788974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_finish(struct exa_context *exa)
789974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{
790974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin   struct pipe_fence_handle *fence = NULL;
791974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin
792974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin   xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, &fence);
793974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin
7948c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 0);
7958c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin   exa->pipe->screen->fence_reference(exa->pipe->screen, &fence, NULL);
796974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin}
797974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin
798