13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/************************************************************************** 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved. 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions: 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software. 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/ 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * @file 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Buffer validation. 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * @author Jose Fonseca <jrfonseca@tungstengraphics.com> 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_compiler.h" 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_defines.h" 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_memory.h" 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_debug.h" 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pb_buffer.h" 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pb_validate.h" 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define PB_VALIDATE_INITIAL_SIZE 1 /* 512 */ 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct pb_validate_entry 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct pb_buffer *buf; 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned flags; 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}; 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct pb_validate 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct pb_validate_entry *entries; 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned used; 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned size; 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}; 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgenum pipe_error 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgpb_validate_add_buffer(struct pb_validate *vl, 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct pb_buffer *buf, 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned flags) 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(buf); 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(!buf) 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_ERROR; 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 72760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org assert(flags & PB_USAGE_GPU_READ_WRITE); 73760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org assert(!(flags & ~PB_USAGE_GPU_READ_WRITE)); 74760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org flags &= PB_USAGE_GPU_READ_WRITE; 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* We only need to store one reference for each buffer, so avoid storing 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * consecutive references for the same buffer. It might not be the most 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * common pattern, but it is easy to implement. 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(vl->used && vl->entries[vl->used - 1].buf == buf) { 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->entries[vl->used - 1].flags |= flags; 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_OK; 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Grow the table */ 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(vl->used == vl->size) { 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned new_size; 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct pb_validate_entry *new_entries; 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org new_size = vl->size * 2; 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(!new_size) 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org new_entries = (struct pb_validate_entry *)REALLOC(vl->entries, 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->size*sizeof(struct pb_validate_entry), 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org new_size*sizeof(struct pb_validate_entry)); 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(!new_entries) 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_ERROR_OUT_OF_MEMORY; 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org memset(new_entries + vl->size, 0, (new_size - vl->size)*sizeof(struct pb_validate_entry)); 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->size = new_size; 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->entries = new_entries; 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(!vl->entries[vl->used].buf); 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pb_reference(&vl->entries[vl->used].buf, buf); 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->entries[vl->used].flags = flags; 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ++vl->used; 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_OK; 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgenum pipe_error 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgpb_validate_foreach(struct pb_validate *vl, 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org enum pipe_error (*callback)(struct pb_buffer *buf, void *data), 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org void *data) 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for(i = 0; i < vl->used; ++i) { 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org enum pipe_error ret; 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ret = callback(vl->entries[i].buf, data); 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(ret != PIPE_OK) 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return ret; 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_OK; 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgenum pipe_error 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgpb_validate_validate(struct pb_validate *vl) 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for(i = 0; i < vl->used; ++i) { 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org enum pipe_error ret; 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ret = pb_validate(vl->entries[i].buf, vl, vl->entries[i].flags); 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(ret != PIPE_OK) { 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org while(i--) 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pb_validate(vl->entries[i].buf, NULL, 0); 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return ret; 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return PIPE_OK; 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgpb_validate_fence(struct pb_validate *vl, 1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct pipe_fence_handle *fence) 1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for(i = 0; i < vl->used; ++i) { 1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pb_fence(vl->entries[i].buf, fence); 1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pb_reference(&vl->entries[i].buf, NULL); 1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->used = 0; 1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgpb_validate_destroy(struct pb_validate *vl) 1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for(i = 0; i < vl->used; ++i) 1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pb_reference(&vl->entries[i].buf, NULL); 1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE(vl->entries); 1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE(vl); 1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct pb_validate * 1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgpb_validate_create() 1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct pb_validate *vl; 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl = CALLOC_STRUCT(pb_validate); 1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(!vl) 1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return NULL; 1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->size = PB_VALIDATE_INITIAL_SIZE; 1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vl->entries = (struct pb_validate_entry *)CALLOC(vl->size, sizeof(struct pb_validate_entry)); 1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if(!vl->entries) { 1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE(vl); 1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return NULL; 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return vl; 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 193