pb_validate.c revision e06474dbae6979177629fb6187331291ff230c65
182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca/************************************************************************** 282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * 382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * All Rights Reserved. 582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * 682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * copy of this software and associated documentation files (the 882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * "Software"), to deal in the Software without restriction, including 982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * permit persons to whom the Software is furnished to do so, subject to 1282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * the following conditions: 1382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * 1482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * The above copyright notice and this permission notice (including the 1582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * next paragraph) shall be included in all copies or substantial portions 1682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * of the Software. 1782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * 1882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * 2682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca **************************************************************************/ 2782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 2882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca/** 2982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * @file 3082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * Buffer validation. 3182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * 3282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca * @author Jose Fonseca <jrfonseca@tungstengraphics.com> 3382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca */ 3482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 3582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 3682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca#include "pipe/p_compiler.h" 3782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca#include "pipe/p_error.h" 384f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 3982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca#include "pipe/p_debug.h" 4082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 4182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca#include "pb_buffer.h" 4282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca#include "pb_buffer_fenced.h" 437ffbfaccfb1484a4ffd5aea0e0e1fbb407977a56Michel Dänzer#include "pb_validate.h" 4482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 4582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 468eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca#define PB_VALIDATE_INITIAL_SIZE 1 /* 512 */ 4782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 4882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 49e06474dbae6979177629fb6187331291ff230c65José Fonsecastruct pb_validate_entry 50e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 51e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_buffer *buf; 52e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned flags; 53e06474dbae6979177629fb6187331291ff230c65José Fonseca}; 54e06474dbae6979177629fb6187331291ff230c65José Fonseca 55e06474dbae6979177629fb6187331291ff230c65José Fonseca 568eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonsecastruct pb_validate 5782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca{ 58e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_validate_entry *entries; 598eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca unsigned used; 608eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca unsigned size; 618eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca}; 6282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 6382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 6482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecaenum pipe_error 6582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecapb_validate_add_buffer(struct pb_validate *vl, 66e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_buffer *buf, 67e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned flags) 6882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca{ 6982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca assert(buf); 7082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca if(!buf) 7182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca return PIPE_ERROR; 728eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca 73e06474dbae6979177629fb6187331291ff230c65José Fonseca assert(flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE); 74e06474dbae6979177629fb6187331291ff230c65José Fonseca assert(!(flags & ~PIPE_BUFFER_USAGE_GPU_READ_WRITE)); 75e06474dbae6979177629fb6187331291ff230c65José Fonseca flags &= PIPE_BUFFER_USAGE_GPU_READ_WRITE; 76e06474dbae6979177629fb6187331291ff230c65José Fonseca 778eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca /* We only need to store one reference for each buffer, so avoid storing 78e06474dbae6979177629fb6187331291ff230c65José Fonseca * consecutive references for the same buffer. It might not be the most 79e06474dbae6979177629fb6187331291ff230c65José Fonseca * common pattern, but it is easy to implement. 808eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca */ 81e06474dbae6979177629fb6187331291ff230c65José Fonseca if(vl->used && vl->entries[vl->used - 1].buf == buf) { 82e06474dbae6979177629fb6187331291ff230c65José Fonseca vl->entries[vl->used - 1].flags |= flags; 838eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca return PIPE_OK; 848eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca } 8582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 868eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca /* Grow the table */ 878eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca if(vl->used == vl->size) { 888eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca unsigned new_size; 89e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_validate_entry *new_entries; 908eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca 918eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca new_size = vl->size * 2; 928eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca if(!new_size) 938eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca return PIPE_ERROR_OUT_OF_MEMORY; 948eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca 95e06474dbae6979177629fb6187331291ff230c65José Fonseca new_entries = (struct pb_validate_entry *)REALLOC(vl->entries, 96e06474dbae6979177629fb6187331291ff230c65José Fonseca vl->size*sizeof(struct pb_validate_entry), 97e06474dbae6979177629fb6187331291ff230c65José Fonseca new_size*sizeof(struct pb_validate_entry)); 98e06474dbae6979177629fb6187331291ff230c65José Fonseca if(!new_entries) 998eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca return PIPE_ERROR_OUT_OF_MEMORY; 10082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 101e06474dbae6979177629fb6187331291ff230c65José Fonseca memset(new_entries + vl->size, 0, (new_size - vl->size)*sizeof(struct pb_validate_entry)); 10282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 1038eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca vl->size = new_size; 104e06474dbae6979177629fb6187331291ff230c65José Fonseca vl->entries = new_entries; 10582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca } 10682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 107e06474dbae6979177629fb6187331291ff230c65José Fonseca assert(!vl->entries[vl->used].buf); 108e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_reference(&vl->entries[vl->used].buf, buf); 109e06474dbae6979177629fb6187331291ff230c65José Fonseca vl->entries[vl->used].flags = flags; 1108eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca ++vl->used; 1118eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca 11282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca return PIPE_OK; 11382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca} 11482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 11582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 11682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecaenum pipe_error 117e06474dbae6979177629fb6187331291ff230c65José Fonsecapb_validate_foreach(struct pb_validate *vl, 118e06474dbae6979177629fb6187331291ff230c65José Fonseca enum pipe_error (*callback)(struct pb_buffer *buf, void *data), 119e06474dbae6979177629fb6187331291ff230c65José Fonseca void *data) 120e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 121e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned i; 122e06474dbae6979177629fb6187331291ff230c65José Fonseca for(i = 0; i < vl->used; ++i) { 123e06474dbae6979177629fb6187331291ff230c65José Fonseca enum pipe_error ret; 124e06474dbae6979177629fb6187331291ff230c65José Fonseca ret = callback(vl->entries[i].buf, data); 125e06474dbae6979177629fb6187331291ff230c65José Fonseca if(ret != PIPE_OK) 126e06474dbae6979177629fb6187331291ff230c65José Fonseca return ret; 127e06474dbae6979177629fb6187331291ff230c65José Fonseca } 128e06474dbae6979177629fb6187331291ff230c65José Fonseca return PIPE_OK; 129e06474dbae6979177629fb6187331291ff230c65José Fonseca} 130e06474dbae6979177629fb6187331291ff230c65José Fonseca 131e06474dbae6979177629fb6187331291ff230c65José Fonseca 132e06474dbae6979177629fb6187331291ff230c65José Fonsecaenum pipe_error 13382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecapb_validate_validate(struct pb_validate *vl) 13482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca{ 135e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned i; 136e06474dbae6979177629fb6187331291ff230c65José Fonseca 137e06474dbae6979177629fb6187331291ff230c65José Fonseca for(i = 0; i < vl->used; ++i) { 138e06474dbae6979177629fb6187331291ff230c65José Fonseca enum pipe_error ret; 139e06474dbae6979177629fb6187331291ff230c65José Fonseca ret = pb_validate(vl->entries[i].buf, vl, vl->entries[i].flags); 140e06474dbae6979177629fb6187331291ff230c65José Fonseca if(ret != PIPE_OK) { 141e06474dbae6979177629fb6187331291ff230c65José Fonseca while(i--) 142e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_validate(vl->entries[i].buf, NULL, 0); 143e06474dbae6979177629fb6187331291ff230c65José Fonseca return ret; 144e06474dbae6979177629fb6187331291ff230c65José Fonseca } 145e06474dbae6979177629fb6187331291ff230c65José Fonseca } 146e06474dbae6979177629fb6187331291ff230c65José Fonseca 14782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca return PIPE_OK; 14882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca} 14982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 15082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 15182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecavoid 15282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecapb_validate_fence(struct pb_validate *vl, 15382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca struct pipe_fence_handle *fence) 15482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca{ 1558eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca unsigned i; 1568eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca for(i = 0; i < vl->used; ++i) { 157e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_fence(vl->entries[i].buf, fence); 158e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_reference(&vl->entries[i].buf, NULL); 1598eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca } 1608eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca vl->used = 0; 16182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca} 16282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 16382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 16482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecavoid 16582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecapb_validate_destroy(struct pb_validate *vl) 16682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca{ 1678eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca unsigned i; 1688eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca for(i = 0; i < vl->used; ++i) 169e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_reference(&vl->entries[i].buf, NULL); 170e06474dbae6979177629fb6187331291ff230c65José Fonseca FREE(vl->entries); 17182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca FREE(vl); 17282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca} 17382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 17482dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 17582dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecastruct pb_validate * 17682dd0225e7e21a35ca66d439dce8cfa39d782470José Fonsecapb_validate_create() 17782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca{ 17882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca struct pb_validate *vl; 17982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 18082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca vl = CALLOC_STRUCT(pb_validate); 18182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca if(!vl) 18282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca return NULL; 18382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 1848eab7de888bb4056c34f80edfbc90a543736ea3bJosé Fonseca vl->size = PB_VALIDATE_INITIAL_SIZE; 185e06474dbae6979177629fb6187331291ff230c65José Fonseca vl->entries = (struct pb_validate_entry *)CALLOC(vl->size, sizeof(struct pb_validate_entry)); 186e06474dbae6979177629fb6187331291ff230c65José Fonseca if(!vl->entries) { 18782dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca FREE(vl); 18882dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca return NULL; 18982dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca } 19082dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 19182dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca return vl; 19282dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca} 19382dd0225e7e21a35ca66d439dce8cfa39d782470José Fonseca 194