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