Merge branch '7.8'
[mesa.git] / src / gallium / include / pipe / p_screen.h
index b449522fac38102c31d7ad01407fa77da98d8c3d..b771bfe85eccbb2c1766bf8922069d9088309a99 100644 (file)
@@ -49,11 +49,16 @@ extern "C" {
 #endif
 
 
+/** Opaque type */
+struct winsys_handle;
 /** Opaque type */
 struct pipe_fence_handle;
 struct pipe_winsys;
 struct pipe_buffer;
-
+struct pipe_texture;
+struct pipe_surface;
+struct pipe_video_surface;
+struct pipe_transfer;
 
 
 /**
@@ -83,6 +88,9 @@ struct pipe_screen {
     */
    float (*get_paramf)( struct pipe_screen *, int param );
 
+   struct pipe_context * (*context_create)( struct pipe_screen *,
+                                           void *priv );
+   
    /**
     * Check if the given pipe_format is supported as a texture or
     * drawing surface.
@@ -102,20 +110,29 @@ struct pipe_screen {
                                            const struct pipe_texture *templat);
 
    /**
-    * Create a new texture object, using the given template info, but on top of
-    * existing memory.
-    * 
-    * It is assumed that the buffer data is layed out according to the expected
-    * by the hardware. NULL will be returned if any inconsistency is found.  
+    * Create a texture from a winsys_handle. The handle is often created in
+    * another process by first creating a pipe texture and then calling
+    * texture_get_handle.
+    */
+   struct pipe_texture * (*texture_from_handle)(struct pipe_screen *,
+                                                const struct pipe_texture *templat,
+                                                struct winsys_handle *handle);
+
+   /**
+    * Get a winsys_handle from a texture. Some platforms/winsys requires
+    * that the texture is created with a special usage flag like
+    * DISPLAYTARGET or PRIMARY.
     */
-   struct pipe_texture * (*texture_blanket)(struct pipe_screen *,
-                                            const struct pipe_texture *templat,
-                                            const unsigned *stride,
-                                            struct pipe_buffer *buffer);
+   boolean (*texture_get_handle)(struct pipe_screen *,
+                                 struct pipe_texture *tex,
+                                 struct winsys_handle *handle);
+
 
    void (*texture_destroy)(struct pipe_texture *pt);
 
-   /** Get a surface which is a "view" into a texture */
+   /** Get a 2D surface which is a "view" into a texture
+    * \param usage  bitmaks of PIPE_BUFFER_USAGE_* read/write flags
+    */
    struct pipe_surface *(*get_tex_surface)(struct pipe_screen *,
                                            struct pipe_texture *texture,
                                            unsigned face, unsigned level,
@@ -179,22 +196,6 @@ struct pipe_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);
 
 
    /**
@@ -221,36 +222,63 @@ struct pipe_screen {
    /**
     * Notify a range that was actually written into.
     * 
+    * Can only be used if the buffer was mapped with the 
+    * PIPE_BUFFER_USAGE_CPU_WRITE and PIPE_BUFFER_USAGE_FLUSH_EXPLICIT flags 
+    * set.
+    * 
     * The range is relative to the buffer start, regardless of the range 
     * specified to buffer_map_range. This is different from the 
     * ARB_map_buffer_range semantics because we don't forbid multiple mappings 
     * of the same buffer (yet).
     * 
-    * If the buffer was mapped for writing and no buffer_flush_mapped_range 
-    * call was done until the buffer_unmap is called then the pipe driver will
-    * assumed that the whole buffer was written. This is for backward 
-    * compatibility purposes and may affect performance -- the state tracker 
-    * should always specify exactly what got written while the buffer was 
-    * mapped.  
     */
    void (*buffer_flush_mapped_range)( struct pipe_screen *screen,
                                       struct pipe_buffer *buf,
                                       unsigned offset,
                                       unsigned length);
 
+   /**
+    * Unmap buffer.
+    * 
+    * If the buffer was mapped with PIPE_BUFFER_USAGE_CPU_WRITE flag but not
+    * PIPE_BUFFER_USAGE_FLUSH_EXPLICIT then the pipe driver will
+    * assume that the whole buffer was written. This is mostly for backward 
+    * compatibility purposes and may affect performance -- the state tracker 
+    * should always specify exactly what got written while the buffer was 
+    * mapped.
+    */
    void (*buffer_unmap)( struct pipe_screen *screen,
                          struct pipe_buffer *buf );
 
    void (*buffer_destroy)( struct pipe_buffer *buf );
 
+   /**
+    * Create a video surface suitable for use as a decoding target by the
+    * driver's pipe_video_context.
+    */
+   struct pipe_video_surface*
+   (*video_surface_create)( struct pipe_screen *screen,
+                            enum pipe_video_chroma_format chroma_format,
+                            unsigned width, unsigned height );
+
+   void (*video_surface_destroy)( struct pipe_video_surface *vsfc );
+
+   /**
+    * Do any special operations to ensure buffer size is correct
+    * \param context_private  the private data of the calling context
+    */
+   void (*update_buffer)( struct pipe_screen *ws,
+                          void *context_private );
 
    /**
     * Do any special operations to ensure frontbuffer contents are
     * displayed, eg copy fake frontbuffer.
+    * \param winsys_drawable_handle  an opaque handle that the calling context
+    *                                gets out-of-band
     */
    void (*flush_frontbuffer)( struct pipe_screen *screen,
                               struct pipe_surface *surf,
-                              void *context_private );
+                              void *winsys_drawable_handle );