u_surface.c revision d1fa748cdba0b1145066186b3d634b79b5d69473
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" 3849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 39a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul#include "util/u_memory.h" 4049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul#include "util/u_surface.h" 4149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 4249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 4349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul/** 4449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Helper to quickly create an RGBA rendering surface of a certain size. 4549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * \param textureOut returns the new texture 4649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * \param surfaceOut returns the new surface 4749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * \return TRUE for success, FALSE if failure 4849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul */ 4949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulboolean 5049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulutil_create_rgba_surface(struct pipe_screen *screen, 5149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul uint width, uint height, 5249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul struct pipe_texture **textureOut, 5349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul struct pipe_surface **surfaceOut) 5449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul{ 5549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul static const enum pipe_format rgbaFormats[] = { 5649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul PIPE_FORMAT_A8R8G8B8_UNORM, 5749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul PIPE_FORMAT_B8G8R8A8_UNORM, 5849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul PIPE_FORMAT_R8G8B8A8_UNORM, 5949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul PIPE_FORMAT_NONE 6049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul }; 6149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul const uint target = PIPE_TEXTURE_2D; 6249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul const uint usage = PIPE_TEXTURE_USAGE_RENDER_TARGET; 6349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul enum pipe_format format = PIPE_FORMAT_NONE; 6449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul struct pipe_texture templ; 6549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul uint i; 6649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 6749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul /* Choose surface format */ 6849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul for (i = 0; rgbaFormats[i]; i++) { 6949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (screen->is_format_supported(screen, rgbaFormats[i], 7049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul target, usage, 0)) { 7149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul format = rgbaFormats[i]; 7249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul break; 7349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul } 7449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul } 7549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (format == PIPE_FORMAT_NONE) 7649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return FALSE; /* unable to get an rgba format!?! */ 7749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 7849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul /* create texture */ 7949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul memset(&templ, 0, sizeof(templ)); 8049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.target = target; 8149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.format = format; 8249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.last_level = 0; 8349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.width[0] = width; 8449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.height[0] = height; 8549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.depth[0] = 1; 8649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul pf_get_block(format, &templ.block); 8749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul templ.tex_usage = usage; 8849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 8949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul *textureOut = screen->texture_create(screen, &templ); 9049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (!*textureOut) 9149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return FALSE; 9249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 9349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul /* create surface / view into texture */ 945a118d46507f4d551cba64014ac0dbbbad493742Jakob Bornecrantz *surfaceOut = screen->get_tex_surface(screen, *textureOut, 0, 0, 0, PIPE_BUFFER_USAGE_GPU_WRITE); 9549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul if (!*surfaceOut) { 965a118d46507f4d551cba64014ac0dbbbad493742Jakob Bornecrantz pipe_texture_reference(textureOut, NULL); 9749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return FALSE; 9849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul } 9949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 10049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul return TRUE; 10149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul} 10249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 10349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 10449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul/** 10549b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul * Release the surface and texture from util_create_rgba_surface(). 10649b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul */ 10749b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulvoid 10849b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paulutil_destroy_rgba_surface(struct pipe_texture *texture, 10949b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul struct pipe_surface *surface) 11049b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul{ 11149b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul pipe_surface_reference(&surface, NULL); 11249b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul pipe_texture_reference(&texture, NULL); 11349b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul} 11449b40f9bf4aef3a32ddb88f7e8d378f08e26b081Brian Paul 115a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 116a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 117a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul/** 118a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul * Compare pipe_framebuffer_state objects. 119a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul * \return TRUE if same, FALSE if different 120a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul */ 121a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulboolean 122a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulutil_framebuffer_state_equal(const struct pipe_framebuffer_state *dst, 123a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul const struct pipe_framebuffer_state *src) 124a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul{ 125a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul unsigned i; 126a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 1278f2a1736635368951c3f30e484ee6137066964d6Brian Paul if (dst->width != src->width || 1288f2a1736635368951c3f30e484ee6137066964d6Brian Paul dst->height != src->height) 1298f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 1308f2a1736635368951c3f30e484ee6137066964d6Brian Paul 131a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul for (i = 0; i < Elements(src->cbufs); i++) { 132a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul if (dst->cbufs[i] != src->cbufs[i]) { 1338f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 134a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 135a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 136a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 137a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul if (dst->nr_cbufs != src->nr_cbufs) { 1388f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 139a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 140a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 141a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul if (dst->zsbuf != src->zsbuf) { 1428f2a1736635368951c3f30e484ee6137066964d6Brian Paul return FALSE; 143a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 144a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 1458f2a1736635368951c3f30e484ee6137066964d6Brian Paul return TRUE; 146a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul} 147a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 148a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 149a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul/** 150a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul * Copy framebuffer state from src to dst, updating refcounts. 151a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul */ 152a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulvoid 153a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paulutil_copy_framebuffer_state(struct pipe_framebuffer_state *dst, 154a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul const struct pipe_framebuffer_state *src) 155a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul{ 156a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul unsigned i; 157a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 1588f2a1736635368951c3f30e484ee6137066964d6Brian Paul dst->width = src->width; 1598f2a1736635368951c3f30e484ee6137066964d6Brian Paul dst->height = src->height; 1608f2a1736635368951c3f30e484ee6137066964d6Brian Paul 161a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul for (i = 0; i < Elements(src->cbufs); i++) { 162a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]); 163a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul } 164a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 165a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul dst->nr_cbufs = src->nr_cbufs; 166a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul 167a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul pipe_surface_reference(&dst->zsbuf, src->zsbuf); 168a67f39810b5c88367ae2a9ee564b1a740b27601bBrian Paul} 169d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 170d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 171d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paulvoid 172d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paulutil_unreference_framebuffer_state(struct pipe_framebuffer_state *fb) 173d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul{ 174d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul unsigned i; 175d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 176d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul for (i = 0; i < fb->nr_cbufs; i++) { 177d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul pipe_surface_reference(&fb->cbufs[i], NULL); 178d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul } 179d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 180d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul pipe_surface_reference(&fb->zsbuf, NULL); 181d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul 182d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul fb->width = fb->height = 0; 183d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul fb->nr_cbufs = 0; 184d1fa748cdba0b1145066186b3d634b79b5d69473Brian Paul} 185