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