u_surface.c revision 287c94ea4987033f9c99a2f91c5750c9083504ca
149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul/************************************************************************** 249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * 349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Copyright 2009 VMware, Inc. All Rights Reserved. 449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * 549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * copy of this software and associated documentation files (the 749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * "Software"), to deal in the Software without restriction, including 849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 1049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * permit persons to whom the Software is furnished to do so, subject to 1149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * the following conditions: 1249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * 1349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * The above copyright notice and this permission notice (including the 1449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * next paragraph) shall be included in all copies or substantial portions 1549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * of the Software. 1649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * 1749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * 2549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul **************************************************************************/ 2649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 2749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul/** 2849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * @file 2949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Surface utility functions. 3049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * 3149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * @author Brian Paul 3249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul */ 3349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 3449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 3549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul#include "pipe/p_screen.h" 3649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul#include "pipe/p_state.h" 3749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul#include "pipe/p_defines.h" 3828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 3949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 40a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul#include "util/u_memory.h" 4149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul#include "util/u_surface.h" 4249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 4349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 4449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul/** 4549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Helper to quickly create an RGBA rendering surface of a certain size. 4649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * \param textureOut returns the new texture 4749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * \param surfaceOut returns the new surface 4849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * \return TRUE for success, FALSE if failure 4949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul */ 5049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulboolean 5149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulutil_create_rgba_surface(struct pipe_screen *screen, 5249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul uint width, uint height, 53287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell uint bind, 54287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource **textureOut, 5549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul struct pipe_surface **surfaceOut) 5649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul{ 5749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul static const enum pipe_format rgbaFormats[] = { 5849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul PIPE_FORMAT_B8G8R8A8_UNORM, 59712ba6e6b049c050af3ac1992aba009ebbe56ca5José Fonseca PIPE_FORMAT_A8R8G8B8_UNORM, 60712ba6e6b049c050af3ac1992aba009ebbe56ca5José Fonseca PIPE_FORMAT_A8B8G8R8_UNORM, 6149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul PIPE_FORMAT_NONE 6249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul }; 6349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul const uint target = PIPE_TEXTURE_2D; 6449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul enum pipe_format format = PIPE_FORMAT_NONE; 65287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 6649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul uint i; 6749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 6849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul /* Choose surface format */ 6949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul for (i = 0; rgbaFormats[i]; i++) { 7049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (screen->is_format_supported(screen, rgbaFormats[i], 71287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell target, bind, 0)) { 7249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul format = rgbaFormats[i]; 7349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul break; 7449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul } 7549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul } 7649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (format == PIPE_FORMAT_NONE) 7749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return FALSE; /* unable to get an rgba format!?! */ 7849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 7949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul /* create texture */ 8049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul memset(&templ, 0, sizeof(templ)); 8149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.target = target; 8249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.format = format; 8349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.last_level = 0; 84683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.width0 = width; 85683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.height0 = height; 86683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.depth0 = 1; 87287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = bind; 8849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 89287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell *textureOut = screen->resource_create(screen, &templ); 9049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (!*textureOut) 9149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return FALSE; 9249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 9349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul /* create surface / view into texture */ 94287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell *surfaceOut = screen->get_tex_surface(screen, 95287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell *textureOut, 96287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell 0, 0, 0, 97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell bind); 9849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (!*surfaceOut) { 99287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(textureOut, NULL); 10049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return FALSE; 10149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul } 10249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 10349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return TRUE; 10449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul} 10549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 10649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 10749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul/** 10849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Release the surface and texture from util_create_rgba_surface(). 10949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul */ 11049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulvoid 111287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellutil_destroy_rgba_surface(struct pipe_resource *texture, 11249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul struct pipe_surface *surface) 11349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul{ 11449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul pipe_surface_reference(&surface, NULL); 115287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&texture, NULL); 11649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul} 11749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 118a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 119a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 120a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul/** 121a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul * Compare pipe_framebuffer_state objects. 122a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul * \return TRUE if same, FALSE if different 123a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul */ 124a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulboolean 125a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulutil_framebuffer_state_equal(const struct pipe_framebuffer_state *dst, 126a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul const struct pipe_framebuffer_state *src) 127a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul{ 128a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul unsigned i; 129a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 1308f2a1736635368951c3f30e484ee6137066964d6Brian Paul if (dst->width != src->width || 1318f2a1736635368951c3f30e484ee6137066964d6Brian Paul dst->height != src->height) 1328f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 1338f2a1736635368951c3f30e484ee6137066964d6Brian Paul 134a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul for (i = 0; i < Elements(src->cbufs); i++) { 135a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul if (dst->cbufs[i] != src->cbufs[i]) { 1368f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 137a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 138a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 139a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 140a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul if (dst->nr_cbufs != src->nr_cbufs) { 1418f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 142a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 143a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 144a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul if (dst->zsbuf != src->zsbuf) { 1458f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 146a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 147a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 1488f2a1736635368951c3f30e484ee6137066964d6Brian Paul return TRUE; 149a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul} 150a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 151a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 152a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul/** 153a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul * Copy framebuffer state from src to dst, updating refcounts. 154a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul */ 155a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulvoid 156a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulutil_copy_framebuffer_state(struct pipe_framebuffer_state *dst, 157a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul const struct pipe_framebuffer_state *src) 158a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul{ 159a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul unsigned i; 160a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 1618f2a1736635368951c3f30e484ee6137066964d6Brian Paul dst->width = src->width; 1628f2a1736635368951c3f30e484ee6137066964d6Brian Paul dst->height = src->height; 1638f2a1736635368951c3f30e484ee6137066964d6Brian Paul 164a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul for (i = 0; i < Elements(src->cbufs); i++) { 165a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]); 166a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 167a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 168a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul dst->nr_cbufs = src->nr_cbufs; 169a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 170a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul pipe_surface_reference(&dst->zsbuf, src->zsbuf); 171a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul} 172d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 173d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 174d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paulvoid 175d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paulutil_unreference_framebuffer_state(struct pipe_framebuffer_state *fb) 176d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul{ 177d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul unsigned i; 178d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 179d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul for (i = 0; i < fb->nr_cbufs; i++) { 180d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul pipe_surface_reference(&fb->cbufs[i], NULL); 181d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul } 182d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 183d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul pipe_surface_reference(&fb->zsbuf, NULL); 184d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 185d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul fb->width = fb->height = 0; 186d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul fb->nr_cbufs = 0; 187d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul} 188