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