xorg_exa.c revision 4c7001462607e6e99e474d6271dd481d3f8f201c
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" 494c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_box.h" 504c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_surface.h" 51f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer 52e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#define DEBUG_PRINT 0 534236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#define ROUND_UP_TEXTURES 1 54ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin 5584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* 5684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Helper functions 5784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */ 58e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstruct render_format_str { 59e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin int format; 60e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin const char *name; 61e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin}; 62e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstatic const struct render_format_str formats_info[] = 63e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin{ 64e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8r8g8b8, "PICT_a8r8g8b8"}, 65e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x8r8g8b8, "PICT_x8r8g8b8"}, 66e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8b8g8r8, "PICT_a8b8g8r8"}, 67e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x8b8g8r8, "PICT_x8b8g8r8"}, 68d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer#ifdef PICT_TYPE_BGRA 69e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8a8, "PICT_b8g8r8a8"}, 70e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8x8, "PICT_b8g8r8x8"}, 71d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_a2r10g10b10, "PICT_a2r10g10b10"}, 72d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_x2r10g10b10, "PICT_x2r10g10b10"}, 73d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_a2b10g10r10, "PICT_a2b10g10r10"}, 74d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_x2b10g10r10, "PICT_x2b10g10r10"}, 75d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer#endif 76e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r8g8b8, "PICT_r8g8b8"}, 77e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8, "PICT_b8g8r8"}, 78e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r5g6b5, "PICT_r5g6b5"}, 79e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b5g6r5, "PICT_b5g6r5"}, 80e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1r5g5b5, "PICT_a1r5g5b5"}, 81e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x1r5g5b5, "PICT_x1r5g5b5"}, 82e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1b5g5r5, "PICT_a1b5g5r5"}, 83e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x1b5g5r5, "PICT_x1b5g5r5"}, 84e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4r4g4b4, "PICT_a4r4g4b4"}, 85e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4r4g4b4, "PICT_x4r4g4b4"}, 86e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4b4g4r4, "PICT_a4b4g4r4"}, 87e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4b4g4r4, "PICT_x4b4g4r4"}, 88e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8, "PICT_a8"}, 89e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r3g3b2, "PICT_r3g3b2"}, 90e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b2g3r3, "PICT_b2g3r3"}, 91e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a2r2g2b2, "PICT_a2r2g2b2"}, 92e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a2b2g2r2, "PICT_a2b2g2r2"}, 93e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_c8, "PICT_c8"}, 94e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g8, "PICT_g8"}, 95e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4a4, "PICT_x4a4"}, 96e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4c4, "PICT_x4c4"}, 97e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4g4, "PICT_x4g4"}, 98e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4, "PICT_a4"}, 99e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r1g2b1, "PICT_r1g2b1"}, 100e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b1g2r1, "PICT_b1g2r1"}, 101e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1r1g1b1, "PICT_a1r1g1b1"}, 102e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1b1g1r1, "PICT_a1b1g1r1"}, 103e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_c4, "PICT_c4"}, 104e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g4, "PICT_g4"}, 105e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1, "PICT_a1"}, 106e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g1, "PICT_g1"} 107e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin}; 108e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstatic const char *render_format_name(int format) 109e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin{ 110e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin int i = 0; 111e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin for (i = 0; i < sizeof(formats_info)/sizeof(formats_info[0]); ++i) { 112e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin if (formats_info[i].format == format) 113e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin return formats_info[i].name; 114e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin } 115e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin return NULL; 116e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin} 11784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 118b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzstatic void 119e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantzexa_get_pipe_format(int depth, enum pipe_format *format, int *bbp, int *picture_format) 12084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 12184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz switch (depth) { 12284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 32: 123d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B8G8R8A8_UNORM; 124e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_a8r8g8b8; 125b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 32); 126b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 12784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 24: 128d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B8G8R8X8_UNORM; 129e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_x8r8g8b8; 130b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 32); 131b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 13284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 16: 133d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B5G6R5_UNORM; 134e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_r5g6b5; 135b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 16); 136b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 13784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 15: 138d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B5G5R5A1_UNORM; 139e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_x1r5g5b5; 140b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 16); 141b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 14284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 8: 143bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin *format = PIPE_FORMAT_L8_UNORM; 144e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_a8; 145be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer assert(*bbp == 8); 146be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer break; 14784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 4: 14884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 1: 149d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B8G8R8A8_UNORM; /* bad bad bad */ 150b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 15184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz default: 15284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz assert(0); 153b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 15484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz } 15584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 15684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 15757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin 15884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* 15984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Static exported EXA functions 16084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */ 16184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 16284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 16384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaWaitMarker(ScreenPtr pScreen, int marker) 16484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 16510dbdee05694489edd03b353dfe133a17e65b469Michel Dänzer /* Nothing to do, handled in the PrepareAccess hook */ 16684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 16784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 16884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic int 16984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaMarkSync(ScreenPtr pScreen) 17084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 171c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin return 1; 17284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 17384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 174fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 175fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 176fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Screen upload/download 177fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 178fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 17984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 180385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaDownloadFromScreen(PixmapPtr pPix, int x, int y, int w, int h, char *dst, 181385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer int dst_pitch) 182385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{ 183385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScreenPtr pScreen = pPix->drawable.pScreen; 184385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 185385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 186385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_context *exa = ms->exa; 187385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix); 188385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct pipe_transfer *transfer; 189385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 190385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!priv || !priv->tex) 191385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 192385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 1934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer = pipe_get_transfer(exa->pipe, priv->tex, 0, 0, 1944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ, x, y, w, h); 195385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!transfer) 196385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 197385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 198bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#if DEBUG_PRINT 199bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("------ ExaDownloadFromScreen(%d, %d, %d, %d, %d)\n", 200bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin x, y, w, h, dst_pitch); 201bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#endif 202bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin 203decf6ed810eae473d043a4a399a5a84f1378a725Roland Scheidegger util_copy_rect((unsigned char*)dst, priv->tex->format, dst_pitch, 0, 0, 204475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell w, h, exa->pipe->transfer_map(exa->pipe, transfer), 205385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer transfer->stride, 0, 0); 206385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 207475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_unmap(exa->pipe, transfer); 208287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell exa->pipe->transfer_destroy(exa->pipe, transfer); 209385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 210385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return TRUE; 211385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer} 212385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 213385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool 214385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaUploadToScreen(PixmapPtr pPix, int x, int y, int w, int h, char *src, 215385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer int src_pitch) 216385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{ 217385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScreenPtr pScreen = pPix->drawable.pScreen; 218385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 219385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 220385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_context *exa = ms->exa; 221385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix); 222385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct pipe_transfer *transfer; 223385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 224385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!priv || !priv->tex) 225385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 226385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 2274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer = pipe_get_transfer(exa->pipe, priv->tex, 0, 0, 2284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_WRITE, x, y, w, h); 229385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!transfer) 230385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 231385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 232bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#if DEBUG_PRINT 233bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("++++++ ExaUploadToScreen(%d, %d, %d, %d, %d)\n", 234bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin x, y, w, h, src_pitch); 235bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin#endif 236bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin 237475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell util_copy_rect(exa->pipe->transfer_map(exa->pipe, transfer), 238decf6ed810eae473d043a4a399a5a84f1378a725Roland Scheidegger priv->tex->format, transfer->stride, 0, 0, w, h, 239385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer (unsigned char*)src, src_pitch, 0, 0); 240385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 241475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_unmap(exa->pipe, transfer); 242287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell exa->pipe->transfer_destroy(exa->pipe, transfer); 243385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 244385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return TRUE; 245385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer} 246385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 247385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool 24884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareAccess(PixmapPtr pPix, int index) 24984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 25084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPix->drawable.pScreen; 25184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 25284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 25321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 25421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 25584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 25684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPix); 25784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 25884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 25984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 26084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 26184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv->tex) 26284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 263dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz 264316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer if (priv->map_count == 0) 26584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz { 26606d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell assert(pPix->drawable.width <= priv->tex->width0); 26706d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell assert(pPix->drawable.height <= priv->tex->height0); 2684236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 26984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv->map_transfer = 2704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger pipe_get_transfer(exa->pipe, priv->tex, 0, 0, 271316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer#ifdef EXA_MIXED_PIXMAPS 272316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer PIPE_TRANSFER_MAP_DIRECTLY | 273316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer#endif 27484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PIPE_TRANSFER_READ_WRITE, 2754236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 0, 0, 2764236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell pPix->drawable.width, 2774236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell pPix->drawable.height ); 278db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz if (!priv->map_transfer) 279db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#ifdef EXA_MIXED_PIXMAPS 280316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer return FALSE; 281db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#else 282db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz FatalError("failed to create transfer\n"); 283db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#endif 28484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 28584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pPix->devPrivate.ptr = 286475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_map(exa->pipe, priv->map_transfer); 28784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pPix->devKind = priv->map_transfer->stride; 28884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz } 28984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 290316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer priv->map_count++; 291316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 29284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 29384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 29484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 29584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 29684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaFinishAccess(PixmapPtr pPix, int index) 29784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 29884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPix->drawable.pScreen; 29984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 30084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 30121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 30221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 30384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPix); 30484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 30584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 30684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 30784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 30884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv->map_transfer) 30984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 31084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 311dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz if (--priv->map_count == 0) { 312dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz assert(priv->map_transfer); 313475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_unmap(exa->pipe, priv->map_transfer); 314287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell exa->pipe->transfer_destroy(exa->pipe, priv->map_transfer); 315dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz priv->map_transfer = NULL; 316d80242c2546f795e37ce88955c823c054fdfe217Jakob Bornecrantz pPix->devPrivate.ptr = NULL; 317dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz } 31884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 31984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 320fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 321fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Solid Fills 322fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 32384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 32484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 32584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg) 32684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 32784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 32884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 32921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 33021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 33184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 332e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 33353d2fa46e7fa19d0cb7dec74efcd407ab6163c80Zack Rusin debug_printf("ExaPrepareSolid(0x%x)\n", fg); 334ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#endif 335f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 336f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 337f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 3383a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 3396d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("accle not enabled"); 34084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 34184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv || !priv->tex) 3426d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("%s", !priv ? "!priv" : "!priv->tex"); 34384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3443a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask)) 3456d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("planeMask is not solid"); 34645cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer 34784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (alu != GXcopy) 3486d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("not GXcopy"); 34984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3503a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 35148780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 352287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 353ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("format %s", util_format_name(priv->tex->format)); 3543a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz } 355ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin 356f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_solid_bind_state(exa, priv, fg); 35784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 35884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 35984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 36084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1) 36184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 36284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 36384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 36421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 36521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 36684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 367e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 3686be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin debug_printf("\tExaSolid(%d, %d, %d, %d)\n", x0, y0, x1, y1); 369e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 3706be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin 37142db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer if (x0 == 0 && y0 == 0 && 37242db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer x1 == pPixmap->drawable.width && y1 == pPixmap->drawable.height) { 37342db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer exa->pipe->clear(exa->pipe, PIPE_CLEAR_COLOR, exa->solid_color, 0.0, 0); 37442db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer return; 37542db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer } 37642db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer 377ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin xorg_solid(exa, priv, x0, y0, x1, y1) ; 37884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 37984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 380fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 381fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 382fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneSolid(PixmapPtr pPixmap) 383fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 384fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 385fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 386fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 387fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 388fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 389fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell if (!priv) 390fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell return; 391fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 392fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell xorg_composite_done(exa); 393fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 394fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 395fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 396fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Copy Blits 397fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 398fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 39984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 40084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, 40184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int ydir, int alu, Pixel planeMask) 40284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 40384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; 40484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 40521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 40621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap); 40721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap); 40884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 409e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 4103167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin debug_printf("ExaPrepareCopy\n"); 411e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 412f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 413f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 414f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 415f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 4163a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 4176d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("accle not enabled"); 4183167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 4196d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz if (!priv || !priv->tex) 4206d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pDst %s", !priv ? "!priv" : "!priv->tex"); 4213a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 4226d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz if (!src_priv || !src_priv->tex) 4236d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pSrc %s", !src_priv ? "!priv" : "!priv->tex"); 42484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 42584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask)) 4266d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("planeMask is not solid"); 42784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 4283a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (alu != GXcopy) 4296d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("alu not GXcopy"); 43084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 43145cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 43248780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 433287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) 434ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pDst format %s", util_format_name(priv->tex->format)); 4353a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 4363a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, src_priv->tex->format, 43748780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger src_priv->tex->target, 0, 438287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 0)) 439ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pSrc format %s", util_format_name(src_priv->tex->format)); 44084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 44157d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin exa->copy.src = src_priv; 44257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin exa->copy.dst = priv; 44384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 44448780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger /* XXX this used to use resource_copy_region for same-surface copies, 44548780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger * but they were redefined to not allow overlaps (some of the util code 44648780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger * always assumed this anyway). 44748780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger * Drivers should implement accelerated resource_copy_region or it will 44848780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger * be slow - disable for now. 4498544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell */ 45048780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger if (0 && exa->copy.src != exa->copy.dst) { 4518544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.use_surface_copy = TRUE; 4524509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell } 4538544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell else { 4544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface surf_tmpl; 4558544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.use_surface_copy = FALSE; 4568544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4578544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell if (exa->copy.dst == exa->copy.src) 4588544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src_texture = renderer_clone_texture( exa->renderer, 4598544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src->tex ); 4608544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell else 461287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&exa->copy.src_texture, 4628544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src->tex); 4638544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 4654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_tmpl, exa->copy.dst->tex, 4664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_BIND_RENDER_TARGET); 4678544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.dst_surface = 4684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger exa->pipe->create_surface(exa->pipe, 4694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger exa->copy.dst->tex, 4704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger &surf_tmpl); 4718544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4728544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell 4738544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell renderer_copy_prepare(exa->renderer, 4748544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.dst_surface, 4758544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell exa->copy.src_texture ); 4768544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell } 4774509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 47884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 479f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return TRUE; 48084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 48184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 48284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 48384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, 48484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int width, int height) 48584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 48657d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; 48757d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 48857d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin struct exa_context *exa = ms->exa; 48957d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap); 49057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin 491e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 49257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin debug_printf("\tExaCopy(srcx=%d, srcy=%d, dstX=%d, dstY=%d, w=%d, h=%d)\n", 49357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin srcX, srcY, dstX, dstY, width, height); 494e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 49584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 49657d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin debug_assert(priv == exa->copy.dst); 497c441386b0c5c70fc4ae5b3c1eff3fb7f09812a30Vinson Lee (void) priv; 4983167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 4998544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell if (exa->copy.use_surface_copy) { 5004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_box src_box; 5014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_box_2d(srcX, srcY, width, height, &src_box); 50248780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->pipe->resource_copy_region( exa->pipe, 50348780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->copy.dst->tex, 5044c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 50548780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger dstX, dstY, 0, 50648780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->copy.src->tex, 5074c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, &src_box); 5084509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell } 5094509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell else { 5108544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell renderer_copy_pixmap(exa->renderer, 5118544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell dstX, dstY, 5128544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell srcX, srcY, 5138544c309d0a296449d11cf2cf52ca306662dc41dKeith Whitwell width, height, 51406d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell exa->copy.src_texture->width0, 51506d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell exa->copy.src_texture->height0); 5164509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell } 51784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 51884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 519fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 520fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneCopy(PixmapPtr pPixmap) 521fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 522fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 523fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 524fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 525fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 526fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 527fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell if (!priv) 528fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell return; 529fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 530fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell renderer_draw_flush(exa->renderer); 531fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 532fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell exa->copy.src = NULL; 533fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell exa->copy.dst = NULL; 534fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pipe_surface_reference(&exa->copy.dst_surface, NULL); 535287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&exa->copy.src_texture, NULL); 536fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 537fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 538fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 5394509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 54084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 5415438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantzpicture_check_formats(struct exa_pixmap_priv *pSrc, PicturePtr pSrcPicture) 5425438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz{ 5435438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (pSrc->picture_format == pSrcPicture->format) 5445438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return TRUE; 5455438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 5465438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (pSrc->picture_format != PICT_a8r8g8b8) 5475438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5485438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 5495438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz /* pSrc->picture_format == PICT_a8r8g8b8 */ 5505438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz switch (pSrcPicture->format) { 5515438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a8r8g8b8: 5525438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x8r8g8b8: 5535438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a8b8g8r8: 5545438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x8b8g8r8: 5555438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz /* just treat these two as x8... */ 5565438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_r8g8b8: 5575438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8: 5585438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return TRUE; 5595438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz#ifdef PICT_TYPE_BGRA 5605438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8a8: 5615438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8x8: 5625438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; /* does not support swizzleing the alpha channel yet */ 5635438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a2r10g10b10: 5645438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x2r10g10b10: 5655438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a2b10g10r10: 5665438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x2b10g10r10: 5675438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5685438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz#endif 5695438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz default: 5705438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5715438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz } 5725438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5735438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz} 5745438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 575fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 576fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Composite entrypoints 577fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 578fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 579fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic Bool 580fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaCheckComposite(int op, 581fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell PicturePtr pSrcPicture, PicturePtr pMaskPicture, 582fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell PicturePtr pDstPicture) 583fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 584fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum]; 585fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 586fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 587f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 588fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell#if DEBUG_PRINT 589fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell debug_printf("ExaCheckComposite(%d, %p, %p, %p) = %d\n", 590fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell op, pSrcPicture, pMaskPicture, pDstPicture, accelerated); 591fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell#endif 592f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 593f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 594f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 595f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 596f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_composite_accelerated(op, 597f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom pSrcPicture, 598f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom pMaskPicture, 599f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom pDstPicture); 600fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 601fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 602fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 6035438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantzstatic Bool 60484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareComposite(int op, PicturePtr pSrcPicture, 60584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PicturePtr pMaskPicture, PicturePtr pDstPicture, 60684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) 60784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 60821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; 60921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 61021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 611ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer struct exa_pixmap_priv *priv; 61221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin 613f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 614f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 615f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 616e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 617c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin debug_printf("ExaPrepareComposite(%d, src=0x%p, mask=0x%p, dst=0x%p)\n", 618c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin op, pSrcPicture, pMaskPicture, pDstPicture); 619e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin debug_printf("\tFormats: src(%s), mask(%s), dst(%s)\n", 6203201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pSrcPicture ? render_format_name(pSrcPicture->format) : "none", 6213201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pMaskPicture ? render_format_name(pMaskPicture->format) : "none", 6223201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pDstPicture ? render_format_name(pDstPicture->format) : "none"); 623e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 6243a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 6256d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("accle not enabled"); 6263167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 627ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pDst); 6283a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6296d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pDst %s", !priv ? "!priv" : "!priv->tex"); 6303a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6313a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 63248780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 633287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) 634ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pDst format: %s", util_format_name(priv->tex->format)); 635ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 636e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz if (priv->picture_format != pDstPicture->format) 637e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pDst pic_format: %s != %s", 638e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 639e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pDstPicture->format)); 640e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 641ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer if (pSrc) { 642ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pSrc); 6433a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6446d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pSrc %s", !priv ? "!priv" : "!priv->tex"); 6453a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6463a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 64748780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 648287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 0)) 649ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pSrc format: %s", util_format_name(priv->tex->format)); 650e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 6515438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (!picture_check_formats(priv, pSrcPicture)) 652e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pSrc pic_format: %s != %s", 653e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 654e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pSrcPicture->format)); 655cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz 656ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer } 657ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 658ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer if (pMask) { 659ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pMask); 6603a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6616d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pMask %s", !priv ? "!priv" : "!priv->tex"); 6623a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6633a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 66448780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 665287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 0)) 666ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pMask format: %s", util_format_name(priv->tex->format)); 667e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 6685438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (!picture_check_formats(priv, pMaskPicture)) 669e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pMask pic_format: %s != %s", 670e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 671e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pMaskPicture->format)); 672ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer } 673ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 674f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture, 675992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pDstPicture, 676992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pSrc ? exaGetPixmapDriverPrivate(pSrc) : NULL, 677992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pMask ? exaGetPixmapDriverPrivate(pMask) : NULL, 678992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz exaGetPixmapDriverPrivate(pDst)); 67984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 68084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 68184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 68284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, 68384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int dstX, int dstY, int width, int height) 68484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 68521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; 68621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 68721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 68821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDst); 68921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin 690e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#if DEBUG_PRINT 691bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("\tExaComposite(src[%d,%d], mask=[%d, %d], dst=[%d, %d], dim=[%d, %d])\n", 692bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin srcX, srcY, maskX, maskY, dstX, dstY, width, height); 693bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin debug_printf("\t Num bound samplers = %d\n", 694bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin exa->num_bound_samplers); 695e226bf8a5d1e916b6c99397987eea4f31ee5de3bJakob Bornecrantz#endif 6963167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 69721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin xorg_composite(exa, priv, srcX, srcY, maskX, maskY, 69821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin dstX, dstY, width, height); 69984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 70084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 701fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 702fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 703fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 704fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneComposite(PixmapPtr pPixmap) 70584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 706fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; 70731ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 70831ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer struct exa_context *exa = ms->exa; 709fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 710fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell xorg_composite_done(exa); 71184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 71284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 713fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 714fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 715fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Pixmaps 716fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 717fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 71884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void * 71984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCreatePixmap(ScreenPtr pScreen, int size, int align) 72084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 72121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 72284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7232ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom priv = calloc(1, sizeof(struct exa_pixmap_priv)); 72484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 72584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return NULL; 72684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 72784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return priv; 72884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 72984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 73084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 73184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDestroyPixmap(ScreenPtr pScreen, void *dPriv) 73284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 73321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = (struct exa_pixmap_priv *)dPriv; 73484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 73584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 73684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 73784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 738287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&priv->tex, NULL); 73984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7402ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom free(priv); 74184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 74284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 74384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 74484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPixmapIsOffscreen(PixmapPtr pPixmap) 74584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 74621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 74784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 74884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 74984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 75184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 75284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (priv->tex) 75484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 75584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 75784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 75884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7593905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint 7603905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_displayed_usage(PixmapPtr pPixmap) 7613905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{ 7623905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz struct exa_pixmap_priv *priv; 7633905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 7643905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7653905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz if (!priv) { 7663905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz FatalError("NO PIXMAP PRIVATE\n"); 7673905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7683905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz } 7693905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 770287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell priv->flags |= PIPE_BIND_SCANOUT; 7713905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7723905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7733905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz} 7743905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7753905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint 7763905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_shared_usage(PixmapPtr pPixmap) 7773905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{ 7783905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz struct exa_pixmap_priv *priv; 7793905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 7803905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7813905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz if (!priv) { 7823905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz FatalError("NO PIXMAP PRIVATE\n"); 7833905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7843905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz } 7853905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 786287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell priv->flags |= PIPE_BIND_SHARED; 7873905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7883905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7893905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz} 7903905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 79184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 79284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 79384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 7944236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwellsize_match( int width, int tex_width ) 7954236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell{ 7964236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#if ROUND_UP_TEXTURES 7974236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (width > tex_width) 7984236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return FALSE; 7994236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8004236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (width * 2 < tex_width) 8014236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return FALSE; 8024236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8034236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return TRUE; 8044236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#else 8054236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return width == tex_width; 8064236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#endif 8074236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell} 8084236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8094236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwellstatic Bool 81084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, 81184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int depth, int bitsPerPixel, int devKind, 81284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pointer pPixData) 81384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 81484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPixmap->drawable.pScreen; 81584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 81621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 81784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 81821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 81984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 82040e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer if (!priv || pPixData) 82184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 82284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 823cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell if (0) { 824cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell debug_printf("%s pixmap %p sz %dx%dx%d devKind %d\n", 825cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell __FUNCTION__, pPixmap, width, height, bitsPerPixel, devKind); 826cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 827cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell if (priv->tex) 828cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell debug_printf(" ==> old texture %dx%d\n", 82906d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell priv->tex->width0, 83006d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell priv->tex->height0); 831cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell } 832cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 833cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 83484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (depth <= 0) 83584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz depth = pPixmap->drawable.depth; 83684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 83784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (bitsPerPixel <= 0) 83884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz bitsPerPixel = pPixmap->drawable.bitsPerPixel; 83984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (width <= 0) 84184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz width = pPixmap->drawable.width; 84284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (height <= 0) 84484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz height = pPixmap->drawable.height; 84584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (width <= 0 || height <= 0 || depth <= 0) 84784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 84884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz miModifyPixmapHeader(pPixmap, width, height, depth, 85084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz bitsPerPixel, devKind, NULL); 85184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 8524236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->width = width; 8534236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->height = height; 8544236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 85584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz /* Deal with screen resize */ 85631ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer if ((exa->accel || priv->flags) && 85731ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer (!priv->tex || 85806d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell !size_match(width, priv->tex->width0) || 85906d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell !size_match(height, priv->tex->height0) || 8604236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->tex_flags != priv->flags)) { 861287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture = NULL; 862287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource template; 863316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 864316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer memset(&template, 0, sizeof(template)); 865316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.target = PIPE_TEXTURE_2D; 866e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &priv->picture_format); 8674236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (ROUND_UP_TEXTURES && priv->flags == 0) { 86806d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.width0 = util_next_power_of_two(width); 86906d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.height0 = util_next_power_of_two(height); 8704236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell } 8714236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell else { 87206d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.width0 = width; 87306d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.height0 = height; 8744236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell } 8754236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 876d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.depth0 = 1; 8774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger template.array_size = 1; 878316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.last_level = 0; 879287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind = PIPE_BIND_RENDER_TARGET | priv->flags; 880316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer priv->tex_flags = priv->flags; 881287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texture = exa->scrn->resource_create(exa->scrn, &template); 882316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 883316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer if (priv->tex) { 8844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_box src_box; 8854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_box_origin_2d(min(width, texture->width0), 8864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger min(height, texture->height0), 8874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger &src_box); 88848780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->pipe->resource_copy_region(exa->pipe, texture, 8894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, 0, 0, 89048780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex, 8914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, &src_box); 8923c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer } 89340e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer 894287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&priv->tex, texture); 895bade906ed131e35ed1782f4687760dcdca233299Jakob Bornecrantz /* the texture we create has one reference */ 896287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&texture, NULL); 897f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer } 898f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer 89984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 90084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 90184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 902287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource * 90384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_get_texture(PixmapPtr pPixmap) 90484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 905f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 906287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = NULL; 907287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&tex, priv->tex); 908f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return tex; 90984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 91084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 911846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob BornecrantzBool 912287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellxorg_exa_set_texture(PixmapPtr pPixmap, struct pipe_resource *tex) 913846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz{ 914846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 915846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 916287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell int mask = PIPE_BIND_SHARED | PIPE_BIND_SCANOUT; 917846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 918846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz if (!priv) 919846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return FALSE; 920846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 921d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pPixmap->drawable.width != tex->width0 || 922d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger pPixmap->drawable.height != tex->height0) 923846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return FALSE; 924846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 925287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&priv->tex, tex); 926287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell priv->tex_flags = tex->bind & mask; 927846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 928846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return TRUE; 929846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz} 930846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 931287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource * 932846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantzxorg_exa_create_root_texture(ScrnInfoPtr pScrn, 933846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int width, int height, 934846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int depth, int bitsPerPixel) 935846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz{ 936846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 937846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct exa_context *exa = ms->exa; 938287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource template; 939e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz int dummy; 940846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 941846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz memset(&template, 0, sizeof(template)); 942846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.target = PIPE_TEXTURE_2D; 943e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &dummy); 944d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.width0 = width; 945d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.height0 = height; 946d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.depth0 = 1; 9474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger template.array_size = 1; 948846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.last_level = 0; 949287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind |= PIPE_BIND_RENDER_TARGET; 950287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind |= PIPE_BIND_SCANOUT; 951287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind |= PIPE_BIND_SHARED; 952846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 953287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return exa->scrn->resource_create(exa->scrn, &template); 954846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz} 955846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 95684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid 95784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_close(ScrnInfoPtr pScrn) 95884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 959f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 960f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_context *exa = ms->exa; 96184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 962ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&exa->bound_sampler_views[0], NULL); 963ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&exa->bound_sampler_views[1], NULL); 964ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger 965319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin renderer_destroy(exa->renderer); 96617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin 967366798ac6f10daae059d299b92ddf709875cc7caJakob Bornecrantz xorg_exa_finish(exa); 968366798ac6f10daae059d299b92ddf709875cc7caJakob Bornecrantz 9698c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin if (exa->pipe) 9708c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->destroy(exa->pipe); 9715fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz exa->pipe = NULL; 9725fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz /* Since this was shared be proper with the pointer */ 9735fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz ms->ctx = NULL; 97484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 975f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin exaDriverFini(pScrn->pScreen); 9762ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom free(exa); 977f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin ms->exa = NULL; 97884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 97984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 98084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid * 98131ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzerxorg_exa_init(ScrnInfoPtr pScrn, Bool accel) 98284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 983f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 984f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_context *exa; 985f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin ExaDriverPtr pExa; 986d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom CustomizerPtr cust = ms->cust; 987f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 9882ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom exa = calloc(1, sizeof(struct exa_context)); 989f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!exa) 990f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return NULL; 991f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 992f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa = exaDriverAlloc(); 993f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!pExa) { 994f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin goto out_err; 995f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin } 996f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 997f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin memset(pExa, 0, sizeof(*pExa)); 998f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 999f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->exa_major = 2; 1000f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->exa_minor = 2; 1001f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->memoryBase = 0; 1002f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->memorySize = 0; 1003f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->offScreenBase = 0; 1004f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->pixmapOffsetAlign = 0; 1005f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->pixmapPitchAlign = 1; 1006f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS; 1007e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_SUPPORTS_PREPARE_AUX 1008e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer pExa->flags |= EXA_SUPPORTS_PREPARE_AUX; 1009e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif 1010e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_MIXED_PIXMAPS 1011e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer pExa->flags |= EXA_MIXED_PIXMAPS; 1012e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif 1013f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->maxX = 8191; /* FIXME */ 1014f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->maxY = 8191; /* FIXME */ 1015f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1016f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->WaitMarker = ExaWaitMarker; 1017f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->MarkSync = ExaMarkSync; 1018f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareSolid = ExaPrepareSolid; 1019f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Solid = ExaSolid; 1020fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pExa->DoneSolid = ExaDoneSolid; 1021f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareCopy = ExaPrepareCopy; 1022f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Copy = ExaCopy; 1023fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pExa->DoneCopy = ExaDoneCopy; 1024f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->CheckComposite = ExaCheckComposite; 1025f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareComposite = ExaPrepareComposite; 1026f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Composite = ExaComposite; 1027f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->DoneComposite = ExaDoneComposite; 1028f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PixmapIsOffscreen = ExaPixmapIsOffscreen; 1029385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer pExa->DownloadFromScreen = ExaDownloadFromScreen; 1030385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer pExa->UploadToScreen = ExaUploadToScreen; 1031f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareAccess = ExaPrepareAccess; 1032f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->FinishAccess = ExaFinishAccess; 1033f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->CreatePixmap = ExaCreatePixmap; 1034f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->DestroyPixmap = ExaDestroyPixmap; 1035f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->ModifyPixmapHeader = ExaModifyPixmapHeader; 1036f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1037f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!exaDriverInit(pScrn->pScreen, pExa)) { 1038f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin goto out_err; 1039f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin } 1040f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1041f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin exa->scrn = ms->screen; 10427f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell exa->pipe = exa->scrn->context_create(exa->scrn, NULL); 10437f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell if (exa->pipe == NULL) 10447f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell goto out_err; 10457f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell 1046f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin /* Share context with DRI */ 10478c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin ms->ctx = exa->pipe; 1048d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom if (cust && cust->winsys_context_throttle) 1049d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom cust->winsys_context_throttle(cust, ms->ctx, THROTTLE_RENDER); 1050f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1051319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin exa->renderer = renderer_create(exa->pipe); 105231ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer exa->accel = accel; 1053feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin 1054f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return (void *)exa; 1055f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1056f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinout_err: 1057f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin xorg_exa_close(pScrn); 1058a143b6d5d8e2646a7daedc2a13f2b964b89dd0acVinson Lee free(exa); 1059f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1060f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return NULL; 1061f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin} 106284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 1063f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstruct pipe_surface * 10644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggerxorg_gpu_surface(struct pipe_context *pipe, struct exa_pixmap_priv *priv) 1065f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin{ 10664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface surf_tmpl; 10674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 10684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_tmpl, priv->tex, 10694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_BIND_RENDER_TARGET); 10704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 10714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger return pipe->create_surface(pipe, priv->tex, &surf_tmpl); 107284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 107384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 107484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 1075974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_flush(struct exa_context *exa, uint pipeFlushFlags, 1076974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin struct pipe_fence_handle **fence) 1077974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{ 10788c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->flush(exa->pipe, pipeFlushFlags, fence); 1079974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin} 1080974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1081974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_finish(struct exa_context *exa) 1082974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{ 1083974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin struct pipe_fence_handle *fence = NULL; 1084974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1085974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, &fence); 1086974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 10878c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 0); 10888c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->screen->fence_reference(exa->pipe->screen, &fence, NULL); 1089974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin} 1090974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1091