xorg_exa.c revision a016043386045d7cc35d70e42d963704fcae3731
1a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar/*
2a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
3a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * All Rights Reserved.
4a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar *
5a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * Permission is hereby granted, free of charge, to any person obtaining a
6a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * copy of this software and associated documentation files (the
7a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * "Software"), to deal in the Software without restriction, including
8a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * without limitation the rights to use, copy, modify, merge, publish,
9a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * distribute, sub license, and/or sell copies of the Software, and to
100bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola * permit persons to whom the Software is furnished to do so, subject to
11af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola * the following conditions:
12a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar *
13ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner * The above copyright notice and this permission notice (including the
14c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby * next paragraph) shall be included in all copies or substantial portions
15ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola * of the Software.
16484291c27319668ad99cb87def000254357736fbRafael Espindola *
17d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1858bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
192fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2058bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
213580dea910d622f2a6dbb72e97f5f7d0ef979542Chris Lattner * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola *
2540de0e013a456971697491b428fb903570e8766eCharles Davis *
262df9f8df9541e7650876413cde555eb3d285be4bBenjamin Kramer * Author: Alan Hourihane <alanh@tungstengraphics.com>
272fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson * Author: Jakob Bornecrantz <wallbraker@gmail.com>
282fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson *
292fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson */
307d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger
317d0805dcb82e9ba1d90ce8d702169683b9caded7Joerg Sonnenberger#include "xorg_exa.h"
32a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include "xorg_tracker.h"
33a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include "xorg_composite.h"
34a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include "xorg_exa_tgsi.h"
354eeb7b662b78f5c520fb258b3f9df18b1227cde5Charles Davis
364eeb7b662b78f5c520fb258b3f9df18b1227cde5Charles Davis#include <xorg-server.h>
37a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar#include <xf86.h>
38ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner#include <picturestr.h>
39a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include <picture.h>
40a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola
41a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include "pipe/p_format.h"
42a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include "pipe/p_context.h"
43a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include "pipe/p_state.h"
44a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include "pipe/p_inlines.h"
45a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola
46a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include "cso_cache/cso_context.h"
47a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola
48a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#include "util/u_rect.h"
49a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola
50a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola#define DEBUG_SOLID 0
51a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola
52a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindola/*
5378ff647e4471c88c3a3826e7ac24adcd8a9a2073Rafael Espindola * Helper functions
5478ff647e4471c88c3a3826e7ac24adcd8a9a2073Rafael Espindola */
55a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindola
56a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindolastatic void
57a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindolaexa_get_pipe_format(int depth, enum pipe_format *format, int *bbp)
58a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindola{
59a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindola    switch (depth) {
60a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola    case 32:
61a37bd1d02c0e3d93474fdf30352bf4a425cbe25bRafael Espindola	*format = PIPE_FORMAT_A8R8G8B8_UNORM;
62d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner	assert(*bbp == 32);
63d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner	break;
64d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner    case 24:
65d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner	*format = PIPE_FORMAT_X8R8G8B8_UNORM;
66d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner	assert(*bbp == 32);
6732a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	break;
6832a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola    case 16:
6932a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	*format = PIPE_FORMAT_R5G6B5_UNORM;
7032a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	assert(*bbp == 16);
7132a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	break;
7232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola    case 15:
7332a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	*format = PIPE_FORMAT_A1R5G5B5_UNORM;
7432a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	assert(*bbp == 16);
7532a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	break;
7632a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola    case 8:
7732a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola	*format = PIPE_FORMAT_A8_UNORM;
78d79d9dce47d505369662ae5111dba24f9ccdef68Chris Lattner	assert(*bbp == 8);
7932ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner	break;
8032ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner    case 4:
8132ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner    case 1:
8232ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner	*format = PIPE_FORMAT_A8R8G8B8_UNORM; /* bad bad bad */
83dea914bed9fb1d5c08e944557989ccddb6849000Devang Patel	break;
84818b5f5dd7979b097564f829896353df286127ffMatt Beaumont-Gay    default:
85818b5f5dd7979b097564f829896353df286127ffMatt Beaumont-Gay	assert(0);
862df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola	break;
871be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng    }
8865891533a3b35d7fc8fa807a96b7ee2f09ff22b5Roman Divacky}
8965891533a3b35d7fc8fa807a96b7ee2f09ff22b5Roman Divacky
9065891533a3b35d7fc8fa807a96b7ee2f09ff22b5Roman Divackystatic void
9165891533a3b35d7fc8fa807a96b7ee2f09ff22b5Roman Divackyxorg_exa_init_state(struct exa_context *exa)
922df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola{
9332ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner   struct pipe_depth_stencil_alpha_state dsa;
9432ae3fe0ba469240753e2342e36485f7c9acfb5cChris Lattner
953ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola   /* set common initial clip state */
963ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola   memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
973ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola   cso_set_depth_stencil_alpha(exa->cso, &dsa);
98660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola}
99660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola
100660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindolastatic void
101660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindolaxorg_exa_common_done(struct exa_context *exa)
102c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby{
103c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby   exa->copy.src = NULL;
1043ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola   exa->copy.dst = NULL;
1053ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola   exa->has_solid_color = FALSE;
1063ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola   exa->num_bound_samplers = 0;
107660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola}
108660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola
109660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola/*
110660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola * Static exported EXA functions
111c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby */
112c095793b4ab027181605c79c9808df12afe45d63Kevin Enderby
1130bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindolastatic void
1140bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael EspindolaExaWaitMarker(ScreenPtr pScreen, int marker)
115a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindola{
116a6f2678f08299f053feb58337fc4322131d99bf4Rafael Espindola}
1170bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindola
1180bbe0b440ee2cef47dcb7b281825eb70341c16ddRafael Espindolastatic int
11989b9372605db2ce3b0085c84089e389f7bc1fbddRafael EspindolaExaMarkSync(ScreenPtr pScreen)
12089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola{
12189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    return 1;
122debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola}
12389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
12489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindolastatic Bool
12589b9372605db2ce3b0085c84089e389f7bc1fbddRafael EspindolaExaDownloadFromScreen(PixmapPtr pPix, int x,  int y, int w,  int h, char *dst,
126debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola		      int dst_pitch)
127debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola{
12889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    ScreenPtr pScreen = pPix->drawable.pScreen;
12989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
13089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    modesettingPtr ms = modesettingPTR(pScrn);
1313e03211625bba5bbb70a193c140ebf4dd8388bb7Rafael Espindola    struct exa_context *exa = ms->exa;
1323e03211625bba5bbb70a193c140ebf4dd8388bb7Rafael Espindola    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix);
1333e03211625bba5bbb70a193c140ebf4dd8388bb7Rafael Espindola    struct pipe_transfer *transfer;
1343e03211625bba5bbb70a193c140ebf4dd8388bb7Rafael Espindola
135ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner    if (!priv || !priv->tex)
136ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner	return FALSE;
137aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner
138aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner    if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) &
139ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner	PIPE_REFERENCED_FOR_WRITE)
140ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner	exa->pipe->flush(exa->pipe, 0, NULL);
141aaec205b87637cd0d59d4f11630db603686eb73dChris Lattner
142ddf6bdde44287b5b559bc403a02ff971e15e8303Chris Lattner    transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
14391bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner					   PIPE_TRANSFER_READ, x, y, w, h);
144af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola    if (!transfer)
145af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola	return FALSE;
146af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola
147af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola    util_copy_rect((unsigned char*)dst, &priv->tex->block, dst_pitch, 0, 0,
148af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola		   w, h, exa->scrn->transfer_map(exa->scrn, transfer),
149af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola		   transfer->stride, 0, 0);
150af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola
151af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola    exa->scrn->transfer_unmap(exa->scrn, transfer);
1523f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel    exa->scrn->tex_transfer_destroy(transfer);
1533f3bf9387b75f4c932e4c59bd7af719d26ae4b99Devang Patel
154af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola    return TRUE;
155af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola}
156af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindola
157af6b5808756d6ce335df9eb158efa33894b401c4Rafael Espindolastatic Bool
15889b9372605db2ce3b0085c84089e389f7bc1fbddRafael EspindolaExaUploadToScreen(PixmapPtr pPix, int x, int y, int w, int h, char *src,
15989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola		  int src_pitch)
16089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola{
16189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    ScreenPtr pScreen = pPix->drawable.pScreen;
16289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
16389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    modesettingPtr ms = modesettingPTR(pScrn);
16489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    struct exa_context *exa = ms->exa;
16589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix);
16689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    struct pipe_transfer *transfer;
16789b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
16889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    if (!priv || !priv->tex)
16989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola	return FALSE;
1708bca4106dfc2945723251db10e340183f3e372ddRafael Espindola
1718bca4106dfc2945723251db10e340183f3e372ddRafael Espindola    transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
1728bca4106dfc2945723251db10e340183f3e372ddRafael Espindola					   PIPE_TRANSFER_WRITE, x, y, w, h);
1738bca4106dfc2945723251db10e340183f3e372ddRafael Espindola    if (!transfer)
174ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola	return FALSE;
175ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola
176ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola    util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
177ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola		   &priv->tex->block, transfer->stride, 0, 0, w, h,
17849cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola		   (unsigned char*)src, src_pitch, 0, 0);
179ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola
180ed708f9c1facb9928ef2f79503e7030c8f25b00dRafael Espindola    exa->scrn->transfer_unmap(exa->scrn, transfer);
1812fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    exa->scrn->tex_transfer_destroy(transfer);
1822fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
1832fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    return TRUE;
1842fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson}
1852fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
1862fec6c5ff153786744ba7d0d302b73179731c5e9Owen Andersonstatic Bool
1872fec6c5ff153786744ba7d0d302b73179731c5e9Owen AndersonExaPrepareAccess(PixmapPtr pPix, int index)
1882fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson{
1892fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    ScreenPtr pScreen = pPix->drawable.pScreen;
1902fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1912fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    modesettingPtr ms = modesettingPTR(pScrn);
1922fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    struct exa_context *exa = ms->exa;
1932fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    struct exa_pixmap_priv *priv;
1942fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
1952fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    priv = exaGetPixmapDriverPrivate(pPix);
1962fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
1972fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (!priv)
1982fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	return FALSE;
1992fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2002fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (!priv->tex)
2012fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	return FALSE;
2022fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2032fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (priv->map_count++ == 0)
2042fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    {
2052fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) &
2062fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	    PIPE_REFERENCED_FOR_WRITE)
2072fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	    exa->pipe->flush(exa->pipe, 0, NULL);
2082fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2092fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	priv->map_transfer =
2102fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	    exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
2112fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson					PIPE_TRANSFER_READ_WRITE,
2122fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson					0, 0, priv->tex->width[0], priv->tex->height[0]);
2132fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2142fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	pPix->devPrivate.ptr =
2152fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	    exa->scrn->transfer_map(exa->scrn, priv->map_transfer);
2162fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	pPix->devKind = priv->map_transfer->stride;
2172fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    }
2182fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2192fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    return TRUE;
2202fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson}
2212fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2222fec6c5ff153786744ba7d0d302b73179731c5e9Owen Andersonstatic void
2232fec6c5ff153786744ba7d0d302b73179731c5e9Owen AndersonExaFinishAccess(PixmapPtr pPix, int index)
2242fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson{
2252fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    ScreenPtr pScreen = pPix->drawable.pScreen;
2262fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
2272fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    modesettingPtr ms = modesettingPTR(pScrn);
2282fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    struct exa_context *exa = ms->exa;
2292fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    struct exa_pixmap_priv *priv;
2302fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    priv = exaGetPixmapDriverPrivate(pPix);
2312fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2322fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (!priv)
2332fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	return;
2342fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2352fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (!priv->map_transfer)
2362fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	return;
2372fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2382fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (--priv->map_count == 0) {
2392fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	assert(priv->map_transfer);
2402fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	exa->scrn->transfer_unmap(exa->scrn, priv->map_transfer);
2412fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	exa->scrn->tex_transfer_destroy(priv->map_transfer);
2422fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	priv->map_transfer = NULL;
2432fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	pPix->devPrivate.ptr = NULL;
2442fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    }
2452fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson}
2462fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2472fec6c5ff153786744ba7d0d302b73179731c5e9Owen Andersonstatic void
2482fec6c5ff153786744ba7d0d302b73179731c5e9Owen AndersonExaDone(PixmapPtr pPixmap)
2492fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson{
2502fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
2512fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    modesettingPtr ms = modesettingPTR(pScrn);
2522fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
2532fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    struct exa_context *exa = ms->exa;
2542fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2552fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (!priv)
2562fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson	return;
2572fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson
2582fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson#if 1
2592fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, NULL);
2602fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson#else
2612fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    xorg_exa_finish(exa);
262d967578a8c506be341d20a1558eebb31484b8b6dBill Wendling#endif
263d967578a8c506be341d20a1558eebb31484b8b6dBill Wendling    xorg_exa_common_done(exa);
264d967578a8c506be341d20a1558eebb31484b8b6dBill Wendling}
265d967578a8c506be341d20a1558eebb31484b8b6dBill Wendling
266d967578a8c506be341d20a1558eebb31484b8b6dBill Wendlingstatic void
267d967578a8c506be341d20a1558eebb31484b8b6dBill WendlingExaDoneComposite(PixmapPtr pPixmap)
268f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola{
269713c4bfc36260bfc9273d414b14757bd7819f9b1Rafael Espindola   ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
270f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola   modesettingPtr ms = modesettingPTR(pScrn);
271f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola   struct exa_context *exa = ms->exa;
272f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola
273f9efd83166401bca542c6702ea329f9901c4e04bRafael Espindola   xorg_exa_common_done(exa);
274066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola}
27589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
276066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindolastatic Bool
27789b9372605db2ce3b0085c84089e389f7bc1fbddRafael EspindolaExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg)
27849cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola{
2795fbe5e783ee0c5ae27c17490a752d7e603e84ed2Evan Cheng    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
28049cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola    modesettingPtr ms = modesettingPTR(pScrn);
28149cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
28249cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola    struct exa_context *exa = ms->exa;
28349cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola
28449cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola#if 0
2855fbe5e783ee0c5ae27c17490a752d7e603e84ed2Evan Cheng    debug_printf("ExaPrepareSolid - test\n");
28649cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola#endif
28749cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola    if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask))
28849cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola	return FALSE;
28949cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola
29049cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola    if (!priv || !priv->tex)
29149cb9b88867426d1a430f248550d3cc785a68fe4Rafael Espindola	return FALSE;
29289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
2932fec6c5ff153786744ba7d0d302b73179731c5e9Owen Anderson    if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format,
294cdfecc8759941c2996214070478d30084b79d463Rafael Espindola                                        priv->tex->target,
295cdfecc8759941c2996214070478d30084b79d463Rafael Espindola                                        PIPE_TEXTURE_USAGE_RENDER_TARGET, 0))
296066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola	return FALSE;
29789b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
29889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    if (alu != GXcopy)
29989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola	return FALSE;
30089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
301cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    if (!exa->pipe)
302cdfecc8759941c2996214070478d30084b79d463Rafael Espindola	return FALSE;
303066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola
304b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola
305b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola#if DEBUG_SOLID
306b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola    fg = 0xffff0000;
307b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola#endif
308b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola
309b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola#if 1
310b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola    debug_printf("  ExaPrepareSolid(0x%x)\n", fg);
311b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola#endif
312b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola
313b40a71fda188f8ca564e606ac2cb051a44ada311Rafael Espindola    return xorg_solid_bind_state(exa, priv, fg);
314066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola}
31589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
3165bba08425374ca36fe5fbc7423ce1a09858e4097Rafael Espindolastatic void
3175bba08425374ca36fe5fbc7423ce1a09858e4097Rafael EspindolaExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1)
3185bba08425374ca36fe5fbc7423ce1a09858e4097Rafael Espindola{
3195bba08425374ca36fe5fbc7423ce1a09858e4097Rafael Espindola    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
3205bba08425374ca36fe5fbc7423ce1a09858e4097Rafael Espindola    modesettingPtr ms = modesettingPTR(pScrn);
321fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola    struct exa_context *exa = ms->exa;
322fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
323cdfecc8759941c2996214070478d30084b79d463Rafael Espindola
324cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    debug_printf("\tExaSolid(%d, %d, %d, %d)\n", x0, y0, x1, y1);
3255d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola
3265d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola#if 0
3275d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola    if (x0 == 0 && y0 == 0 &&
3285d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola        x1 == priv->tex->width[0] &&
3295d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola        y1 == priv->tex->height[0]) {
3305d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola       exa->ctx->clear(exa->pipe, PIPE_CLEAR_COLOR,
3315d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola                       exa->solid_color, 1., 0);
3325d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola    } else
3335d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola#endif
3345d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola
3355d7dcd3335234d2a2bc16dc69f86fbb5dcaa8962Rafael Espindola#if DEBUG_SOLID
336066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola       exa->solid_color[0] = 0.f;
33789b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola       exa->solid_color[1] = 1.f;
338b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola       exa->solid_color[2] = 0.f;
339b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola       exa->solid_color[3] = 1.f;
340b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola    xorg_solid(exa, priv, 0, 0, 1024, 768);
341b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola       exa->solid_color[0] = 1.f;
342b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola       exa->solid_color[1] = 0.f;
343b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola       exa->solid_color[2] = 0.f;
344b4601bd2ffdde372f1323f6b6ec98acd433501ceRafael Espindola       exa->solid_color[3] = 1.f;
345cdfecc8759941c2996214070478d30084b79d463Rafael Espindola       xorg_solid(exa, priv, 0, 0, 300, 300);
346cdfecc8759941c2996214070478d30084b79d463Rafael Espindola       xorg_solid(exa, priv, 300, 300, 350, 350);
347066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola       xorg_solid(exa, priv, 350, 350, 500, 500);
34889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
349b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola       xorg_solid(exa, priv,
350b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola               priv->tex->width[0] - 10,
351b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola               priv->tex->height[0] - 10,
352b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola               priv->tex->width[0],
353b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola               priv->tex->height[0]);
354b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola
355b790a17efba26f4365b5ffb847dd53fde063c48dRafael Espindola    exa->solid_color[0] = 0.f;
356cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    exa->solid_color[1] = 0.f;
357cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    exa->solid_color[2] = 1.f;
35825f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola    exa->solid_color[3] = 1.f;
35925f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola
36025f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola    exa->has_solid_color = FALSE;
36125f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola    ExaPrepareCopy(pPixmap, pPixmap, 0, 0, GXcopy, 0xffffffff);
36225f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola    ExaCopy(pPixmap, 0, 0, 50, 50, 500, 500);
36325f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola#else
36425f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola    xorg_solid(exa, priv, x0, y0, x1, y1) ;
36525f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola#endif
36625f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola}
36725f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindola
36825f492e77858dc5a95fcd7180e73aff47925b668Rafael Espindolastatic Bool
369066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael EspindolaExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir,
3703a83c40ab61d5ca624f2bbadd70237c6adbdb304Rafael Espindola	       int ydir, int alu, Pixel planeMask)
37189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola{
37289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
37389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    modesettingPtr ms = modesettingPTR(pScrn);
3743a83c40ab61d5ca624f2bbadd70237c6adbdb304Rafael Espindola    struct exa_context *exa = ms->exa;
375cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
376cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    struct exa_pixmap_priv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap);
377066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola
37889b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    debug_printf("ExaPrepareCopy\n");
37989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola
38089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola    if (alu != GXcopy)
381bdc3167c086dd4358e24692075db5e7784140843Rafael Espindola	return FALSE;
382cdfecc8759941c2996214070478d30084b79d463Rafael Espindola
383cdfecc8759941c2996214070478d30084b79d463Rafael Espindola    if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask))
384066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola	return FALSE;
385fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola
386fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola    if (!priv || !src_priv)
387fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola	return FALSE;
388fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola
389fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola    if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format,
390fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola                                        priv->tex->target,
391fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola                                        PIPE_TEXTURE_USAGE_RENDER_TARGET, 0) ||
392fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola        !exa->scrn->is_format_supported(exa->scrn, src_priv->tex->format,
393066c2f495ae396ce5335e374c45b1e4ace4f2470Rafael Espindola                                        src_priv->tex->target,
394fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola                                        PIPE_TEXTURE_USAGE_SAMPLER, 0))
395fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola	return FALSE;
396fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola
397fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola    if (!priv->tex || !src_priv->tex)
398fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola	return FALSE;
399fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola
400fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola    if (!exa->pipe)
401fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola	return FALSE;
402fe024d0a624404ada11fb330e7360abc5f88742eRafael Espindola
403c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola    exa->copy.src = src_priv;
404c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola    exa->copy.dst = priv;
405c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola
406c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola    /*XXX disabled until some issues with syncing are fixed */
407c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola    return FALSE;
408c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola}
409c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindola
410c57543964d1382d3d3a5005f415b6c0f49671b3aRafael Espindolastatic void
411c57543964d1382d3d3a5005f415b6c0f49671b3aRafael EspindolaExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
41291d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis	int width, int height)
413ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis{
414ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis   ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
4159c77398d1c89f615735d304cd7eda3c3e9b1504fCharles Davis   modesettingPtr ms = modesettingPTR(pScrn);
4169c77398d1c89f615735d304cd7eda3c3e9b1504fCharles Davis   struct exa_context *exa = ms->exa;
4170855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
41891d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis
4190855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   debug_printf("\tExaCopy(srcx=%d, srcy=%d, dstX=%d, dstY=%d, w=%d, h=%d)\n",
4200855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis                srcX, srcY, dstX, dstY, width, height);
4210855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis
4220855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   debug_assert(priv == exa->copy.dst);
423fbc539ff37ddd08c2480be9185e7a40919ce8940Charles Davis
42491d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis   xorg_copy_pixmap(exa, exa->copy.dst, dstX, dstY,
4250855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis                    exa->copy.src, srcX, srcY,
4260855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis                    width, height);
4274eeb7b662b78f5c520fb258b3f9df18b1227cde5Charles Davis}
428ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis
429ca93138e11f404a19553049a569f1fa6ad491b67Charles Davisstatic Bool
430ca93138e11f404a19553049a569f1fa6ad491b67Charles DavisExaPrepareComposite(int op, PicturePtr pSrcPicture,
431ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis		    PicturePtr pMaskPicture, PicturePtr pDstPicture,
4320855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis		    PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
4330855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis{
4340855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
4350855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   modesettingPtr ms = modesettingPTR(pScrn);
43691d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis   struct exa_context *exa = ms->exa;
43791d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis
4380855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   debug_printf("ExaPrepareComposite\n");
4390855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis
4400855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis   return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture,
441ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis                                    pDstPicture,
442ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis                                    exaGetPixmapDriverPrivate(pSrc),
443440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis                                    exaGetPixmapDriverPrivate(pMask),
44491d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis                                    exaGetPixmapDriverPrivate(pDst));
4454eeb7b662b78f5c520fb258b3f9df18b1227cde5Charles Davis}
44691d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis
447ca93138e11f404a19553049a569f1fa6ad491b67Charles Davisstatic void
448ca93138e11f404a19553049a569f1fa6ad491b67Charles DavisExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
449ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis	     int dstX, int dstY, int width, int height)
450ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis{
451ca93138e11f404a19553049a569f1fa6ad491b67Charles Davis   ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
452f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis   modesettingPtr ms = modesettingPTR(pScrn);
453f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis   struct exa_context *exa = ms->exa;
454440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDst);
45591d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis
45691d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis   debug_printf("\tExaComposite\n");
45791d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis
45891d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis   xorg_composite(exa, priv, srcX, srcY, maskX, maskY,
45991d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis                  dstX, dstY, width, height);
46091d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis}
46191d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1Charles Davis
462f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davisstatic Bool
463f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles DavisExaCheckComposite(int op,
464440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis		  PicturePtr pSrcPicture, PicturePtr pMaskPicture,
465440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis		  PicturePtr pDstPicture)
466440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis{
467440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis   return xorg_composite_accelerated(op,
46881f3830f2ed0b26e8bd7ae62e127db427f9f350dCharles Davis                                     pSrcPicture,
46981f3830f2ed0b26e8bd7ae62e127db427f9f350dCharles Davis                                     pMaskPicture,
470440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis                                     pDstPicture);
471321fe74b2d40d7762175fbd3054fda00b5e70833Charles Davis}
472440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis
473321fe74b2d40d7762175fbd3054fda00b5e70833Charles Davisstatic void *
474321fe74b2d40d7762175fbd3054fda00b5e70833Charles DavisExaCreatePixmap(ScreenPtr pScreen, int size, int align)
475321fe74b2d40d7762175fbd3054fda00b5e70833Charles Davis{
476321fe74b2d40d7762175fbd3054fda00b5e70833Charles Davis    struct exa_pixmap_priv *priv;
477440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis
478440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis    priv = xcalloc(1, sizeof(struct exa_pixmap_priv));
479440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis    if (!priv)
480d0b76d00048352affac4fad0ef005e28f5340b76Charles Davis	return NULL;
48181f3830f2ed0b26e8bd7ae62e127db427f9f350dCharles Davis
48281f3830f2ed0b26e8bd7ae62e127db427f9f350dCharles Davis    return priv;
48381f3830f2ed0b26e8bd7ae62e127db427f9f350dCharles Davis}
484f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis
485f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davisstatic void
486c3b162857a587c9877e903f038471b882b213232Charles DavisExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
487c3b162857a587c9877e903f038471b882b213232Charles Davis{
488c3b162857a587c9877e903f038471b882b213232Charles Davis    struct exa_pixmap_priv *priv = (struct exa_pixmap_priv *)dPriv;
489c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis
490c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    if (!priv)
491c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis	return;
492c3b162857a587c9877e903f038471b882b213232Charles Davis
493f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis    pipe_texture_reference(&priv->tex, NULL);
494f07090134d06e0cf3508e8b8e87d775f0a7982c1Charles Davis
495c3b162857a587c9877e903f038471b882b213232Charles Davis    xfree(priv);
496c3b162857a587c9877e903f038471b882b213232Charles Davis}
497c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles Davis
498c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles Davisstatic Bool
499c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles DavisExaPixmapIsOffscreen(PixmapPtr pPixmap)
500edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis{
501edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis    struct exa_pixmap_priv *priv;
502c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis
5035c2256a5719172273eaef198f92d8af924ff8623Charles Davis    priv = exaGetPixmapDriverPrivate(pPixmap);
504c3b162857a587c9877e903f038471b882b213232Charles Davis
505ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis    if (!priv)
506ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis	return FALSE;
507c3b162857a587c9877e903f038471b882b213232Charles Davis
508c3b162857a587c9877e903f038471b882b213232Charles Davis    if (priv->tex)
509edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis	return TRUE;
510edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis
511c3b162857a587c9877e903f038471b882b213232Charles Davis    return FALSE;
512c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis}
513c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis
514c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davisint
515c3b162857a587c9877e903f038471b882b213232Charles Davisxorg_exa_set_displayed_usage(PixmapPtr pPixmap)
516ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis{
517ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis    struct exa_pixmap_priv *priv;
518c3b162857a587c9877e903f038471b882b213232Charles Davis    priv = exaGetPixmapDriverPrivate(pPixmap);
519c3b162857a587c9877e903f038471b882b213232Charles Davis
520edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis    if (!priv) {
521edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis	FatalError("NO PIXMAP PRIVATE\n");
522c3b162857a587c9877e903f038471b882b213232Charles Davis	return 0;
523c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    }
524c3b162857a587c9877e903f038471b882b213232Charles Davis
525c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles Davis    priv->flags |= PIPE_TEXTURE_USAGE_PRIMARY;
526c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis
527c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    return 0;
528c3b162857a587c9877e903f038471b882b213232Charles Davis}
529ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis
530ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davisint
531c3b162857a587c9877e903f038471b882b213232Charles Davisxorg_exa_set_shared_usage(PixmapPtr pPixmap)
532c3b162857a587c9877e903f038471b882b213232Charles Davis{
533edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis    struct exa_pixmap_priv *priv;
534edeecbff0e231c04b7222a79a26017a48668f0e2Charles Davis    priv = exaGetPixmapDriverPrivate(pPixmap);
535c3b162857a587c9877e903f038471b882b213232Charles Davis
536c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    if (!priv) {
537c3b162857a587c9877e903f038471b882b213232Charles Davis	FatalError("NO PIXMAP PRIVATE\n");
538c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles Davis	return 0;
539c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    }
540c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis
541c3b162857a587c9877e903f038471b882b213232Charles Davis    priv->flags |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
542ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis
543ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis    return 0;
544440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis}
545c3b162857a587c9877e903f038471b882b213232Charles Davis
546c3b162857a587c9877e903f038471b882b213232Charles Davisunsigned
547c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles Davisxorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out)
548c2d3022aa6104a21f4368c522ccbf9a4d282b7c6Charles Davis{
549c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    ScreenPtr pScreen = pPixmap->drawable.pScreen;
550c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
551c4cbf9b6aa95cf861a5a80bfccf615ff5c53e4efCharles Davis    modesettingPtr ms = modesettingPTR(pScrn);
552c3b162857a587c9877e903f038471b882b213232Charles Davis    struct exa_pixmap_priv *priv;
553ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis    unsigned handle;
554ff96a12db635daf4f88cfea899e63a885dfaa9edCharles Davis    unsigned stride;
555440596ffe5bb77a202acb36d5eadd158976ff39aCharles Davis
55661558aaf4f924fd44fd2f275fcb7ab7199ede304Charles Davis    if (!ms->exa) {
55761558aaf4f924fd44fd2f275fcb7ab7199ede304Charles Davis	FatalError("NO MS->EXA\n");
55861558aaf4f924fd44fd2f275fcb7ab7199ede304Charles Davis	return 0;
55961558aaf4f924fd44fd2f275fcb7ab7199ede304Charles Davis    }
560cacdc4fc41f035c149d5f1b92acd587d475ffd58Charles Davis
561cacdc4fc41f035c149d5f1b92acd587d475ffd58Charles Davis    priv = exaGetPixmapDriverPrivate(pPixmap);
562b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
563b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    if (!priv) {
564b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov	FatalError("NO PIXMAP PRIVATE\n");
565b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov	return 0;
566b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    }
567b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
568b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    ms->api->local_handle_from_texture(ms->api, ms->screen, priv->tex, &stride, &handle);
569b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    if (stride_out)
570b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov	*stride_out = stride;
571b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
572b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    return handle;
573b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov}
574b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
575b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikovstatic Bool
576b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton KorobeynikovExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
577b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov		      int depth, int bitsPerPixel, int devKind,
578b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov		      pointer pPixData)
579b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov{
580b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    ScreenPtr pScreen = pPixmap->drawable.pScreen;
581b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
582b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
583b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    modesettingPtr ms = modesettingPTR(pScrn);
584b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    struct exa_context *exa = ms->exa;
585b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
586b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    if (!priv || pPixData)
58757caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov	return FALSE;
58857caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov
58957caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov    if (depth <= 0)
59057caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov	depth = pPixmap->drawable.depth;
59157caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov
59257caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov    if (bitsPerPixel <= 0)
59357caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov	bitsPerPixel = pPixmap->drawable.bitsPerPixel;
59457caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov
59557caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov    if (width <= 0)
59657caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov	width = pPixmap->drawable.width;
59757caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov
59857caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov    if (height <= 0)
59957caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov	height = pPixmap->drawable.height;
60057caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov
60157caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov    if (width <= 0 || height <= 0 || depth <= 0)
602ab3b3651add0915a5a051b177029ad117a877f52Matt Fleming	return FALSE;
60391bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner
60491bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner    miModifyPixmapHeader(pPixmap, width, height, depth,
60591bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner			     bitsPerPixel, devKind, NULL);
60691bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner
60791bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner    /* Deal with screen resize */
60891bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner    if (!priv->tex ||
60991bead790518fcf5cb26019fb1ebf2372e8a5b3fChris Lattner        (priv->tex->width[0] != width ||
61058bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner         priv->tex->height[0] != height ||
61158bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner         priv->tex_flags != priv->flags)) {
61258bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner	struct pipe_texture *texture = NULL;
61358bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner
61458bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner#ifdef DRM_MODE_FEATURE_DIRTYFB
61558bc4dd4a91443ddd3120b0a2f1801ad4d6aae1cChris Lattner	if (priv->flags)
616c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola#endif
617c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola	{
618c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola	    struct pipe_texture template;
619c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola
620c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola	    memset(&template, 0, sizeof(template));
621c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola	    template.target = PIPE_TEXTURE_2D;
62240a7dbbeff44c4cbd8c7e4f07f28dd614f8a5d08Rafael Espindola	    exa_get_pipe_format(depth, &template.format, &bitsPerPixel);
62340a7dbbeff44c4cbd8c7e4f07f28dd614f8a5d08Rafael Espindola	    pf_get_block(template.format, &template.block);
62440a7dbbeff44c4cbd8c7e4f07f28dd614f8a5d08Rafael Espindola	    template.width[0] = width;
62540a7dbbeff44c4cbd8c7e4f07f28dd614f8a5d08Rafael Espindola	    template.height[0] = height;
626c25dad8750083829d9a8935ce40d0734e5488f8eRafael Espindola	    template.depth[0] = 1;
62738ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis	    template.last_level = 0;
62838ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis	    template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET | priv->flags;
62938ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis	    priv->tex_flags = priv->flags;
63038ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis	    texture = exa->scrn->texture_create(exa->scrn, &template);
63138ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis
63238ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis	    if (priv->tex) {
63338ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis		struct pipe_surface *dst_surf;
634                struct pipe_surface *src_surf;
635
636		dst_surf = exa->scrn->get_tex_surface(
637                   exa->scrn, texture, 0, 0, 0, PIPE_BUFFER_USAGE_GPU_WRITE);
638		src_surf = exa_gpu_surface(exa, priv);
639		exa->pipe->surface_copy(exa->pipe, dst_surf, 0, 0, src_surf,
640                                        0, 0, min(width, texture->width[0]),
641                                        min(height, texture->height[0]));
642		exa->scrn->tex_surface_destroy(dst_surf);
643		exa->scrn->tex_surface_destroy(src_surf);
644	    } else if (pPixmap->devPrivate.ptr) {
645		struct pipe_transfer *transfer;
646
647		if (priv->map_count != 0)
648		     FatalError("doing ExaModifyPixmapHeader on mapped buffer\n");
649
650		transfer =
651		    exa->scrn->get_tex_transfer(exa->scrn, texture, 0, 0, 0,
652						PIPE_TRANSFER_WRITE,
653						0, 0, width, height);
654		util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
655			       &texture->block, transfer->stride, 0, 0,
656			       width, height, pPixmap->devPrivate.ptr,
657			       pPixmap->devKind, 0, 0);
658		exa->scrn->transfer_unmap(exa->scrn, transfer);
659		exa->scrn->tex_transfer_destroy(transfer);
660
661		xfree(pPixmap->devPrivate.ptr);
662		pPixmap->devPrivate.ptr = NULL;
663	    }
664	}
665#ifdef DRM_MODE_FEATURE_DIRTYFB
666	else {
667	    xfree(pPixmap->devPrivate.ptr);
668	    pPixmap->devPrivate.ptr = xalloc(pPixmap->drawable.height *
669					     pPixmap->devKind);
670	}
671#endif
672
673	pipe_texture_reference(&priv->tex, texture);
674    }
675
676    return TRUE;
677}
678
679struct pipe_texture *
680xorg_exa_get_texture(PixmapPtr pPixmap)
681{
682   struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap);
683   struct pipe_texture *tex = NULL;
684   pipe_texture_reference(&tex, priv->tex);
685   return tex;
686}
687
688void
689xorg_exa_close(ScrnInfoPtr pScrn)
690{
691   modesettingPtr ms = modesettingPTR(pScrn);
692   struct exa_context *exa = ms->exa;
693   struct pipe_constant_buffer *vsbuf = &exa->vs_const_buffer;
694   struct pipe_constant_buffer *fsbuf = &exa->fs_const_buffer;
695
696   if (exa->shaders) {
697      xorg_shaders_destroy(exa->shaders);
698   }
699
700   if (vsbuf && vsbuf->buffer)
701      pipe_buffer_reference(&vsbuf->buffer, NULL);
702
703   if (fsbuf && fsbuf->buffer)
704      pipe_buffer_reference(&fsbuf->buffer, NULL);
705
706   if (exa->cso) {
707      cso_release_all(exa->cso);
708      cso_destroy_context(exa->cso);
709   }
710
711   if (exa->pipe)
712      exa->pipe->destroy(exa->pipe);
713
714   exaDriverFini(pScrn->pScreen);
715   xfree(exa);
716   ms->exa = NULL;
717}
718
719void *
720xorg_exa_init(ScrnInfoPtr pScrn)
721{
722   modesettingPtr ms = modesettingPTR(pScrn);
723   struct exa_context *exa;
724   ExaDriverPtr pExa;
725
726   exa = xcalloc(1, sizeof(struct exa_context));
727   if (!exa)
728      return NULL;
729
730   pExa = exaDriverAlloc();
731   if (!pExa) {
732      goto out_err;
733   }
734
735   memset(pExa, 0, sizeof(*pExa));
736
737   pExa->exa_major         = 2;
738   pExa->exa_minor         = 2;
739   pExa->memoryBase        = 0;
740   pExa->memorySize        = 0;
741   pExa->offScreenBase     = 0;
742   pExa->pixmapOffsetAlign = 0;
743   pExa->pixmapPitchAlign  = 1;
744   pExa->flags             = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS;
745#ifdef EXA_SUPPORTS_PREPARE_AUX
746   pExa->flags            |= EXA_SUPPORTS_PREPARE_AUX;
747#endif
748#ifdef EXA_MIXED_PIXMAPS
749   pExa->flags            |= EXA_MIXED_PIXMAPS;
750#endif
751   pExa->maxX              = 8191; /* FIXME */
752   pExa->maxY              = 8191; /* FIXME */
753
754   pExa->WaitMarker         = ExaWaitMarker;
755   pExa->MarkSync           = ExaMarkSync;
756   pExa->PrepareSolid       = ExaPrepareSolid;
757   pExa->Solid              = ExaSolid;
758   pExa->DoneSolid          = ExaDone;
759   pExa->PrepareCopy        = ExaPrepareCopy;
760   pExa->Copy               = ExaCopy;
761   pExa->DoneCopy           = ExaDone;
762   pExa->CheckComposite     = ExaCheckComposite;
763   pExa->PrepareComposite   = ExaPrepareComposite;
764   pExa->Composite          = ExaComposite;
765   pExa->DoneComposite      = ExaDoneComposite;
766   pExa->PixmapIsOffscreen  = ExaPixmapIsOffscreen;
767   pExa->DownloadFromScreen = ExaDownloadFromScreen;
768   pExa->UploadToScreen     = ExaUploadToScreen;
769   pExa->PrepareAccess      = ExaPrepareAccess;
770   pExa->FinishAccess       = ExaFinishAccess;
771   pExa->CreatePixmap       = ExaCreatePixmap;
772   pExa->DestroyPixmap      = ExaDestroyPixmap;
773   pExa->ModifyPixmapHeader = ExaModifyPixmapHeader;
774
775   if (!exaDriverInit(pScrn->pScreen, pExa)) {
776      goto out_err;
777   }
778
779   exa->scrn = ms->screen;
780   exa->pipe = ms->api->create_context(ms->api, exa->scrn);
781   /* Share context with DRI */
782   ms->ctx = exa->pipe;
783
784   exa->cso = cso_create_context(exa->pipe);
785   exa->shaders = xorg_shaders_create(exa);
786
787   xorg_exa_init_state(exa);
788
789   return (void *)exa;
790
791out_err:
792   xorg_exa_close(pScrn);
793
794   return NULL;
795}
796
797struct pipe_surface *
798exa_gpu_surface(struct exa_context *exa, struct exa_pixmap_priv *priv)
799{
800   return exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
801                                     PIPE_BUFFER_USAGE_GPU_READ |
802                                     PIPE_BUFFER_USAGE_GPU_WRITE);
803
804}
805
806void xorg_exa_flush(struct exa_context *exa, uint pipeFlushFlags,
807                    struct pipe_fence_handle **fence)
808{
809   exa->pipe->flush(exa->pipe, pipeFlushFlags, fence);
810}
811
812void xorg_exa_finish(struct exa_context *exa)
813{
814   struct pipe_fence_handle *fence = NULL;
815
816   xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, &fence);
817
818   exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 0);
819   exa->pipe->screen->fence_reference(exa->pipe->screen, &fence, NULL);
820}
821
822