diff options
Diffstat (limited to 'src/gallium/include/pipe')
| -rw-r--r-- | src/gallium/include/pipe/p_inlines.h | 63 | ||||
| -rw-r--r-- | src/gallium/include/pipe/p_screen.h | 69 | ||||
| -rw-r--r-- | src/gallium/include/pipe/p_winsys.h | 12 | 
3 files changed, 107 insertions, 37 deletions
diff --git a/src/gallium/include/pipe/p_inlines.h b/src/gallium/include/pipe/p_inlines.h index 7378392616..da7334bb67 100644 --- a/src/gallium/include/pipe/p_inlines.h +++ b/src/gallium/include/pipe/p_inlines.h @@ -89,29 +89,6 @@ pipe_surface_reference(struct pipe_surface **ptr, struct pipe_surface *surf)  } -/* XXX: thread safety issues! - */ -static INLINE void -winsys_buffer_reference(struct pipe_winsys *winsys, -		      struct pipe_buffer **ptr, -		      struct pipe_buffer *buf) -{ -   if (buf) { -      assert(buf->refcount); -      buf->refcount++; -   } - -   if (*ptr) { -      assert((*ptr)->refcount); -      if(--(*ptr)->refcount == 0) -         winsys->buffer_destroy( winsys, *ptr ); -   } - -   *ptr = buf; -} - - -  /**   * \sa pipe_surface_reference   */ @@ -159,13 +136,19 @@ static INLINE struct pipe_buffer *  pipe_buffer_create( struct pipe_screen *screen,                      unsigned alignment, unsigned usage, unsigned size )  { -   return screen->winsys->buffer_create(screen->winsys, alignment, usage, size); +   if (screen->buffer_create) +      return screen->buffer_create(screen, alignment, usage, size); +   else +      return screen->winsys->_buffer_create(screen->winsys, alignment, usage, size);  }  static INLINE struct pipe_buffer *  pipe_user_buffer_create( struct pipe_screen *screen, void *ptr, unsigned size )  { -   return screen->winsys->user_buffer_create(screen->winsys, ptr, size); +   if (screen->user_buffer_create) +      return screen->user_buffer_create(screen, ptr, size); +   else +      return screen->winsys->_user_buffer_create(screen->winsys, ptr, size);  }  static INLINE void * @@ -173,25 +156,45 @@ pipe_buffer_map(struct pipe_screen *screen,                  struct pipe_buffer *buf,                  unsigned usage)  { -   return screen->winsys->buffer_map(screen->winsys, buf, usage); +   if (screen->buffer_map) +      return screen->buffer_map(screen, buf, usage); +   else +      return screen->winsys->_buffer_map(screen->winsys, buf, usage);  }  static INLINE void  pipe_buffer_unmap(struct pipe_screen *screen,                    struct pipe_buffer *buf)  { -   screen->winsys->buffer_unmap(screen->winsys, buf); +   if (screen->buffer_unmap) +      screen->buffer_unmap(screen, buf); +   else +      screen->winsys->_buffer_unmap(screen->winsys, buf);  } -/* XXX when we're using this everywhere, get rid of - * winsys_buffer_reference() above. +/* XXX: thread safety issues!   */  static INLINE void  pipe_buffer_reference(struct pipe_screen *screen,  		      struct pipe_buffer **ptr,  		      struct pipe_buffer *buf)  { -   winsys_buffer_reference(screen->winsys, ptr, buf); +   if (buf) { +      assert(buf->refcount); +      buf->refcount++; +   } + +   if (*ptr) { +      assert((*ptr)->refcount); +      if(--(*ptr)->refcount == 0) { +         if (screen->buffer_destroy) +            screen->buffer_destroy( screen, *ptr ); +         else +            screen->winsys->_buffer_destroy( screen->winsys, *ptr ); +      } +   } + +   *ptr = buf;  } diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 492667c93a..b072484a84 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -128,7 +128,74 @@ struct pipe_screen {     void (*surface_unmap)( struct pipe_screen *,                            struct pipe_surface *surface ); -    + + +   /** +    * Buffer management. Buffer attributes are mostly fixed over its lifetime. +    * +    *  +    */ +   struct pipe_buffer *(*buffer_create)( struct pipe_screen *screen, +                                         unsigned alignment, +                                         unsigned usage, +                                         unsigned size ); + +   /** +    * Create a buffer that wraps user-space data. +    * +    * Effectively this schedules a delayed call to buffer_create +    * followed by an upload of the data at *some point in the future*, +    * or perhaps never.  Basically the allocate/upload is delayed +    * until the buffer is actually passed to hardware. +    * +    * The intention is to provide a quick way to turn regular data +    * into a buffer, and secondly to avoid a copy operation if that +    * data subsequently turns out to be only accessed by the CPU. +    * +    * Common example is OpenGL vertex buffers that are subsequently +    * processed either by software TNL in the driver or by passing to +    * hardware. +    * +    * XXX: What happens if the delayed call to buffer_create() fails? +    * +    * Note that ptr may be accessed at any time upto the time when the +    * buffer is destroyed, so the data must not be freed before then. +    */ +   struct pipe_buffer *(*user_buffer_create)(struct pipe_screen *screen, +                                             void *ptr, +                                             unsigned bytes); + +   /** +    * Allocate storage for a display target surface. +    * +    * Often surfaces which are meant to be blitted to the front screen (i.e., +    * display targets) must be allocated with special characteristics, memory +    * pools, or obtained directly from the windowing system. +    * +    * This callback is invoked by the pipe_screenwhen creating a texture marked +    * with the PIPE_TEXTURE_USAGE_DISPLAY_TARGET flag  to get the underlying +    * buffer storage. +    */ +   struct pipe_buffer *(*surface_buffer_create)(struct pipe_screen *screen, +						unsigned width, unsigned height, +						enum pipe_format format, +						unsigned usage, +						unsigned *stride); + + +   /** +    * Map the entire data store of a buffer object into the client's address. +    * flags is bitmask of PIPE_BUFFER_USAGE_CPU_READ/WRITE flags. +    */ +   void *(*buffer_map)( struct pipe_screen *screen, +			struct pipe_buffer *buf, +			unsigned usage ); + +   void (*buffer_unmap)( struct pipe_screen *screen, +			 struct pipe_buffer *buf ); + +   void (*buffer_destroy)( struct pipe_screen *screen, +			   struct pipe_buffer *buf );  }; diff --git a/src/gallium/include/pipe/p_winsys.h b/src/gallium/include/pipe/p_winsys.h index 3ae83e8105..bda1907cc1 100644 --- a/src/gallium/include/pipe/p_winsys.h +++ b/src/gallium/include/pipe/p_winsys.h @@ -90,7 +90,7 @@ struct pipe_winsys      * alignment indicates the client's alignment requirements, eg for      * SSE instructions.      */ -   struct pipe_buffer *(*buffer_create)( struct pipe_winsys *ws,  +   struct pipe_buffer *(*_buffer_create)( struct pipe_winsys *ws,                                            unsigned alignment,                                            unsigned usage,                                           unsigned size ); @@ -116,7 +116,7 @@ struct pipe_winsys      * Note that ptr may be accessed at any time upto the time when the      * buffer is destroyed, so the data must not be freed before then.      */ -   struct pipe_buffer *(*user_buffer_create)(struct pipe_winsys *ws,  +   struct pipe_buffer *(*_user_buffer_create)(struct pipe_winsys *ws,                                                       void *ptr,                                                      unsigned bytes); @@ -131,7 +131,7 @@ struct pipe_winsys      * with the PIPE_TEXTURE_USAGE_DISPLAY_TARGET flag  to get the underlying       * buffer storage.      */ -   struct pipe_buffer *(*surface_buffer_create)(struct pipe_winsys *ws, +   struct pipe_buffer *(*_surface_buffer_create)(struct pipe_winsys *ws,  						unsigned width, unsigned height,  						enum pipe_format format,  						unsigned usage, @@ -142,14 +142,14 @@ struct pipe_winsys      * Map the entire data store of a buffer object into the client's address.      * flags is bitmask of PIPE_BUFFER_USAGE_CPU_READ/WRITE flags.       */ -   void *(*buffer_map)( struct pipe_winsys *ws,  +   void *(*_buffer_map)( struct pipe_winsys *ws,   			struct pipe_buffer *buf,  			unsigned usage ); -   void (*buffer_unmap)( struct pipe_winsys *ws,  +   void (*_buffer_unmap)( struct pipe_winsys *ws,   			 struct pipe_buffer *buf ); -   void (*buffer_destroy)( struct pipe_winsys *ws, +   void (*_buffer_destroy)( struct pipe_winsys *ws,  			   struct pipe_buffer *buf );  | 
