xorg_exa.c revision ee65faffc1ae878fc7998ca52f1c5e298ae61176
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 45f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer#include "util/u_rect.h" 46cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell#include "util/u_math.h" 47cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell#include "util/u_debug.h" 48ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca#include "util/u_format.h" 49f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer 50e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#define DEBUG_PRINT 0 514236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#define ROUND_UP_TEXTURES 1 52ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin 5384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* 5484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Helper functions 5584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */ 56e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstruct render_format_str { 57e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin int format; 58e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin const char *name; 59e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin}; 60e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstatic const struct render_format_str formats_info[] = 61e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin{ 62e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8r8g8b8, "PICT_a8r8g8b8"}, 63e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x8r8g8b8, "PICT_x8r8g8b8"}, 64e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8b8g8r8, "PICT_a8b8g8r8"}, 65e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x8b8g8r8, "PICT_x8b8g8r8"}, 66d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer#ifdef PICT_TYPE_BGRA 67e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8a8, "PICT_b8g8r8a8"}, 68e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8x8, "PICT_b8g8r8x8"}, 69d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_a2r10g10b10, "PICT_a2r10g10b10"}, 70d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_x2r10g10b10, "PICT_x2r10g10b10"}, 71d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_a2b10g10r10, "PICT_a2b10g10r10"}, 72d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_x2b10g10r10, "PICT_x2b10g10r10"}, 73d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer#endif 74e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r8g8b8, "PICT_r8g8b8"}, 75e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8, "PICT_b8g8r8"}, 76e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r5g6b5, "PICT_r5g6b5"}, 77e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b5g6r5, "PICT_b5g6r5"}, 78e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1r5g5b5, "PICT_a1r5g5b5"}, 79e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x1r5g5b5, "PICT_x1r5g5b5"}, 80e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1b5g5r5, "PICT_a1b5g5r5"}, 81e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x1b5g5r5, "PICT_x1b5g5r5"}, 82e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4r4g4b4, "PICT_a4r4g4b4"}, 83e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4r4g4b4, "PICT_x4r4g4b4"}, 84e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4b4g4r4, "PICT_a4b4g4r4"}, 85e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4b4g4r4, "PICT_x4b4g4r4"}, 86e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8, "PICT_a8"}, 87e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r3g3b2, "PICT_r3g3b2"}, 88e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b2g3r3, "PICT_b2g3r3"}, 89e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a2r2g2b2, "PICT_a2r2g2b2"}, 90e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a2b2g2r2, "PICT_a2b2g2r2"}, 91e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_c8, "PICT_c8"}, 92e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g8, "PICT_g8"}, 93e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4a4, "PICT_x4a4"}, 94e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4c4, "PICT_x4c4"}, 95e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4g4, "PICT_x4g4"}, 96e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4, "PICT_a4"}, 97e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r1g2b1, "PICT_r1g2b1"}, 98e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b1g2r1, "PICT_b1g2r1"}, 99e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1r1g1b1, "PICT_a1r1g1b1"}, 100e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1b1g1r1, "PICT_a1b1g1r1"}, 101e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_c4, "PICT_c4"}, 102e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g4, "PICT_g4"}, 103e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1, "PICT_a1"}, 104e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g1, "PICT_g1"} 105e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin}; 106e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstatic const char *render_format_name(int format) 107e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin{ 108e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin int i = 0; 109e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin for (i = 0; i < sizeof(formats_info)/sizeof(formats_info[0]); ++i) { 110e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin if (formats_info[i].format == format) 111e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin return formats_info[i].name; 112e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin } 113e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin return NULL; 114e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin} 11584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 116b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzstatic void 117e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantzexa_get_pipe_format(int depth, enum pipe_format *format, int *bbp, int *picture_format) 11884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 11984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz switch (depth) { 12084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 32: 121b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz *format = PIPE_FORMAT_A8R8G8B8_UNORM; 122e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_a8r8g8b8; 123b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 32); 124b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 12584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 24: 126b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz *format = PIPE_FORMAT_X8R8G8B8_UNORM; 127e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_x8r8g8b8; 128b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 32); 129b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 13084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 16: 131b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz *format = PIPE_FORMAT_R5G6B5_UNORM; 132e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_r5g6b5; 133b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 16); 134b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 13584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 15: 136b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz *format = PIPE_FORMAT_A1R5G5B5_UNORM; 137e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_x1r5g5b5; 138b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 16); 139b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 14084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 8: 141bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin *format = PIPE_FORMAT_L8_UNORM; 142e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_a8; 143be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer assert(*bbp == 8); 144be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer break; 14584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 4: 14684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 1: 147b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz *format = PIPE_FORMAT_A8R8G8B8_UNORM; /* bad bad bad */ 148b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 14984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz default: 15084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz assert(0); 151b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 15284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz } 15384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 15484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 15557d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin 15684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* 15784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Static exported EXA functions 15884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */ 15984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 16084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 16184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaWaitMarker(ScreenPtr pScreen, int marker) 16284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 16310dbdee05694489edd03b353dfe133a17e65b469Michel Dänzer /* Nothing to do, handled in the PrepareAccess hook */ 16484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 16584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 16684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic int 16784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaMarkSync(ScreenPtr pScreen) 16884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 169c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin return 1; 17084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 17184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 172fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 173fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 174fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Screen upload/download 175fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 176fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 17784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 178385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaDownloadFromScreen(PixmapPtr pPix, int x, int y, int w, int h, char *dst, 179385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer int dst_pitch) 180385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{ 181385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScreenPtr pScreen = pPix->drawable.pScreen; 182385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 183385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 184385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_context *exa = ms->exa; 185385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix); 186385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct pipe_transfer *transfer; 187385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 188385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!priv || !priv->tex) 189385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 190385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 1918c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) & 192385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer PIPE_REFERENCED_FOR_WRITE) 1938c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->flush(exa->pipe, 0, NULL); 194385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 195385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0, 196385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer PIPE_TRANSFER_READ, x, y, w, h); 197385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!transfer) 198385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 199385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 200bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#if DEBUG_PRINT 201bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("------ ExaDownloadFromScreen(%d, %d, %d, %d, %d)\n", 202bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin x, y, w, h, dst_pitch); 203bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#endif 204bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin 205decf6ed810eae473d043a4a399a5a84f1378a725Roland Scheidegger util_copy_rect((unsigned char*)dst, priv->tex->format, dst_pitch, 0, 0, 206385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer w, h, exa->scrn->transfer_map(exa->scrn, transfer), 207385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer transfer->stride, 0, 0); 208385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 209385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer exa->scrn->transfer_unmap(exa->scrn, transfer); 210385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer exa->scrn->tex_transfer_destroy(transfer); 211385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 212385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return TRUE; 213385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer} 214385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 215385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool 216385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaUploadToScreen(PixmapPtr pPix, int x, int y, int w, int h, char *src, 217385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer int src_pitch) 218385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{ 219385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScreenPtr pScreen = pPix->drawable.pScreen; 220385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 221385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 222385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_context *exa = ms->exa; 223385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix); 224385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct pipe_transfer *transfer; 225385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 226385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!priv || !priv->tex) 227385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 228385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 2295109484bd9cd79ed88af59280bd0be5a4150f37cJakob Bornecrantz /* make sure that any pending operations are flushed to hardware */ 2305109484bd9cd79ed88af59280bd0be5a4150f37cJakob Bornecrantz if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) & 2315109484bd9cd79ed88af59280bd0be5a4150f37cJakob Bornecrantz (PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE)) 2325109484bd9cd79ed88af59280bd0be5a4150f37cJakob Bornecrantz xorg_exa_flush(exa, 0, NULL); 2335109484bd9cd79ed88af59280bd0be5a4150f37cJakob Bornecrantz 234385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0, 235385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer PIPE_TRANSFER_WRITE, x, y, w, h); 236385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!transfer) 237385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 238385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 239bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#if DEBUG_PRINT 240bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("++++++ ExaUploadToScreen(%d, %d, %d, %d, %d)\n", 241bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin x, y, w, h, src_pitch); 242bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#endif 243bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin 244385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer), 245decf6ed810eae473d043a4a399a5a84f1378a725Roland Scheidegger priv->tex->format, transfer->stride, 0, 0, w, h, 246385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer (unsigned char*)src, src_pitch, 0, 0); 247385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 248385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer exa->scrn->transfer_unmap(exa->scrn, transfer); 249385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer exa->scrn->tex_transfer_destroy(transfer); 250385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 251385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return TRUE; 252385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer} 253385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 254385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool 25584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareAccess(PixmapPtr pPix, int index) 25684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 25784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPix->drawable.pScreen; 25884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 25984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 26021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 26121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 26284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 26384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPix); 26484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 26584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 26684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 26784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 26884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv->tex) 26984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 270dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz 271316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer if (priv->map_count == 0) 27284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz { 2738c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin if (exa->pipe->is_texture_referenced(exa->pipe, priv->tex, 0, 0) & 27405aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer PIPE_REFERENCED_FOR_WRITE) 2758c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->flush(exa->pipe, 0, NULL); 27605aa56a8275cc6f78e85b1fdf731500d1a5e5b08Michel Dänzer 27706d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell assert(pPix->drawable.width <= priv->tex->width0); 27806d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell assert(pPix->drawable.height <= priv->tex->height0); 2794236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 28084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv->map_transfer = 28184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0, 282316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer#ifdef EXA_MIXED_PIXMAPS 283316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer PIPE_TRANSFER_MAP_DIRECTLY | 284316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer#endif 28584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PIPE_TRANSFER_READ_WRITE, 2864236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 0, 0, 2874236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell pPix->drawable.width, 2884236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell pPix->drawable.height ); 289db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz if (!priv->map_transfer) 290db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#ifdef EXA_MIXED_PIXMAPS 291316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer return FALSE; 292db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#else 293db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz FatalError("failed to create transfer\n"); 294db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#endif 29584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 29684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pPix->devPrivate.ptr = 29784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz exa->scrn->transfer_map(exa->scrn, priv->map_transfer); 29884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pPix->devKind = priv->map_transfer->stride; 29984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz } 30084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 301316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer priv->map_count++; 302316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 30384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 30484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 30584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 30684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 30784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaFinishAccess(PixmapPtr pPix, int index) 30884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 30984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPix->drawable.pScreen; 31084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 31184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 31221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 31321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 31484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPix); 31584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 31684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 31784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 31884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 31984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv->map_transfer) 32084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 32184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 322dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz if (--priv->map_count == 0) { 323dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz assert(priv->map_transfer); 324dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz exa->scrn->transfer_unmap(exa->scrn, priv->map_transfer); 325dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz exa->scrn->tex_transfer_destroy(priv->map_transfer); 326dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz priv->map_transfer = NULL; 327d80242c2546f795e37ce88955c823c054fdfe217Jakob Bornecrantz pPix->devPrivate.ptr = NULL; 328dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz } 32984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 33084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 331fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 332fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Solid Fills 333fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 33484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 33584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 33684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg) 33784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 33884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 33984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 34021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 34121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 34284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 343e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 34453d2fa46e7fa19d0cb7dec74efcd407ab6163c80Zack Rusin debug_printf("ExaPrepareSolid(0x%x)\n", fg); 345ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#endif 346f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 347f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 348f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 3493a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 3506d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("accle not enabled"); 35184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 35284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv || !priv->tex) 3536d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("%s", !priv ? "!priv" : "!priv->tex"); 35484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3553a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask)) 3566d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("planeMask is not solid"); 35745cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer 35884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (alu != GXcopy) 3596d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("not GXcopy"); 36084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3613a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 3623a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz priv->tex->target, 3633a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) { 364ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("format %s", util_format_name(priv->tex->format)); 3653a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz } 366ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin 367f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_solid_bind_state(exa, priv, fg); 36884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 36984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 37084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 37184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1) 37284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 37384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 37484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 37521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 37621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 37784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 378e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 3796be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin debug_printf("\tExaSolid(%d, %d, %d, %d)\n", x0, y0, x1, y1); 380e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 3816be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin 38242db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer if (x0 == 0 && y0 == 0 && 38342db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer x1 == pPixmap->drawable.width && y1 == pPixmap->drawable.height) { 38442db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer exa->pipe->clear(exa->pipe, PIPE_CLEAR_COLOR, exa->solid_color, 0.0, 0); 38542db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer return; 38642db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer } 38742db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer 388ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin xorg_solid(exa, priv, x0, y0, x1, y1) ; 38984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 39084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 391fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 392fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 393fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneSolid(PixmapPtr pPixmap) 394fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 395fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 396fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 397fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 398fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 399fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 400fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell if (!priv) 401fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell return; 402fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 403fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell xorg_composite_done(exa); 404fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 405fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 406fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 407fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Copy Blits 408fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 409fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 41084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 41184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, 41284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int ydir, int alu, Pixel planeMask) 41384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 41484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; 41584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 41621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 41721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap); 41821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap); 41984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 420e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 4213167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin debug_printf("ExaPrepareCopy\n"); 422e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 423f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 424f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 425f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 426f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 4273a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 4286d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("accle not enabled"); 4293167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 4306d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz if (!priv || !priv->tex) 4316d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pDst %s", !priv ? "!priv" : "!priv->tex"); 4323a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 4336d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz if (!src_priv || !src_priv->tex) 4346d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pSrc %s", !src_priv ? "!priv" : "!priv->tex"); 43584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 43684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask)) 4376d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("planeMask is not solid"); 43884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 4393a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (alu != GXcopy) 4406d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("alu not GXcopy"); 44184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 44245cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 44345cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer priv->tex->target, 4443a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) 445ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pDst format %s", util_format_name(priv->tex->format)); 4463a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 4473a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, src_priv->tex->format, 44845cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer src_priv->tex->target, 44945cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer PIPE_TEXTURE_USAGE_SAMPLER, 0)) 450ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pSrc format %s", util_format_name(src_priv->tex->format)); 45184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 45257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin exa->copy.src = src_priv; 45357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin exa->copy.dst = priv; 45484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 4558544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell /* For same-surface copies, the pipe->surface_copy path is clearly 4568544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell * superior, providing it is implemented. In other cases it's not 4578544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell * clear what the better path would be, and eventually we'd 4588544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell * probably want to gather timings and choose dynamically. 4598544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell */ 4608544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell if (exa->pipe->surface_copy && 4618544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src == exa->copy.dst) { 4628544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4638544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.use_surface_copy = TRUE; 4648544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4654509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->copy.src_surface = 4664509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->scrn->get_tex_surface( exa->scrn, 4674509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->copy.src->tex, 4684509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 0, 0, 0, 4694509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell PIPE_BUFFER_USAGE_GPU_READ); 4704509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 4714509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->copy.dst_surface = 4724509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->scrn->get_tex_surface( exa->scrn, 4734509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->copy.dst->tex, 4744509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 0, 0, 0, 4754509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell PIPE_BUFFER_USAGE_GPU_WRITE ); 4764509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell } 4778544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell else { 4788544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.use_surface_copy = FALSE; 4798544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4808544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell if (exa->copy.dst == exa->copy.src) 4818544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src_texture = renderer_clone_texture( exa->renderer, 4828544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src->tex ); 4838544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell else 4848544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell pipe_texture_reference(&exa->copy.src_texture, 4858544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src->tex); 4868544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4878544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.dst_surface = 4888544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->scrn->get_tex_surface(exa->scrn, 4898544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.dst->tex, 4908544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 0, 0, 0, 4918544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell PIPE_BUFFER_USAGE_GPU_WRITE); 4928544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4938544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4948544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell renderer_copy_prepare(exa->renderer, 4958544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.dst_surface, 4968544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src_texture ); 4978544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell } 4984509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 49984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 500f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return TRUE; 50184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 50284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 50384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 50484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, 50584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int width, int height) 50684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 50757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; 50857d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 50957d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin struct exa_context *exa = ms->exa; 51057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap); 51157d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin 512e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 51357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin debug_printf("\tExaCopy(srcx=%d, srcy=%d, dstX=%d, dstY=%d, w=%d, h=%d)\n", 51457d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin srcX, srcY, dstX, dstY, width, height); 515e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 51684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 51757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin debug_assert(priv == exa->copy.dst); 518c441386b0c5c70fc4ae5b3c1eff3fb7f09812a30Vinson Lee (void) priv; 5193167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 5208544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell if (exa->copy.use_surface_copy) { 5214509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell /* XXX: consider exposing >1 box in surface_copy interface. 5224509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell */ 5234509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->pipe->surface_copy( exa->pipe, 5244509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->copy.dst_surface, 5254509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell dstX, dstY, 5264509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell exa->copy.src_surface, 5274509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell srcX, srcY, 5284509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell width, height ); 5294509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell } 5304509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell else { 5318544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell renderer_copy_pixmap(exa->renderer, 5328544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell dstX, dstY, 5338544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell srcX, srcY, 5348544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell width, height, 53506d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell exa->copy.src_texture->width0, 53606d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell exa->copy.src_texture->height0); 5374509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell } 53884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 53984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 540fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 541fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneCopy(PixmapPtr pPixmap) 542fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 543fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 544fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 545fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 546fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 547fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 548fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell if (!priv) 549fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell return; 550fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 551fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell renderer_draw_flush(exa->renderer); 552fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 553fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell exa->copy.src = NULL; 554fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell exa->copy.dst = NULL; 555fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pipe_surface_reference(&exa->copy.src_surface, NULL); 556fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pipe_surface_reference(&exa->copy.dst_surface, NULL); 5578544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell pipe_texture_reference(&exa->copy.src_texture, NULL); 558fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 559fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 560fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 5614509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 56284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 5635438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantzpicture_check_formats(struct exa_pixmap_priv *pSrc, PicturePtr pSrcPicture) 5645438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz{ 5655438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (pSrc->picture_format == pSrcPicture->format) 5665438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return TRUE; 5675438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 5685438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (pSrc->picture_format != PICT_a8r8g8b8) 5695438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5705438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 5715438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz /* pSrc->picture_format == PICT_a8r8g8b8 */ 5725438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz switch (pSrcPicture->format) { 5735438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a8r8g8b8: 5745438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x8r8g8b8: 5755438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a8b8g8r8: 5765438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x8b8g8r8: 5775438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz /* just treat these two as x8... */ 5785438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_r8g8b8: 5795438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8: 5805438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return TRUE; 5815438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz#ifdef PICT_TYPE_BGRA 5825438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8a8: 5835438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8x8: 5845438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; /* does not support swizzleing the alpha channel yet */ 5855438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a2r10g10b10: 5865438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x2r10g10b10: 5875438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a2b10g10r10: 5885438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x2b10g10r10: 5895438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5905438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz#endif 5915438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz default: 5925438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5935438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz } 5945438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5955438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz} 5965438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 597fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 598fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Composite entrypoints 599fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 600fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 601fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic Bool 602fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaCheckComposite(int op, 603fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell PicturePtr pSrcPicture, PicturePtr pMaskPicture, 604fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell PicturePtr pDstPicture) 605fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 606fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum]; 607fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 608fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 609f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 610fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell#if DEBUG_PRINT 611fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell debug_printf("ExaCheckComposite(%d, %p, %p, %p) = %d\n", 612fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell op, pSrcPicture, pMaskPicture, pDstPicture, accelerated); 613fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell#endif 614f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 615f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 616f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 617f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 618f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_composite_accelerated(op, 619f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom pSrcPicture, 620f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom pMaskPicture, 621f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom pDstPicture); 622fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 623fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 624fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 6255438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantzstatic Bool 62684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareComposite(int op, PicturePtr pSrcPicture, 62784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PicturePtr pMaskPicture, PicturePtr pDstPicture, 62884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) 62984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 63021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; 63121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 63221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 633ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer struct exa_pixmap_priv *priv; 63421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin 635f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 636f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 637f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 638e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 639c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin debug_printf("ExaPrepareComposite(%d, src=0x%p, mask=0x%p, dst=0x%p)\n", 640c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin op, pSrcPicture, pMaskPicture, pDstPicture); 641e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin debug_printf("\tFormats: src(%s), mask(%s), dst(%s)\n", 6423201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pSrcPicture ? render_format_name(pSrcPicture->format) : "none", 6433201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pMaskPicture ? render_format_name(pMaskPicture->format) : "none", 6443201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pDstPicture ? render_format_name(pDstPicture->format) : "none"); 645e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 6463a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 6476d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("accle not enabled"); 6483167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 649ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pDst); 6503a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6516d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pDst %s", !priv ? "!priv" : "!priv->tex"); 6523a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6533a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 654ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv->tex->target, 655ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer PIPE_TEXTURE_USAGE_RENDER_TARGET, 0)) 656ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pDst format: %s", util_format_name(priv->tex->format)); 657ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 658e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz if (priv->picture_format != pDstPicture->format) 659e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pDst pic_format: %s != %s", 660e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 661e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pDstPicture->format)); 662e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 663ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer if (pSrc) { 664ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pSrc); 6653a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6666d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pSrc %s", !priv ? "!priv" : "!priv->tex"); 6673a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6683a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 669ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv->tex->target, 670ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer PIPE_TEXTURE_USAGE_SAMPLER, 0)) 671ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pSrc format: %s", util_format_name(priv->tex->format)); 672e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 6735438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (!picture_check_formats(priv, pSrcPicture)) 674e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pSrc pic_format: %s != %s", 675e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 676e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pSrcPicture->format)); 677cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz 678ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer } 679ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 680ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer if (pMask) { 681ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pMask); 6823a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6836d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pMask %s", !priv ? "!priv" : "!priv->tex"); 6843a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6853a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 686ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv->tex->target, 687ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer PIPE_TEXTURE_USAGE_SAMPLER, 0)) 688ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pMask format: %s", util_format_name(priv->tex->format)); 689e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 6905438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (!picture_check_formats(priv, pMaskPicture)) 691e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pMask pic_format: %s != %s", 692e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 693e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pMaskPicture->format)); 694ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer } 695ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 696f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture, 697992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pDstPicture, 698992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pSrc ? exaGetPixmapDriverPrivate(pSrc) : NULL, 699992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pMask ? exaGetPixmapDriverPrivate(pMask) : NULL, 700992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz exaGetPixmapDriverPrivate(pDst)); 70184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 70284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 70384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 70484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, 70584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int dstX, int dstY, int width, int height) 70684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 70721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; 70821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 70921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 71021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDst); 71121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin 712e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 713bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("\tExaComposite(src[%d,%d], mask=[%d, %d], dst=[%d, %d], dim=[%d, %d])\n", 714bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin srcX, srcY, maskX, maskY, dstX, dstY, width, height); 715bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("\t Num bound samplers = %d\n", 716bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin exa->num_bound_samplers); 717e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 7183167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 71921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin xorg_composite(exa, priv, srcX, srcY, maskX, maskY, 72021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin dstX, dstY, width, height); 72184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 72284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 723fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 724fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 725fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 726fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneComposite(PixmapPtr pPixmap) 72784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 728fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 72931ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 73031ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer struct exa_context *exa = ms->exa; 731fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 732fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell xorg_composite_done(exa); 73384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 73484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 735fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 736fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 737fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Pixmaps 738fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 739fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 74084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void * 74184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCreatePixmap(ScreenPtr pScreen, int size, int align) 74284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 74321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 74484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 74521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin priv = xcalloc(1, sizeof(struct exa_pixmap_priv)); 74684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 74784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return NULL; 74884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 74984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return priv; 75084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 75184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 75384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDestroyPixmap(ScreenPtr pScreen, void *dPriv) 75484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 75521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = (struct exa_pixmap_priv *)dPriv; 75684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 75884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 75984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7600469465c31371177d85ab7af103359500323c1f8Michel Dänzer pipe_texture_reference(&priv->tex, NULL); 76184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 76284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz xfree(priv); 76384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 76484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 76584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 76684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPixmapIsOffscreen(PixmapPtr pPixmap) 76784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 76821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 76984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 77084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 77184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 77284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 77384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 77484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 77584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (priv->tex) 77684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 77784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 77884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 77984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 78084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7813905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint 7823905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_displayed_usage(PixmapPtr pPixmap) 7833905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{ 7843905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz struct exa_pixmap_priv *priv; 7853905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 7863905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7873905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz if (!priv) { 7883905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz FatalError("NO PIXMAP PRIVATE\n"); 7893905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7903905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz } 7913905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 792416ee3c53eeb1664784f224a42e293e5fed783bcMichel Dänzer priv->flags |= PIPE_TEXTURE_USAGE_PRIMARY; 7933905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7943905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7953905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz} 7963905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7973905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint 7983905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_shared_usage(PixmapPtr pPixmap) 7993905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{ 8003905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz struct exa_pixmap_priv *priv; 8013905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 8023905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 8033905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz if (!priv) { 8043905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz FatalError("NO PIXMAP PRIVATE\n"); 8053905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 8063905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz } 8073905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 808416ee3c53eeb1664784f224a42e293e5fed783bcMichel Dänzer priv->flags |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET; 8093905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 8103905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 8113905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz} 8123905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 81384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 81484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 81584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 8164236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwellsize_match( int width, int tex_width ) 8174236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell{ 8184236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#if ROUND_UP_TEXTURES 8194236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (width > tex_width) 8204236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return FALSE; 8214236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8224236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (width * 2 < tex_width) 8234236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return FALSE; 8244236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8254236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return TRUE; 8264236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#else 8274236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return width == tex_width; 8284236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#endif 8294236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell} 8304236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8314236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwellstatic Bool 83284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, 83384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int depth, int bitsPerPixel, int devKind, 83484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pointer pPixData) 83584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 83684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPixmap->drawable.pScreen; 83784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 83821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 83984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 84021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 84184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84240e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer if (!priv || pPixData) 84384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 84484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 845cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell if (0) { 846cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell debug_printf("%s pixmap %p sz %dx%dx%d devKind %d\n", 847cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell __FUNCTION__, pPixmap, width, height, bitsPerPixel, devKind); 848cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 849cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell if (priv->tex) 850cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell debug_printf(" ==> old texture %dx%d\n", 85106d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell priv->tex->width0, 85206d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell priv->tex->height0); 853cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell } 854cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 855cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 85684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (depth <= 0) 85784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz depth = pPixmap->drawable.depth; 85884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 85984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (bitsPerPixel <= 0) 86084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz bitsPerPixel = pPixmap->drawable.bitsPerPixel; 86184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 86284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (width <= 0) 86384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz width = pPixmap->drawable.width; 86484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 86584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (height <= 0) 86684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz height = pPixmap->drawable.height; 86784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 86884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (width <= 0 || height <= 0 || depth <= 0) 86984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 87084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 87184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz miModifyPixmapHeader(pPixmap, width, height, depth, 87284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz bitsPerPixel, devKind, NULL); 87384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 8744236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->width = width; 8754236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->height = height; 8764236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 87784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz /* Deal with screen resize */ 87831ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer if ((exa->accel || priv->flags) && 87931ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer (!priv->tex || 88006d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell !size_match(width, priv->tex->width0) || 88106d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell !size_match(height, priv->tex->height0) || 8824236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->tex_flags != priv->flags)) { 8833c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer struct pipe_texture *texture = NULL; 884316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer struct pipe_texture template; 885316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 886316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer memset(&template, 0, sizeof(template)); 887316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.target = PIPE_TEXTURE_2D; 888e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &priv->picture_format); 8894236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (ROUND_UP_TEXTURES && priv->flags == 0) { 89006d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.width0 = util_next_power_of_two(width); 89106d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.height0 = util_next_power_of_two(height); 8924236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell } 8934236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell else { 89406d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.width0 = width; 89506d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.height0 = height; 8964236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell } 8974236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 898d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.depth0 = 1; 899316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.last_level = 0; 900316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET | priv->flags; 901316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer priv->tex_flags = priv->flags; 902316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer texture = exa->scrn->texture_create(exa->scrn, &template); 903316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 904316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer if (priv->tex) { 905316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer struct pipe_surface *dst_surf; 906316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer struct pipe_surface *src_surf; 907316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 908316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer dst_surf = exa->scrn->get_tex_surface( 909316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer exa->scrn, texture, 0, 0, 0, PIPE_BUFFER_USAGE_GPU_WRITE); 910319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin src_surf = xorg_gpu_surface(exa->pipe->screen, priv); 911dfb871d4032f37b872c975269c5d666491f1056bKeith Whitwell if (exa->pipe->surface_copy) { 912dfb871d4032f37b872c975269c5d666491f1056bKeith Whitwell exa->pipe->surface_copy(exa->pipe, dst_surf, 0, 0, src_surf, 91306d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell 0, 0, min(width, texture->width0), 91406d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell min(height, texture->height0)); 915dfb871d4032f37b872c975269c5d666491f1056bKeith Whitwell } else { 916dfb871d4032f37b872c975269c5d666491f1056bKeith Whitwell util_surface_copy(exa->pipe, FALSE, dst_surf, 0, 0, src_surf, 91706d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell 0, 0, min(width, texture->width0), 91806d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell min(height, texture->height0)); 919dfb871d4032f37b872c975269c5d666491f1056bKeith Whitwell } 920316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer exa->scrn->tex_surface_destroy(dst_surf); 921316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer exa->scrn->tex_surface_destroy(src_surf); 9223c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer } 92340e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer 9243c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer pipe_texture_reference(&priv->tex, texture); 925bade906ed131e35ed1782f4687760dcdca233299Jakob Bornecrantz /* the texture we create has one reference */ 926bade906ed131e35ed1782f4687760dcdca233299Jakob Bornecrantz pipe_texture_reference(&texture, NULL); 927f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer } 928f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer 92984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 93084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 93184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 93284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstruct pipe_texture * 93384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_get_texture(PixmapPtr pPixmap) 93484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 935f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 936f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct pipe_texture *tex = NULL; 937f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pipe_texture_reference(&tex, priv->tex); 938f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return tex; 93984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 94084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 941846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob BornecrantzBool 942846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantzxorg_exa_set_texture(PixmapPtr pPixmap, struct pipe_texture *tex) 943846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz{ 944846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 945846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 946846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int mask = PIPE_TEXTURE_USAGE_PRIMARY | PIPE_TEXTURE_USAGE_DISPLAY_TARGET; 947846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 948846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz if (!priv) 949846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return FALSE; 950846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 951d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pPixmap->drawable.width != tex->width0 || 952d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger pPixmap->drawable.height != tex->height0) 953846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return FALSE; 954846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 955846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz pipe_texture_reference(&priv->tex, tex); 956846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz priv->tex_flags = tex->tex_usage & mask; 957846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 958846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return TRUE; 959846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz} 960846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 961846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantzstruct pipe_texture * 962846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantzxorg_exa_create_root_texture(ScrnInfoPtr pScrn, 963846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int width, int height, 964846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int depth, int bitsPerPixel) 965846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz{ 966846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 967846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct exa_context *exa = ms->exa; 968846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct pipe_texture template; 969e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz int dummy; 970846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 971846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz memset(&template, 0, sizeof(template)); 972846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.target = PIPE_TEXTURE_2D; 973e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &dummy); 974d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.width0 = width; 975d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.height0 = height; 976d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.depth0 = 1; 977846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.last_level = 0; 978846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET; 979846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.tex_usage |= PIPE_TEXTURE_USAGE_PRIMARY; 980846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET; 981846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 982846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return exa->scrn->texture_create(exa->scrn, &template); 983846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz} 984846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 98584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid 98684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_close(ScrnInfoPtr pScrn) 98784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 988f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 989f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_context *exa = ms->exa; 99084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 991319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin renderer_destroy(exa->renderer); 99217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin 9938c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin if (exa->pipe) 9948c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->destroy(exa->pipe); 9955fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz exa->pipe = NULL; 9965fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz /* Since this was shared be proper with the pointer */ 9975fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz ms->ctx = NULL; 99884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 999f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin exaDriverFini(pScrn->pScreen); 1000f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin xfree(exa); 1001f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin ms->exa = NULL; 100284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 100384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 100484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid * 100531ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzerxorg_exa_init(ScrnInfoPtr pScrn, Bool accel) 100684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 1007f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 1008f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_context *exa; 1009f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin ExaDriverPtr pExa; 1010f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1011f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin exa = xcalloc(1, sizeof(struct exa_context)); 1012f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!exa) 1013f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return NULL; 1014f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1015f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa = exaDriverAlloc(); 1016f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!pExa) { 1017f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin goto out_err; 1018f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin } 1019f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1020f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin memset(pExa, 0, sizeof(*pExa)); 1021f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1022f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->exa_major = 2; 1023f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->exa_minor = 2; 1024f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->memoryBase = 0; 1025f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->memorySize = 0; 1026f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->offScreenBase = 0; 1027f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->pixmapOffsetAlign = 0; 1028f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->pixmapPitchAlign = 1; 1029f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS; 1030e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_SUPPORTS_PREPARE_AUX 1031e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer pExa->flags |= EXA_SUPPORTS_PREPARE_AUX; 1032e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif 1033e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_MIXED_PIXMAPS 1034e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer pExa->flags |= EXA_MIXED_PIXMAPS; 1035e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif 1036f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->maxX = 8191; /* FIXME */ 1037f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->maxY = 8191; /* FIXME */ 1038f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1039f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->WaitMarker = ExaWaitMarker; 1040f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->MarkSync = ExaMarkSync; 1041f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareSolid = ExaPrepareSolid; 1042f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Solid = ExaSolid; 1043fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pExa->DoneSolid = ExaDoneSolid; 1044f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareCopy = ExaPrepareCopy; 1045f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Copy = ExaCopy; 1046fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pExa->DoneCopy = ExaDoneCopy; 1047f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->CheckComposite = ExaCheckComposite; 1048f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareComposite = ExaPrepareComposite; 1049f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Composite = ExaComposite; 1050f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->DoneComposite = ExaDoneComposite; 1051f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PixmapIsOffscreen = ExaPixmapIsOffscreen; 1052385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer pExa->DownloadFromScreen = ExaDownloadFromScreen; 1053385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer pExa->UploadToScreen = ExaUploadToScreen; 1054f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareAccess = ExaPrepareAccess; 1055f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->FinishAccess = ExaFinishAccess; 1056f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->CreatePixmap = ExaCreatePixmap; 1057f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->DestroyPixmap = ExaDestroyPixmap; 1058f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->ModifyPixmapHeader = ExaModifyPixmapHeader; 1059f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1060f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!exaDriverInit(pScrn->pScreen, pExa)) { 1061f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin goto out_err; 1062f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin } 1063f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1064f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin exa->scrn = ms->screen; 10657f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell exa->pipe = exa->scrn->context_create(exa->scrn, NULL); 10667f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell if (exa->pipe == NULL) 10677f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell goto out_err; 10687f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell 1069f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin /* Share context with DRI */ 10708c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin ms->ctx = exa->pipe; 1071f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1072319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin exa->renderer = renderer_create(exa->pipe); 107331ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer exa->accel = accel; 1074feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin 1075f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return (void *)exa; 1076f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1077f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinout_err: 1078f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin xorg_exa_close(pScrn); 1079f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1080f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return NULL; 1081f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin} 108284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 1083f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstruct pipe_surface * 1084319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinxorg_gpu_surface(struct pipe_screen *scrn, struct exa_pixmap_priv *priv) 1085f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin{ 1086319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin return scrn->get_tex_surface(scrn, priv->tex, 0, 0, 0, 1087319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin PIPE_BUFFER_USAGE_GPU_READ | 1088319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin PIPE_BUFFER_USAGE_GPU_WRITE); 108984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 109084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 109184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 1092974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_flush(struct exa_context *exa, uint pipeFlushFlags, 1093974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin struct pipe_fence_handle **fence) 1094974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{ 10958c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->flush(exa->pipe, pipeFlushFlags, fence); 1096974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin} 1097974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1098974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_finish(struct exa_context *exa) 1099974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{ 1100974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin struct pipe_fence_handle *fence = NULL; 1101974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1102974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, &fence); 1103974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 11048c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 0); 11058c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->screen->fence_reference(exa->pipe->screen, &fence, NULL); 1106974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin} 1107974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1108