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 524236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#define ROUND_UP_TEXTURES 1 53ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin 546e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarzstatic INLINE void 556e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarzexa_debug_printf(const char *format, ...) _util_printf_format(1,2); 566e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz 576e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarzstatic INLINE void 586e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarzexa_debug_printf(const char *format, ...) 596e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz{ 606e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz#if 0 616e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz va_list ap; 626e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz va_start(ap, format); 636e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz _debug_vprintf(format, ap); 646e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz va_end(ap); 656e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz#else 666e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz (void) format; /* silence warning */ 676e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz#endif 686e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz} 696e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz 7084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* 7184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Helper functions 7284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */ 73e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstruct render_format_str { 74e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin int format; 75e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin const char *name; 76e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin}; 77e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstatic const struct render_format_str formats_info[] = 78e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin{ 79e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8r8g8b8, "PICT_a8r8g8b8"}, 80e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x8r8g8b8, "PICT_x8r8g8b8"}, 81e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8b8g8r8, "PICT_a8b8g8r8"}, 82e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x8b8g8r8, "PICT_x8b8g8r8"}, 83d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer#ifdef PICT_TYPE_BGRA 84e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8a8, "PICT_b8g8r8a8"}, 85e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8x8, "PICT_b8g8r8x8"}, 86d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_a2r10g10b10, "PICT_a2r10g10b10"}, 87d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_x2r10g10b10, "PICT_x2r10g10b10"}, 88d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_a2b10g10r10, "PICT_a2b10g10r10"}, 89d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer {PICT_x2b10g10r10, "PICT_x2b10g10r10"}, 90d3a37d93aba86ebca697169a31d88c3ef0ce34b9Michel Dänzer#endif 91e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r8g8b8, "PICT_r8g8b8"}, 92e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b8g8r8, "PICT_b8g8r8"}, 93e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r5g6b5, "PICT_r5g6b5"}, 94e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b5g6r5, "PICT_b5g6r5"}, 95e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1r5g5b5, "PICT_a1r5g5b5"}, 96e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x1r5g5b5, "PICT_x1r5g5b5"}, 97e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1b5g5r5, "PICT_a1b5g5r5"}, 98e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x1b5g5r5, "PICT_x1b5g5r5"}, 99e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4r4g4b4, "PICT_a4r4g4b4"}, 100e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4r4g4b4, "PICT_x4r4g4b4"}, 101e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4b4g4r4, "PICT_a4b4g4r4"}, 102e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4b4g4r4, "PICT_x4b4g4r4"}, 103e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a8, "PICT_a8"}, 104e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r3g3b2, "PICT_r3g3b2"}, 105e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b2g3r3, "PICT_b2g3r3"}, 106e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a2r2g2b2, "PICT_a2r2g2b2"}, 107e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a2b2g2r2, "PICT_a2b2g2r2"}, 108e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_c8, "PICT_c8"}, 109e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g8, "PICT_g8"}, 110e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4a4, "PICT_x4a4"}, 111e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4c4, "PICT_x4c4"}, 112e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_x4g4, "PICT_x4g4"}, 113e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a4, "PICT_a4"}, 114e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_r1g2b1, "PICT_r1g2b1"}, 115e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_b1g2r1, "PICT_b1g2r1"}, 116e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1r1g1b1, "PICT_a1r1g1b1"}, 117e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1b1g1r1, "PICT_a1b1g1r1"}, 118e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_c4, "PICT_c4"}, 119e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g4, "PICT_g4"}, 120e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_a1, "PICT_a1"}, 121e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin {PICT_g1, "PICT_g1"} 122e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin}; 123e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusinstatic const char *render_format_name(int format) 124e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin{ 125e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin int i = 0; 126e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin for (i = 0; i < sizeof(formats_info)/sizeof(formats_info[0]); ++i) { 127e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin if (formats_info[i].format == format) 128e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin return formats_info[i].name; 129e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin } 130e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin return NULL; 131e08512f3d4e318d0776f58296d7f7dae4c5524adZack Rusin} 13284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 133b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantzstatic void 134e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantzexa_get_pipe_format(int depth, enum pipe_format *format, int *bbp, int *picture_format) 13584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 13684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz switch (depth) { 13784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 32: 138d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B8G8R8A8_UNORM; 139e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_a8r8g8b8; 140b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 32); 141b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 14284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 24: 143d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B8G8R8X8_UNORM; 144e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_x8r8g8b8; 145b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 32); 146b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 14784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 16: 148d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B5G6R5_UNORM; 149e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_r5g6b5; 150b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 16); 151b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 15284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 15: 153d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B5G5R5A1_UNORM; 154e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_x1r5g5b5; 155b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz assert(*bbp == 16); 156b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 15784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 8: 158bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin *format = PIPE_FORMAT_L8_UNORM; 159e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz *picture_format = PICT_a8; 160be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer assert(*bbp == 8); 161be94a1d3bc147320ac7bfd98235783359bfada5cMichel Dänzer break; 16284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 4: 16384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz case 1: 164d34a1a7028d76d783bbe0337c1b5613e37b31179José Fonseca *format = PIPE_FORMAT_B8G8R8A8_UNORM; /* bad bad bad */ 165b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 16684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz default: 16784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz assert(0); 168b611f81477b196fed9d249b1e0f37ef186dd1426Jakob Bornecrantz break; 16984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz } 17084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 17184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 17257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin 17384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz/* 17484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz * Static exported EXA functions 17584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz */ 17684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 17784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 17884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaWaitMarker(ScreenPtr pScreen, int marker) 17984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 18010dbdee05694489edd03b353dfe133a17e65b469Michel Dänzer /* Nothing to do, handled in the PrepareAccess hook */ 18184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 18284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 18384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic int 18484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaMarkSync(ScreenPtr pScreen) 18584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 186c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin return 1; 18784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 18884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 189fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 190fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 191fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Screen upload/download 192fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 193fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 19484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 195385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaDownloadFromScreen(PixmapPtr pPix, int x, int y, int w, int h, char *dst, 196385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer int dst_pitch) 197385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{ 198385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScreenPtr pScreen = pPix->drawable.pScreen; 1992bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 200385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 201385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_context *exa = ms->exa; 202385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix); 203385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct pipe_transfer *transfer; 204385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 205385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!priv || !priv->tex) 206385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 207385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 2084c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer = pipe_get_transfer(exa->pipe, priv->tex, 0, 0, 2094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ, x, y, w, h); 210385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!transfer) 211385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 212385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 2136e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("------ ExaDownloadFromScreen(%d, %d, %d, %d, %d)\n", 214bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin x, y, w, h, dst_pitch); 215bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin 216decf6ed810eae473d043a4a399a5a84f1378a725Roland Scheidegger util_copy_rect((unsigned char*)dst, priv->tex->format, dst_pitch, 0, 0, 217475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell w, h, exa->pipe->transfer_map(exa->pipe, transfer), 218385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer transfer->stride, 0, 0); 219385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 220475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_unmap(exa->pipe, transfer); 221287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell exa->pipe->transfer_destroy(exa->pipe, transfer); 222385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 223385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return TRUE; 224385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer} 225385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 226385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool 227385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel DänzerExaUploadToScreen(PixmapPtr pPix, int x, int y, int w, int h, char *src, 228385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer int src_pitch) 229385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer{ 230385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer ScreenPtr pScreen = pPix->drawable.pScreen; 2312bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 232385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 233385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_context *exa = ms->exa; 234385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix); 235385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer struct pipe_transfer *transfer; 236385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 237385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!priv || !priv->tex) 238385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 239385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 2404c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger transfer = pipe_get_transfer(exa->pipe, priv->tex, 0, 0, 2414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_WRITE, x, y, w, h); 242385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer if (!transfer) 243385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return FALSE; 244385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 2456e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("++++++ ExaUploadToScreen(%d, %d, %d, %d, %d)\n", 246bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin x, y, w, h, src_pitch); 247bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin 248475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell util_copy_rect(exa->pipe->transfer_map(exa->pipe, transfer), 249decf6ed810eae473d043a4a399a5a84f1378a725Roland Scheidegger priv->tex->format, transfer->stride, 0, 0, w, h, 250385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer (unsigned char*)src, src_pitch, 0, 0); 251385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 252475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_unmap(exa->pipe, transfer); 253287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell exa->pipe->transfer_destroy(exa->pipe, transfer); 254385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 255385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer return TRUE; 256385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer} 257385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer 258385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzerstatic Bool 25984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareAccess(PixmapPtr pPix, int index) 26084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 26184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPix->drawable.pScreen; 2622bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 26384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 26421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 26521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 26684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 26784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPix); 26884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 26984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 27084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 27184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 27284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv->tex) 27384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 274dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz 275bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaPrepareAccess %d\n", index); 276bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 277316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer if (priv->map_count == 0) 27884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz { 27906d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell assert(pPix->drawable.width <= priv->tex->width0); 28006d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell assert(pPix->drawable.height <= priv->tex->height0); 2814236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 28284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv->map_transfer = 2834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger pipe_get_transfer(exa->pipe, priv->tex, 0, 0, 284316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer#ifdef EXA_MIXED_PIXMAPS 285316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer PIPE_TRANSFER_MAP_DIRECTLY | 286316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer#endif 28784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PIPE_TRANSFER_READ_WRITE, 2884236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 0, 0, 2894236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell pPix->drawable.width, 2904236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell pPix->drawable.height ); 291db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz if (!priv->map_transfer) 292db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#ifdef EXA_MIXED_PIXMAPS 293316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer return FALSE; 294db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#else 295db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz FatalError("failed to create transfer\n"); 296db828ed7589d0a5687386c4b4268b4e7ff78c866Jakob Bornecrantz#endif 29784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 29884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pPix->devPrivate.ptr = 299475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_map(exa->pipe, priv->map_transfer); 30084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pPix->devKind = priv->map_transfer->stride; 30184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz } 30284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 303316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer priv->map_count++; 304316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 305bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaPrepareAccess %d prepared\n", index); 306bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 30784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 30884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 30984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 31084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 31184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaFinishAccess(PixmapPtr pPix, int index) 31284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 31384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPix->drawable.pScreen; 3142bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 31584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 31621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 31721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 31884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPix); 31984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 32084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 32184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 32284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 32384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv->map_transfer) 32484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 32584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 326bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaFinishAccess %d\n", index); 327bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 328dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz if (--priv->map_count == 0) { 329dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz assert(priv->map_transfer); 330475ab3b5aff71edd95776783dd65417006db951fKeith Whitwell exa->pipe->transfer_unmap(exa->pipe, priv->map_transfer); 331287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell exa->pipe->transfer_destroy(exa->pipe, priv->map_transfer); 332dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz priv->map_transfer = NULL; 333d80242c2546f795e37ce88955c823c054fdfe217Jakob Bornecrantz pPix->devPrivate.ptr = NULL; 334dca226fefb9a0e469ca34b3c1e364b60fae341faJakob Bornecrantz } 335bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 336bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaFinishAccess %d finished\n", index); 33784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 33884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 339fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 340fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Solid Fills 341fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 34284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 34384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 34484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg) 34584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 3462bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 34784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 34821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 34921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 35084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3516e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("ExaPrepareSolid(0x%x)\n", fg); 3526e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz 353f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 354f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 355f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 3563a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 357951244c4cde0855bcdd9b66f1290de1227f4b827Marcin Slusarz XORG_FALLBACK("accel not enabled"); 35884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 35984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv || !priv->tex) 3606d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("%s", !priv ? "!priv" : "!priv->tex"); 36184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3623a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask)) 3636d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("planeMask is not solid"); 36445cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer 36584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (alu != GXcopy) 3666d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("not GXcopy"); 36784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3683a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 36948780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 370e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_RENDER_TARGET)) { 371ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("format %s", util_format_name(priv->tex->format)); 3723a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz } 373ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin 374f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_solid_bind_state(exa, priv, fg); 37584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 37684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 37784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 37884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1) 37984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 3802bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 38184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 38221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 38321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 38484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 3856e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("\tExaSolid(%d, %d, %d, %d)\n", x0, y0, x1, y1); 3866be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin 38742db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer if (x0 == 0 && y0 == 0 && 38842db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer x1 == pPixmap->drawable.width && y1 == pPixmap->drawable.height) { 3896dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie union pipe_color_union solid_color; 3906dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie solid_color.f[0] = exa->solid_color[0]; 3916dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie solid_color.f[1] = exa->solid_color[1]; 3926dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie solid_color.f[2] = exa->solid_color[2]; 3936dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie solid_color.f[3] = exa->solid_color[3]; 3946dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie exa->pipe->clear(exa->pipe, PIPE_CLEAR_COLOR, &solid_color, 0.0, 0); 39542db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer return; 39642db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer } 39742db8c8cdb28bd5f83dd57f5d9a70fb5b94dd14eMichel Dänzer 398ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin xorg_solid(exa, priv, x0, y0, x1, y1) ; 39984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 40084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 401fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 402fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 403fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneSolid(PixmapPtr pPixmap) 404fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 4052bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 406fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 407fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 408fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 409fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 410fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell if (!priv) 411fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell return; 412bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 413bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaDoneSolid\n"); 414fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell xorg_composite_done(exa); 415bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaDoneSolid done\n"); 416fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 417fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 418fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 419fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Copy Blits 420fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 421fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 42284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 42384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, 42484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int ydir, int alu, Pixel planeMask) 42584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 4262bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); 42784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 42821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 42921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDstPixmap); 43021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap); 43184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 4326e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("ExaPrepareCopy\n"); 433f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 434f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 435f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 436f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 4373a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 4385815d06ac5a49a99a3659ba970a2f8df92c87a57Michel Dänzer XORG_FALLBACK("accel not enabled"); 4393167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 4406d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz if (!priv || !priv->tex) 4416d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pDst %s", !priv ? "!priv" : "!priv->tex"); 4423a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 4436d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz if (!src_priv || !src_priv->tex) 4446d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pSrc %s", !src_priv ? "!priv" : "!priv->tex"); 44584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 44684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask)) 4476d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("planeMask is not solid"); 44884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 4493a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (alu != GXcopy) 4506d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("alu not GXcopy"); 45184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 45245cf2696ca2ad5f2ef77a3c35ee1d0ab1709b1daMichel Dänzer if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 45348780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 454e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_RENDER_TARGET)) 455ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pDst format %s", util_format_name(priv->tex->format)); 4563a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 4573a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, src_priv->tex->format, 45848780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger src_priv->tex->target, 0, 459e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_SAMPLER_VIEW)) 460ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pSrc format %s", util_format_name(src_priv->tex->format)); 46184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 46257d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin exa->copy.src = src_priv; 46357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin exa->copy.dst = priv; 46484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 465f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return TRUE; 46684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 46784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 46884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 46984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, 47084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int width, int height) 47184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 4722bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); 47357d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 47457d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin struct exa_context *exa = ms->exa; 47576d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer struct pipe_box src_box; 47657d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin 4776e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("\tExaCopy(srcx=%d, srcy=%d, dstX=%d, dstY=%d, w=%d, h=%d)\n", 47857d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin srcX, srcY, dstX, dstY, width, height); 47984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 48076d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer debug_assert(exaGetPixmapDriverPrivate(pDstPixmap) == exa->copy.dst); 48176d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 48276d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer u_box_2d(srcX, srcY, width, height, &src_box); 48376d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 48476d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer /* If source and destination overlap, we have to copy to/from a scratch 48576d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer * pixmap. 48676d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer */ 48776d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer if (exa->copy.dst == exa->copy.src && 48876d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer !((dstX + width) < srcX || dstX > (srcX + width) || 48976d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer (dstY + height) < srcY || dstY > (srcY + height))) { 49076d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer struct exa_pixmap_priv *tmp_priv; 49176d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 49276d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer if (!exa->copy.tmp_pix) { 49376d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exa->copy.tmp_pix = pScrn->pScreen->CreatePixmap(pScrn->pScreen, 49476d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer pDstPixmap->drawable.width, 49576d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer pDstPixmap->drawable.height, 49676d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer pDstPixmap->drawable.depth, 49776d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer pDstPixmap->drawable.width); 49876d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exaMoveInPixmap(exa->copy.tmp_pix); 49976d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer } 50076d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 50176d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer tmp_priv = exaGetPixmapDriverPrivate(exa->copy.tmp_pix); 5023167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 50376d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exa->pipe->resource_copy_region( exa->pipe, 50476d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer tmp_priv->tex, 50576d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 0, 50676d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer srcX, srcY, 0, 50776d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exa->copy.src->tex, 50876d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 0, &src_box); 50976d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exa->pipe->resource_copy_region( exa->pipe, 51076d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exa->copy.dst->tex, 51176d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 0, 51276d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer dstX, dstY, 0, 51376d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer tmp_priv->tex, 51476d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer 0, &src_box); 51576d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer } else 51648780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->pipe->resource_copy_region( exa->pipe, 51748780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->copy.dst->tex, 5184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 51948780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger dstX, dstY, 0, 52048780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->copy.src->tex, 5214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, &src_box); 52284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 52384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 524fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 525fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneCopy(PixmapPtr pPixmap) 526fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 5272bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 528fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 529fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 530fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 531fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 532fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell if (!priv) 533fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell return; 534fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 535bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaDoneCopy\n"); 536bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 53776d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer if (exa->copy.tmp_pix) { 53876d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer pScrn->pScreen->DestroyPixmap(exa->copy.tmp_pix); 53976d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer exa->copy.tmp_pix = NULL; 54076d6a64de30dc3af66c5aec855f1fc6560d85a89Michel Dänzer } 541fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell exa->copy.src = NULL; 542fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell exa->copy.dst = NULL; 543bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz 544bd3ce30ee7e33663ddebe17f514341f016751a2fMarcin Slusarz exa_debug_printf("ExaDoneCopy done\n"); 545fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 546fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 547fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 5484509f3cbad2972b6fe4a722ed07904666122a759Keith Whitwell 54984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 5505438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantzpicture_check_formats(struct exa_pixmap_priv *pSrc, PicturePtr pSrcPicture) 5515438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz{ 5525438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (pSrc->picture_format == pSrcPicture->format) 5535438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return TRUE; 5545438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 5555438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (pSrc->picture_format != PICT_a8r8g8b8) 5565438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5575438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 5585438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz /* pSrc->picture_format == PICT_a8r8g8b8 */ 5595438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz switch (pSrcPicture->format) { 5605438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a8r8g8b8: 5615438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x8r8g8b8: 5625438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a8b8g8r8: 5635438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x8b8g8r8: 5645438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz /* just treat these two as x8... */ 5655438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_r8g8b8: 5665438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8: 5675438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return TRUE; 5685438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz#ifdef PICT_TYPE_BGRA 5695438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8a8: 5705438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_b8g8r8x8: 5715438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; /* does not support swizzleing the alpha channel yet */ 5725438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a2r10g10b10: 5735438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x2r10g10b10: 5745438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_a2b10g10r10: 5755438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz case PICT_x2b10g10r10: 5765438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5775438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz#endif 5785438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz default: 5795438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5805438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz } 5815438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz return FALSE; 5825438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz} 5835438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz 584fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 585fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Composite entrypoints 586fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 587fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 588fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic Bool 589fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaCheckComposite(int op, 590fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell PicturePtr pSrcPicture, PicturePtr pMaskPicture, 591fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell PicturePtr pDstPicture) 592fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell{ 5932bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPicture->pDrawable->pScreen); 594fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell modesettingPtr ms = modesettingPTR(pScrn); 595fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell struct exa_context *exa = ms->exa; 5967c5eaf5a2de7a469dab25dc3e9ba65d74ecc9765Marcin Slusarz Bool accelerated = exa->accel && xorg_composite_accelerated(op, 5977c5eaf5a2de7a469dab25dc3e9ba65d74ecc9765Marcin Slusarz pSrcPicture, 5987c5eaf5a2de7a469dab25dc3e9ba65d74ecc9765Marcin Slusarz pMaskPicture, 5997c5eaf5a2de7a469dab25dc3e9ba65d74ecc9765Marcin Slusarz pDstPicture); 600f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 6016e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("ExaCheckComposite(%d, %p, %p, %p) = %d\n", 602fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell op, pSrcPicture, pMaskPicture, pDstPicture, accelerated); 603f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 6047c5eaf5a2de7a469dab25dc3e9ba65d74ecc9765Marcin Slusarz return accelerated; 605fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell} 606fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 607fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 6085438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantzstatic Bool 60984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPrepareComposite(int op, PicturePtr pSrcPicture, 61084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PicturePtr pMaskPicture, PicturePtr pDstPicture, 61184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) 61284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 6132bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); 61421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 61521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 616ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer struct exa_pixmap_priv *priv; 61721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin 618f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom if (!exa->accel) 619f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return FALSE; 620f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom 6216e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("ExaPrepareComposite(%d, src=0x%p, mask=0x%p, dst=0x%p)\n", 622c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin op, pSrcPicture, pMaskPicture, pDstPicture); 6236e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("\tFormats: src(%s), mask(%s), dst(%s)\n", 6243201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pSrcPicture ? render_format_name(pSrcPicture->format) : "none", 6253201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pMaskPicture ? render_format_name(pMaskPicture->format) : "none", 6263201c655e4c393d5ae794e6373de8ef705b979a4Jakob Bornecrantz pDstPicture ? render_format_name(pDstPicture->format) : "none"); 6276e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz 6283a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->pipe) 6295815d06ac5a49a99a3659ba970a2f8df92c87a57Michel Dänzer XORG_FALLBACK("accel not enabled"); 6303167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 631ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pDst); 6323a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6336d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pDst %s", !priv ? "!priv" : "!priv->tex"); 6343a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6353a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 63648780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 637e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_RENDER_TARGET)) 638ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pDst format: %s", util_format_name(priv->tex->format)); 639ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 640e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz if (priv->picture_format != pDstPicture->format) 641e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pDst pic_format: %s != %s", 642e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 643e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pDstPicture->format)); 644e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 645ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer if (pSrc) { 646ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pSrc); 6473a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6486d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pSrc %s", !priv ? "!priv" : "!priv->tex"); 6493a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6503a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 65148780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 652e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_SAMPLER_VIEW)) 653ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pSrc format: %s", util_format_name(priv->tex->format)); 654e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 6555438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (!picture_check_formats(priv, pSrcPicture)) 656e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pSrc pic_format: %s != %s", 657e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 658e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pSrcPicture->format)); 659cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz 660ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer } 661ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 662ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer if (pMask) { 663ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer priv = exaGetPixmapDriverPrivate(pMask); 6643a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!priv || !priv->tex) 6656d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz XORG_FALLBACK("pMask %s", !priv ? "!priv" : "!priv->tex"); 6663a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz 6673a8d525373c50c6cdc9ae5dd00e7298ab58df8c6Jakob Bornecrantz if (!exa->scrn->is_format_supported(exa->scrn, priv->tex->format, 66848780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex->target, 0, 669e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_SAMPLER_VIEW)) 670ee65faffc1ae878fc7998ca52f1c5e298ae61176José Fonseca XORG_FALLBACK("pMask format: %s", util_format_name(priv->tex->format)); 671e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz 6725438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz if (!picture_check_formats(priv, pMaskPicture)) 673e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz XORG_FALLBACK("pMask pic_format: %s != %s", 674e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(priv->picture_format), 675e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz render_format_name(pMaskPicture->format)); 676ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer } 677ac2e0ddcd8f33505aee20e94dd64a804812f07fbMichel Dänzer 678f44f6473e60fdcde24b0d8b166fce8a2ffe366b7Thomas Hellstrom return xorg_composite_bind_state(exa, op, pSrcPicture, pMaskPicture, 679992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pDstPicture, 680992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pSrc ? exaGetPixmapDriverPrivate(pSrc) : NULL, 681992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz pMask ? exaGetPixmapDriverPrivate(pMask) : NULL, 682992b143b2551b0fe1871bc90aed984f63d04d7b5Jakob Bornecrantz exaGetPixmapDriverPrivate(pDst)); 68384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 68484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 68584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 68684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, 68784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int dstX, int dstY, int width, int height) 68884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 6892bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); 69021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 69121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 69221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pDst); 69321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin 6946e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("\tExaComposite(src[%d,%d], mask=[%d, %d], dst=[%d, %d], dim=[%d, %d])\n", 695bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin srcX, srcY, maskX, maskY, dstX, dstY, width, height); 6966e0263fdd45c16ba83aceab60084918d3b8bf9d2Marcin Slusarz exa_debug_printf("\t Num bound samplers = %d\n", 697bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin exa->num_bound_samplers); 6983167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin 69921cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin xorg_composite(exa, priv, srcX, srcY, maskX, maskY, 70021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin dstX, dstY, width, height); 70184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 70284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 703fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 704fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 705fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwellstatic void 706fa799f81dec1b72e59008b7029d94a00bcf821bbKeith WhitwellExaDoneComposite(PixmapPtr pPixmap) 70784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 7082bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 70931ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer modesettingPtr ms = modesettingPTR(pScrn); 71031ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer struct exa_context *exa = ms->exa; 711fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 712fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell xorg_composite_done(exa); 71384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 71484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 715fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 716fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell/*********************************************************************** 717fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell * Pixmaps 718fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell */ 719fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell 72084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void * 72184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaCreatePixmap(ScreenPtr pScreen, int size, int align) 72284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 72321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 72484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7252ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom priv = calloc(1, sizeof(struct exa_pixmap_priv)); 72684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 72784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return NULL; 72884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 72984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return priv; 73084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 73184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 73284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic void 73384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaDestroyPixmap(ScreenPtr pScreen, void *dPriv) 73484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 73521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = (struct exa_pixmap_priv *)dPriv; 73684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 73784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 73884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return; 73984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 740287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&priv->tex, NULL); 74184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7422ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom free(priv); 74384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 74484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 74584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 74684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaPixmapIsOffscreen(PixmapPtr pPixmap) 74784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 74821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv; 74984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 75184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (!priv) 75384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 75484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (priv->tex) 75684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 75784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 75884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 75984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 76084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 7613905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint 7623905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_displayed_usage(PixmapPtr pPixmap) 7633905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{ 7643905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz struct exa_pixmap_priv *priv; 7653905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 7663905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7673905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz if (!priv) { 7683905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz FatalError("NO PIXMAP PRIVATE\n"); 7693905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7703905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz } 7713905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 772287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell priv->flags |= PIPE_BIND_SCANOUT; 7733905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7743905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7753905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz} 7763905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7773905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzint 7783905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantzxorg_exa_set_shared_usage(PixmapPtr pPixmap) 7793905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz{ 7803905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz struct exa_pixmap_priv *priv; 7813905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz priv = exaGetPixmapDriverPrivate(pPixmap); 7823905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7833905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz if (!priv) { 7843905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz FatalError("NO PIXMAP PRIVATE\n"); 7853905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7863905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz } 7873905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 788287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell priv->flags |= PIPE_BIND_SHARED; 7893905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 7903905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz return 0; 7913905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz} 7923905119b4743eb5d284236cc237ee2c19ae3c5c8Jakob Bornecrantz 79384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 79484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 79584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzstatic Bool 7964236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwellsize_match( int width, int tex_width ) 7974236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell{ 7984236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#if ROUND_UP_TEXTURES 7994236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (width > tex_width) 8004236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return FALSE; 8014236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8024236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (width * 2 < tex_width) 8034236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return FALSE; 8044236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8054236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return TRUE; 8064236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#else 8074236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell return width == tex_width; 8084236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell#endif 8094236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell} 8104236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 8114236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwellstatic Bool 81284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob BornecrantzExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, 81384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz int depth, int bitsPerPixel, int devKind, 81484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz pointer pPixData) 81584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 81684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz ScreenPtr pScreen = pPixmap->drawable.pScreen; 8172bb2e6a6e3017d462be0ae9308955f37c5ee03c6Dave Airlie ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 81821cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 81984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 82021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin struct exa_context *exa = ms->exa; 82184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 82240e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer if (!priv || pPixData) 82384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 82484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 825cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell if (0) { 826cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell debug_printf("%s pixmap %p sz %dx%dx%d devKind %d\n", 827cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell __FUNCTION__, pPixmap, width, height, bitsPerPixel, devKind); 828cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 829cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell if (priv->tex) 830cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell debug_printf(" ==> old texture %dx%d\n", 83106d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell priv->tex->width0, 83206d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell priv->tex->height0); 833cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell } 834cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 835cf3cdda5cc413093126c7ba42248c3b175a2d126Keith Whitwell 83684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (depth <= 0) 83784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz depth = pPixmap->drawable.depth; 83884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 83984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (bitsPerPixel <= 0) 84084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz bitsPerPixel = pPixmap->drawable.bitsPerPixel; 84184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (width <= 0) 84384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz width = pPixmap->drawable.width; 84484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (height <= 0) 84684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz height = pPixmap->drawable.height; 84784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 84884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz if (width <= 0 || height <= 0 || depth <= 0) 84984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return FALSE; 85084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 85184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz miModifyPixmapHeader(pPixmap, width, height, depth, 85284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz bitsPerPixel, devKind, NULL); 85384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 8544236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->width = width; 8554236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->height = height; 8564236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 85784711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz /* Deal with screen resize */ 85831ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer if ((exa->accel || priv->flags) && 85931ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer (!priv->tex || 86006d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell !size_match(width, priv->tex->width0) || 86106d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell !size_match(height, priv->tex->height0) || 8624236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell priv->tex_flags != priv->flags)) { 863287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture = NULL; 864287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource template; 865316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 866316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer memset(&template, 0, sizeof(template)); 867316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.target = PIPE_TEXTURE_2D; 868e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &priv->picture_format); 8694236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell if (ROUND_UP_TEXTURES && priv->flags == 0) { 87006d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.width0 = util_next_power_of_two(width); 87106d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.height0 = util_next_power_of_two(height); 8724236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell } 8734236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell else { 87406d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.width0 = width; 87506d3732a9094030fc33120f16f162e0d405f132cKeith Whitwell template.height0 = height; 8764236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell } 8774236493899b9ccfcc8df3dcf81697776621fa1f8Keith Whitwell 878d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.depth0 = 1; 8794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger template.array_size = 1; 880316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer template.last_level = 0; 881287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind = PIPE_BIND_RENDER_TARGET | priv->flags; 882316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer priv->tex_flags = priv->flags; 883287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell texture = exa->scrn->resource_create(exa->scrn, &template); 884316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer 885316b4ddcf770e453b888ff7fbf96cb0aec1ce106Michel Dänzer if (priv->tex) { 8864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_box src_box; 8874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_box_origin_2d(min(width, texture->width0), 8884c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger min(height, texture->height0), 8894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger &src_box); 89048780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger exa->pipe->resource_copy_region(exa->pipe, texture, 8914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, 0, 0, 89248780ec9f99d7af4e98614be597adc3534d6918cRoland Scheidegger priv->tex, 8934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, &src_box); 8943c3ad915d831a962b284da42659ad15bcadcffa1Michel Dänzer } 89540e3148a81f93f590c7400b00a6c2d536a2258b0Michel Dänzer 896287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&priv->tex, texture); 897bade906ed131e35ed1782f4687760dcdca233299Jakob Bornecrantz /* the texture we create has one reference */ 898287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&texture, NULL); 899f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer } 900f3c7d6ff866cdd96cdd55baee94f58698a9656a3Michel Dänzer 90184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz return TRUE; 90284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 90384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 904287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource * 90584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_get_texture(PixmapPtr pPixmap) 90684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 907f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 908287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = NULL; 909287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&tex, priv->tex); 910f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return tex; 91184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 91284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 913846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob BornecrantzBool 914287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellxorg_exa_set_texture(PixmapPtr pPixmap, struct pipe_resource *tex) 915846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz{ 916846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPixmap); 917846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 918287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell int mask = PIPE_BIND_SHARED | PIPE_BIND_SCANOUT; 919846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 920846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz if (!priv) 921846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return FALSE; 922846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 923d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger if (pPixmap->drawable.width != tex->width0 || 924d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger pPixmap->drawable.height != tex->height0) 925846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return FALSE; 926846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 927287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&priv->tex, tex); 928287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell priv->tex_flags = tex->bind & mask; 929846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 930846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz return TRUE; 931846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz} 932846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 933287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource * 934846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantzxorg_exa_create_root_texture(ScrnInfoPtr pScrn, 935846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int width, int height, 936846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz int depth, int bitsPerPixel) 937846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz{ 938846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz modesettingPtr ms = modesettingPTR(pScrn); 939846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz struct exa_context *exa = ms->exa; 940287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource template; 941e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz int dummy; 942846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 943846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz memset(&template, 0, sizeof(template)); 944846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.target = PIPE_TEXTURE_2D; 945e4a19ffb13746ae4f62adca412d086d9461ff432Jakob Bornecrantz exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &dummy); 946d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.width0 = width; 947d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.height0 = height; 948d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger template.depth0 = 1; 9494c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger template.array_size = 1; 950846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz template.last_level = 0; 951287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind |= PIPE_BIND_RENDER_TARGET; 952287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind |= PIPE_BIND_SCANOUT; 953287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell template.bind |= PIPE_BIND_SHARED; 954846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 955287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell return exa->scrn->resource_create(exa->scrn, &template); 956846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz} 957846da0bfdae971cba84cd2ad9217c74c62e6bce9Jakob Bornecrantz 95884711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid 95984711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzxorg_exa_close(ScrnInfoPtr pScrn) 96084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 961f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 962f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_context *exa = ms->exa; 96384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 964ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&exa->bound_sampler_views[0], NULL); 965ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger pipe_sampler_view_reference(&exa->bound_sampler_views[1], NULL); 966ac8662c29dbf96b456d23308c1bc459eea63e36cRoland Scheidegger 967319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin renderer_destroy(exa->renderer); 96817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin 969366798ac6f10daae059d299b92ddf709875cc7caJakob Bornecrantz xorg_exa_finish(exa); 970366798ac6f10daae059d299b92ddf709875cc7caJakob Bornecrantz 9718c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin if (exa->pipe) 9728c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->destroy(exa->pipe); 9735fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz exa->pipe = NULL; 9745fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz /* Since this was shared be proper with the pointer */ 9755fdc4f732f6fb50dc324b60b0cff05b6eca46946Jakob Bornecrantz ms->ctx = NULL; 97684711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 977f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin exaDriverFini(pScrn->pScreen); 9782ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom free(exa); 979f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin ms->exa = NULL; 98084711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 98184711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 98284711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantzvoid * 98331ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzerxorg_exa_init(ScrnInfoPtr pScrn, Bool accel) 98484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz{ 985f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin modesettingPtr ms = modesettingPTR(pScrn); 986f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin struct exa_context *exa; 987f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin ExaDriverPtr pExa; 988d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom CustomizerPtr cust = ms->cust; 989f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 9902ab7a8a3ebf337aeed61166719adef9da4a1278aThomas Hellstrom exa = calloc(1, sizeof(struct exa_context)); 991f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!exa) 992f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return NULL; 993f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 99470f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach exa->scrn = ms->screen; 99570f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach exa->pipe = exa->scrn->context_create(exa->scrn, NULL); 99670f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach if (exa->pipe == NULL) 99770f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach goto out_err; 99870f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach 999f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa = exaDriverAlloc(); 1000f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!pExa) { 1001f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin goto out_err; 1002f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin } 1003f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1004f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->exa_major = 2; 1005f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->exa_minor = 2; 1006f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->memoryBase = 0; 1007f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->memorySize = 0; 1008f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->offScreenBase = 0; 1009f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->pixmapOffsetAlign = 0; 1010f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->pixmapPitchAlign = 1; 1011f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS; 1012e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_SUPPORTS_PREPARE_AUX 1013e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer pExa->flags |= EXA_SUPPORTS_PREPARE_AUX; 1014e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif 1015e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#ifdef EXA_MIXED_PIXMAPS 1016e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer pExa->flags |= EXA_MIXED_PIXMAPS; 1017e34ea368d9fccaf84b7e4aec4ba3f633eeaefec6Michel Dänzer#endif 101870f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach 101970f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach pExa->maxX = pExa->maxY = 102070f0eda12723e19147c07740a4b7fcb91a3076d4Lucas Stach 1 << (exa->scrn->get_param(exa->scrn, PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1); 1021f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1022f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->WaitMarker = ExaWaitMarker; 1023f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->MarkSync = ExaMarkSync; 1024f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareSolid = ExaPrepareSolid; 1025f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Solid = ExaSolid; 1026fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pExa->DoneSolid = ExaDoneSolid; 1027f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareCopy = ExaPrepareCopy; 1028f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Copy = ExaCopy; 1029fa799f81dec1b72e59008b7029d94a00bcf821bbKeith Whitwell pExa->DoneCopy = ExaDoneCopy; 1030f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->CheckComposite = ExaCheckComposite; 1031f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareComposite = ExaPrepareComposite; 1032f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->Composite = ExaComposite; 1033f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->DoneComposite = ExaDoneComposite; 1034f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PixmapIsOffscreen = ExaPixmapIsOffscreen; 1035385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer pExa->DownloadFromScreen = ExaDownloadFromScreen; 1036385620e5ebcbd5ee1fb4eaf75083ea540ac53955Michel Dänzer pExa->UploadToScreen = ExaUploadToScreen; 1037f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->PrepareAccess = ExaPrepareAccess; 1038f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->FinishAccess = ExaFinishAccess; 1039f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->CreatePixmap = ExaCreatePixmap; 1040f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->DestroyPixmap = ExaDestroyPixmap; 1041f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin pExa->ModifyPixmapHeader = ExaModifyPixmapHeader; 1042f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1043f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin if (!exaDriverInit(pScrn->pScreen, pExa)) { 1044f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin goto out_err; 1045f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin } 1046f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1047f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin /* Share context with DRI */ 10488c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin ms->ctx = exa->pipe; 1049d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom if (cust && cust->winsys_context_throttle) 1050d12f2bb9c03a9e8a08824c849200f5b23c05914cThomas Hellstrom cust->winsys_context_throttle(cust, ms->ctx, THROTTLE_RENDER); 1051f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1052319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin exa->renderer = renderer_create(exa->pipe); 105331ea323b4d432b557d7664187f17ccefc6d3947bMichel Dänzer exa->accel = accel; 1054feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin 1055f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return (void *)exa; 1056f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1057f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinout_err: 1058f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin xorg_exa_close(pScrn); 1059a143b6d5d8e2646a7daedc2a13f2b964b89dd0acVinson Lee free(exa); 1060f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin 1061f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin return NULL; 1062f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin} 106384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 1064f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstruct pipe_surface * 10654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggerxorg_gpu_surface(struct pipe_context *pipe, struct exa_pixmap_priv *priv) 1066f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin{ 10674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_surface surf_tmpl; 10684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 10694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger u_surface_default_template(&surf_tmpl, priv->tex, 10704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_BIND_RENDER_TARGET); 10714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 10724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger return pipe->create_surface(pipe, priv->tex, &surf_tmpl); 107384711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 107484711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz} 107584711c6582d08b8ea0bbdd0acd27d927a9bcbf4fJakob Bornecrantz 10767e02303497237cde958c28608477d0c355a8038bMarek Olšákvoid xorg_exa_flush(struct exa_context *exa, 1077974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin struct pipe_fence_handle **fence) 1078974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{ 10797e02303497237cde958c28608477d0c355a8038bMarek Olšák exa->pipe->flush(exa->pipe, fence); 1080974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin} 1081974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1082974dec2e7b86474af75708dd2cc8236416f25662Zack Rusinvoid xorg_exa_finish(struct exa_context *exa) 1083974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin{ 1084974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin struct pipe_fence_handle *fence = NULL; 1085974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 10867e02303497237cde958c28608477d0c355a8038bMarek Olšák xorg_exa_flush(exa, &fence); 1087974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1088bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák exa->pipe->screen->fence_finish(exa->pipe->screen, fence, 1089b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák PIPE_TIMEOUT_INFINITE); 10908c37a4c8fd133f3cddc6798a0834038730acc213Zack Rusin exa->pipe->screen->fence_reference(exa->pipe->screen, &fence, NULL); 1091974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin} 1092974dec2e7b86474af75708dd2cc8236416f25662Zack Rusin 1093