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