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