xm_st.c revision d500ad440503c79656f5610051dcb0ff76bafc58
1576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu/*
2576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Mesa 3-D graphics library
3576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Version:  7.9
4576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu *
5576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Copyright (C) 2010 LunarG Inc.
6576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu *
7576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
8576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * copy of this software and associated documentation files (the "Software"),
9576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * to deal in the Software without restriction, including without limitation
10576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
12576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Software is furnished to do so, subject to the following conditions:
13576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu *
14576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * The above copyright notice and this permission notice shall be included
15576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * in all copies or substantial portions of the Software.
16576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu *
17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE.
24576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu *
25576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Authors:
26576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu *    Chia-I Wu <olv@lunarg.com>
27576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu */
28576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
29576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu#include "xm_api.h"
30576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu#include "xm_st.h"
31576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
3240fd4323b4be0eee6d4204463737a37011739333Chia-I Wu#include "util/u_inlines.h"
3340fd4323b4be0eee6d4204463737a37011739333Chia-I Wu
34576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wustruct xmesa_st_framebuffer {
3548bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   XMesaDisplay display;
36576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   XMesaBuffer buffer;
3748bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   struct pipe_screen *screen;
38576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
39576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct st_visual stvis;
40d34f6e9db15a1fa3a7e3b68e47ac4eef2706b8cdLuca Barbieri   enum pipe_texture_target target;
41576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
4266cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   unsigned texture_width, texture_height, texture_mask;
43287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *textures[ST_ATTACHMENT_COUNT];
44576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
45576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct pipe_surface *display_surface;
46576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu};
47576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
48576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wustatic INLINE struct xmesa_st_framebuffer *
49576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_st_framebuffer(struct st_framebuffer_iface *stfbi)
50576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
51576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   return (struct xmesa_st_framebuffer *) stfbi->st_manager_private;
52576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
53576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
54576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu/**
55576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Display an attachment to the xlib_drawable of the framebuffer.
56576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu */
57576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wustatic boolean
58576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_st_framebuffer_display(struct st_framebuffer_iface *stfbi,
59576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                             enum st_attachment_type statt)
60576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
61576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
62287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *ptex = xstfb->textures[statt];
63576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct pipe_surface *psurf;
64576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
65576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   if (!ptex)
66576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      return TRUE;
67576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
68576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   psurf = xstfb->display_surface;
69576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   /* (re)allocate the surface for the texture to be displayed */
70576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   if (!psurf || psurf->texture != ptex) {
71576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      pipe_surface_reference(&xstfb->display_surface, NULL);
72576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
73576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      psurf = xstfb->screen->get_tex_surface(xstfb->screen,
74287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            ptex, 0, 0, 0, PIPE_BIND_DISPLAY_TARGET);
75576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      if (!psurf)
76576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         return FALSE;
77576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
78576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      xstfb->display_surface = psurf;
79576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   }
80576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
81576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   xstfb->screen->flush_frontbuffer(xstfb->screen, psurf, &xstfb->buffer->ws);
82576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
83576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   return TRUE;
84576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
85576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
86576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu/**
8748bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu * Copy the contents between the attachments.
8848bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu */
8948bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wustatic void
9048bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wuxmesa_st_framebuffer_copy_textures(struct st_framebuffer_iface *stfbi,
9148bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu                                   enum st_attachment_type src_statt,
9248bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu                                   enum st_attachment_type dst_statt,
9348bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu                                   unsigned x, unsigned y,
9448bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu                                   unsigned width, unsigned height)
9548bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu{
9648bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *src_ptex = xstfb->textures[src_statt];
98287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *dst_ptex = xstfb->textures[dst_statt];
99685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger   struct pipe_subresource subsrc, subdst;
10048bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   struct pipe_context *pipe;
10148bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu
10248bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   if (!src_ptex || !dst_ptex)
10348bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu      return;
10448bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu
10548bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   pipe = xstfb->display->pipe;
10648bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   if (!pipe) {
10748bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu      pipe = xstfb->screen->context_create(xstfb->screen, NULL);
10848bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu      if (!pipe)
10948bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu         return;
11048bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu      xstfb->display->pipe = pipe;
11148bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   }
11248bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu
113685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger   subsrc.face = 0;
114685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger   subsrc.level = 0;
115685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger   subdst.face = 0;
116685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger   subdst.level = 0;
11748bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu
118685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger   if (src_ptex && dst_ptex)
119685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger      pipe->resource_copy_region(pipe, dst_ptex, subdst, x, y, 0,
120685bb6941681f89f71a9169594d87c8e314b94d0Roland Scheidegger                                 src_ptex, subsrc, x, y, 0, width, height);
12148bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu}
12248bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu
12348bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu/**
124576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu * Remove outdated textures and create the requested ones.
125d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul * This is a helper used during framebuffer validation.
126576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu */
127f73feb9cd6095d82b87e7022c351408e6e232797José Fonsecastatic boolean
128576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_st_framebuffer_validate_textures(struct st_framebuffer_iface *stfbi,
12966cd38f465499863de106e1ae83b5de85072c29bChia-I Wu                                       unsigned width, unsigned height,
13066cd38f465499863de106e1ae83b5de85072c29bChia-I Wu                                       unsigned mask)
131576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
132576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
133287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource templ;
134867109f311a9f23a69465e5c65e02fe5a36a1507Brian Paul   enum st_attachment_type i;
135576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
13666cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   /* remove outdated textures */
13766cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   if (xstfb->texture_width != width || xstfb->texture_height != height) {
13866cd38f465499863de106e1ae83b5de85072c29bChia-I Wu      for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
139287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         pipe_resource_reference(&xstfb->textures[i], NULL);
14066cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   }
141576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
142576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   memset(&templ, 0, sizeof(templ));
143d34f6e9db15a1fa3a7e3b68e47ac4eef2706b8cdLuca Barbieri   templ.target = xstfb->target;
14466cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   templ.width0 = width;
14566cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   templ.height0 = height;
146576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   templ.depth0 = 1;
147576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   templ.last_level = 0;
148576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
149576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
150576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      enum pipe_format format;
151287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      unsigned bind;
152576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
153576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      /* the texture already exists or not requested */
15466cd38f465499863de106e1ae83b5de85072c29bChia-I Wu      if (xstfb->textures[i] || !(mask & (1 << i))) {
15566cd38f465499863de106e1ae83b5de85072c29bChia-I Wu         /* remember the texture */
15666cd38f465499863de106e1ae83b5de85072c29bChia-I Wu         if (xstfb->textures[i])
15766cd38f465499863de106e1ae83b5de85072c29bChia-I Wu            mask |= (1 << i);
158576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         continue;
15966cd38f465499863de106e1ae83b5de85072c29bChia-I Wu      }
160576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
161576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      switch (i) {
162576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      case ST_ATTACHMENT_FRONT_LEFT:
163576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      case ST_ATTACHMENT_BACK_LEFT:
164576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      case ST_ATTACHMENT_FRONT_RIGHT:
165576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      case ST_ATTACHMENT_BACK_RIGHT:
166576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         format = xstfb->stvis.color_format;
167287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         bind = PIPE_BIND_DISPLAY_TARGET |
168287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                     PIPE_BIND_RENDER_TARGET;
169576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         break;
170576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      case ST_ATTACHMENT_DEPTH_STENCIL:
171576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         format = xstfb->stvis.depth_stencil_format;
172287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         bind = PIPE_BIND_DEPTH_STENCIL;
173576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         break;
174576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      default:
175576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         format = PIPE_FORMAT_NONE;
176576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         break;
177576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      }
178576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
179576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      if (format != PIPE_FORMAT_NONE) {
180576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         templ.format = format;
181287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         templ.bind = bind;
182576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
183576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         xstfb->textures[i] =
184287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            xstfb->screen->resource_create(xstfb->screen, &templ);
185f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca         if (!xstfb->textures[i])
186f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca            return FALSE;
187576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      }
188576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   }
18966cd38f465499863de106e1ae83b5de85072c29bChia-I Wu
19066cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   xstfb->texture_width = width;
19166cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   xstfb->texture_height = height;
19266cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   xstfb->texture_mask = mask;
193f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca
194f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca   return TRUE;
195576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
196576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
197d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul
198d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul/**
199d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul * Called via st_framebuffer_iface::validate()
200d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul */
201576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wustatic boolean
202576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
203576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                              const enum st_attachment_type *statts,
204576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                              unsigned count,
205287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                              struct pipe_resource **out)
206576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
207576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
208d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu   unsigned statt_mask, new_mask, i;
209d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu   boolean resized;
210f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca   boolean ret;
21166cd38f465499863de106e1ae83b5de85072c29bChia-I Wu
21266cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   statt_mask = 0x0;
21366cd38f465499863de106e1ae83b5de85072c29bChia-I Wu   for (i = 0; i < count; i++)
21466cd38f465499863de106e1ae83b5de85072c29bChia-I Wu      statt_mask |= 1 << statts[i];
215d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu   /* record newly allocated textures */
216d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu   new_mask = statt_mask & ~xstfb->texture_mask;
217d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu
21842719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell   /* If xmesa_strict_invalidate is not set, we will not yet have
21942719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell    * called XGetGeometry().  Do so here:
22042719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell    */
22142719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell   if (!xmesa_strict_invalidate)
22242719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell      xmesa_check_buffer_size(xstfb->buffer);
22342719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell
224d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu   resized = (xstfb->buffer->width != xstfb->texture_width ||
225d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu              xstfb->buffer->height != xstfb->texture_height);
226576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
227576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   /* revalidate textures */
228d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu   if (resized || new_mask) {
229f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca      ret = xmesa_st_framebuffer_validate_textures(stfbi,
230f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca                  xstfb->buffer->width, xstfb->buffer->height, statt_mask);
231f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca      if (!ret)
232f73feb9cd6095d82b87e7022c351408e6e232797José Fonseca         return ret;
233d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu
234d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu      if (!resized) {
235d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu         enum st_attachment_type back, front;
236d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu
237d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu         back = ST_ATTACHMENT_BACK_LEFT;
238d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu         front = ST_ATTACHMENT_FRONT_LEFT;
239d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu         /* copy the contents if front is newly allocated and back is not */
240d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu         if ((statt_mask & (1 << back)) &&
241d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu             (new_mask & (1 << front)) &&
242d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu             !(new_mask & (1 << back))) {
243d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu            xmesa_st_framebuffer_copy_textures(stfbi, back, front,
244d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu                  0, 0, xstfb->texture_width, xstfb->texture_height);
245d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu         }
246d6262bdcfb64e1f88f6a890829f5c30c26bc372bChia-I Wu      }
247576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   }
248576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
249576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   for (i = 0; i < count; i++) {
250576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      out[i] = NULL;
251287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&out[i], xstfb->textures[statts[i]]);
252576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   }
253576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
254576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   return TRUE;
255576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
256576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
257d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul/**
258d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul * Called via st_framebuffer_iface::flush_front()
259d500ad440503c79656f5610051dcb0ff76bafc58Brian Paul */
260576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wustatic boolean
261576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
262576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                                 enum st_attachment_type statt)
263576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
264576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
265576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   boolean ret;
266576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
26772ed7eb15a12ad88647dddefde5999ddd308b9e4Chia-I Wu   ret = xmesa_st_framebuffer_display(stfbi, statt);
26842719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell
26942719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell   if (ret && xmesa_strict_invalidate)
270576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      xmesa_check_buffer_size(xstfb->buffer);
271576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
272576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   return ret;
273576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
274576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
275576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wustruct st_framebuffer_iface *
27648bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wuxmesa_create_st_framebuffer(XMesaDisplay xmdpy, XMesaBuffer b)
277576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
278576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct st_framebuffer_iface *stfbi;
279576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb;
280576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
28148bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   assert(xmdpy->display == b->xm_visual->display);
28248bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu
283576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   stfbi = CALLOC_STRUCT(st_framebuffer_iface);
284576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   xstfb = CALLOC_STRUCT(xmesa_st_framebuffer);
285576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   if (!stfbi || !xstfb) {
286576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      if (stfbi)
287576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         FREE(stfbi);
288576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      if (xstfb)
289576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         FREE(xstfb);
290576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      return NULL;
291576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   }
292576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
29348bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   xstfb->display = xmdpy;
294576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   xstfb->buffer = b;
29548bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   xstfb->screen = xmdpy->screen;
296576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   xstfb->stvis = b->xm_visual->stvis;
297d34f6e9db15a1fa3a7e3b68e47ac4eef2706b8cdLuca Barbieri   if(xstfb->screen->get_param(xstfb->screen, PIPE_CAP_NPOT_TEXTURES))
298d34f6e9db15a1fa3a7e3b68e47ac4eef2706b8cdLuca Barbieri      xstfb->target = PIPE_TEXTURE_2D;
299d34f6e9db15a1fa3a7e3b68e47ac4eef2706b8cdLuca Barbieri   else
300d34f6e9db15a1fa3a7e3b68e47ac4eef2706b8cdLuca Barbieri      xstfb->target = PIPE_TEXTURE_RECT;
301576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
302576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   stfbi->visual = &xstfb->stvis;
303576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   stfbi->flush_front = xmesa_st_framebuffer_flush_front;
304576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   stfbi->validate = xmesa_st_framebuffer_validate;
305576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   stfbi->st_manager_private = (void *) xstfb;
306576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
307576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   return stfbi;
308576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
309576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
310576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuvoid
311576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_destroy_st_framebuffer(struct st_framebuffer_iface *stfbi)
312576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
313576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
314495bfb0ad2e60638e7b2e94f36f0079e3f450091Chia-I Wu   int i;
315495bfb0ad2e60638e7b2e94f36f0079e3f450091Chia-I Wu
316495bfb0ad2e60638e7b2e94f36f0079e3f450091Chia-I Wu   pipe_surface_reference(&xstfb->display_surface, NULL);
317495bfb0ad2e60638e7b2e94f36f0079e3f450091Chia-I Wu
318495bfb0ad2e60638e7b2e94f36f0079e3f450091Chia-I Wu   for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
319287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&xstfb->textures[i], NULL);
320576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
321576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   FREE(xstfb);
322576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   FREE(stfbi);
323576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
324576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
325576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuvoid
326576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_swap_st_framebuffer(struct st_framebuffer_iface *stfbi)
327576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
328576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   struct xmesa_st_framebuffer *xstfb = xmesa_st_framebuffer(stfbi);
329576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   boolean ret;
330576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
331576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   ret = xmesa_st_framebuffer_display(stfbi, ST_ATTACHMENT_BACK_LEFT);
332576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   if (ret) {
333287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      struct pipe_resource **front, **back, *tmp;
334576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
335576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      front = &xstfb->textures[ST_ATTACHMENT_FRONT_LEFT];
336576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      back = &xstfb->textures[ST_ATTACHMENT_BACK_LEFT];
337576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      /* swap textures only if the front texture has been allocated */
338576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      if (*front) {
339576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         tmp = *front;
340576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         *front = *back;
341576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu         *back = tmp;
342576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu      }
343576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
34442719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell      if (xmesa_strict_invalidate)
34542719df0b866a00ea4a7739e82e1639c9943fcfdKeith Whitwell	 xmesa_check_buffer_size(xstfb->buffer);
346576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu   }
347576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
348576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu
349576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuvoid
350576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wuxmesa_copy_st_framebuffer(struct st_framebuffer_iface *stfbi,
351576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                          enum st_attachment_type src,
352576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                          enum st_attachment_type dst,
353576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu                          int x, int y, int w, int h)
354576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu{
35548bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   xmesa_st_framebuffer_copy_textures(stfbi, src, dst, x, y, w, h);
35648bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu   if (dst == ST_ATTACHMENT_FRONT_LEFT)
35748bc3cca89f7aecc40d1661e695796113df6e583Chia-I Wu      xmesa_st_framebuffer_display(stfbi, dst);
358576d9af505bd19ccaac04a68c8744f36f887bd5cChia-I Wu}
359