Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / gallium / include / pipe / p_state.h
index 13fa9ba848cd897bf7d446350988e6b53cc04ac5..626bedb35a85cf9a90c8eeddb772f6900efbce80 100644 (file)
@@ -43,6 +43,8 @@
 #include "p_compiler.h"
 #include "p_defines.h"
 #include "p_format.h"
+#include "p_refcnt.h"
+#include "p_screen.h"
 
 
 #ifdef __cplusplus
@@ -64,10 +66,7 @@ extern "C" {
 
 
 /* fwd decls */
-struct pipe_screen;
 struct pipe_surface;
-struct pipe_winsys;
-
 
 
 /**
@@ -76,12 +75,11 @@ struct pipe_winsys;
  */
 struct pipe_buffer
 {
-   unsigned alignment;
-   unsigned usage;
-   unsigned size;
-
-   /** Reference count */
-   unsigned refcount;
+   struct pipe_reference  reference;
+   unsigned               size;
+   struct pipe_screen    *screen;
+   unsigned               alignment;
+   unsigned               usage;
 };
 
 
@@ -110,10 +108,15 @@ struct pipe_rasterizer_state
    unsigned line_stipple_factor:8;  /**< [1..256] actually */
    unsigned line_stipple_pattern:16;
    unsigned line_last_pixel:1;
-   unsigned bypass_clipping:1;
-   unsigned bypass_vs:1; /**< Skip the vertex shader.  Note that the shader is
-                            still needed though, to indicate inputs/outputs */
-   unsigned origin_lower_left:1;  /**< Is (0,0) the lower-left corner? */
+
+   /** 
+    * Vertex coordinates are pre-transformed to screen space.  Skip
+    * the vertex shader, clipping and viewport processing.  Note that
+    * a vertex shader is still needed though, to indicate the mapping
+    * from vertex elements to fragment shader input semantics.
+    */
+   unsigned bypass_vs_clip_and_viewport:1;
+
    unsigned flatshade_first:1;   /**< take color attribute from the first vertex of a primitive */
    unsigned gl_rasterization_rules:1; /**< enable tweaks for GL rasterization?  */
 
@@ -262,7 +265,6 @@ struct pipe_sampler_state
    unsigned compare_func:3;      /**< PIPE_FUNC_x */
    unsigned normalized_coords:1; /**< Are coords normalized to [0,1]? */
    unsigned prefilter:4;         /**< Wierd sampling state exposed by some api's */
-   float shadow_ambient;         /**< shadow test fail color/intensity */
    float lod_bias;               /**< LOD/lambda bias */
    float min_lod, max_lod;       /**< LOD clamp range, after bias */
    float border_color[4];
@@ -276,24 +278,40 @@ struct pipe_sampler_state
  */
 struct pipe_surface
 {
-   struct pipe_buffer *buffer;   /**< surface's buffer/memory */
+   struct pipe_reference reference;
    enum pipe_format format;      /**< PIPE_FORMAT_x */
-   unsigned status;              /**< PIPE_SURFACE_STATUS_x */
-   unsigned clear_value;         /**< XXX may be temporary */
    unsigned width;               /**< logical width in pixels */
    unsigned height;              /**< logical height in pixels */
-   struct pipe_format_block block;
-   unsigned nblocksx;            /**< allocated width in blocks */
-   unsigned nblocksy;            /**< allocated height in blocks */
-   unsigned stride;              /**< stride in bytes between rows of blocks */
    unsigned layout;              /**< PIPE_SURFACE_LAYOUT_x */
    unsigned offset;              /**< offset from start of buffer, in bytes */
-   unsigned refcount;
    unsigned usage;               /**< PIPE_BUFFER_USAGE_*  */
 
+   unsigned zslice;
    struct pipe_texture *texture; /**< texture into which this is a view  */
    unsigned face;
    unsigned level;
+};
+
+
+/**
+ * Transfer object.  For data transfer to/from a texture.
+ */
+struct pipe_transfer
+{
+   enum pipe_format format;      /**< PIPE_FORMAT_x */
+   unsigned x;                   /**< x offset from start of texture image */
+   unsigned y;                   /**< y offset from start of texture image */
+   unsigned width;               /**< logical width in pixels */
+   unsigned height;              /**< logical height in pixels */
+   struct pipe_format_block block;
+   unsigned nblocksx;            /**< allocated width in blocks */
+   unsigned nblocksy;            /**< allocated height in blocks */
+   unsigned stride;              /**< stride in bytes between rows of blocks */
+   unsigned usage;               /**< PIPE_TRANSFER_*  */
+
+   struct pipe_texture *texture; /**< texture to transfer to/from  */
+   unsigned face;
+   unsigned level;
    unsigned zslice;
 };
 
@@ -303,6 +321,8 @@ struct pipe_surface
  */
 struct pipe_texture
 { 
+   struct pipe_reference reference;
+
    enum pipe_texture_target target; /**< PIPE_TEXTURE_x */
    enum pipe_format format;         /**< PIPE_FORMAT_x */
 
@@ -315,16 +335,11 @@ struct pipe_texture
    unsigned nblocksy[PIPE_MAX_TEXTURE_LEVELS]; /**< allocated height in blocks */
 
    unsigned last_level:8;    /**< Index of last mipmap level present/defined */
-   unsigned compressed:1;
 
    unsigned nr_samples:8;    /**< for multisampled surfaces, nr of samples */
 
    unsigned tex_usage;       /* PIPE_TEXTURE_USAGE_* */
 
-   /* These are also refcounted:
-    */
-   unsigned refcount;
-
    struct pipe_screen *screen; /**< screen that this texture belongs to */
 };
 
@@ -361,6 +376,35 @@ struct pipe_vertex_element
 };
 
 
+/* Reference counting helper functions */
+static INLINE void
+pipe_buffer_reference(struct pipe_buffer **ptr, struct pipe_buffer *buf)
+{
+   struct pipe_buffer *old_buf = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &buf->reference))
+      old_buf->screen->buffer_destroy(old_buf);
+}
+
+static INLINE void
+pipe_surface_reference(struct pipe_surface **ptr, struct pipe_surface *surf)
+{
+   struct pipe_surface *old_surf = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &surf->reference))
+      old_surf->texture->screen->tex_surface_destroy(old_surf);
+}
+
+static INLINE void
+pipe_texture_reference(struct pipe_texture **ptr, struct pipe_texture *tex)
+{
+   struct pipe_texture *old_tex = *ptr;
+
+   if (pipe_reference((struct pipe_reference **)ptr, &tex->reference))
+      old_tex->screen->texture_destroy(old_tex);
+}
+
+
 #ifdef __cplusplus
 }
 #endif