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