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