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