more work on tex objects, surfaces, mappable buffers
authorBrian <brian.paul@tungstengraphics.com>
Fri, 29 Jun 2007 19:03:01 +0000 (13:03 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 29 Jun 2007 19:03:01 +0000 (13:03 -0600)
src/mesa/pipe/p_state.h

index e0fa4d54c3c0581a25c0bdccfd85c260ad9de6a6..6a9a86fa97f8d4ff1b95e15b3198a801026e87f6 100644 (file)
 #define PIPE_MAX_CONSTANT    32
 
 
+/* fwd decl */
+struct pipe_surface;
+
+
+/***
+ *** State objects
+ ***/
+
 
 /**
  * Primitive (point/line/tri) setup info
@@ -164,29 +172,17 @@ struct pipe_stencil_state {
    GLuint front_zpass_op:3; /**< PIPE_STENCIL_OP_x */
    GLuint front_zfail_op:3; /**< PIPE_STENCIL_OP_x */
    GLuint back_enabled:1;
-   GLuint back_func:3;
-   GLuint back_fail_op:3;
-   GLuint back_zpass_op:3;
-   GLuint back_zfail_op:3;
-   GLubyte ref_value[2];      /**< [0] = front, [1] = back */
+   GLuint back_func:3;      /**< PIPE_FUNC_x */
+   GLuint back_fail_op:3;   /**< PIPE_STENCIL_OP_x */
+   GLuint back_zpass_op:3;  /**< PIPE_STENCIL_OP_x */
+   GLuint back_zfail_op:3;  /**< PIPE_STENCIL_OP_x */
+   GLubyte ref_value[2];    /**< [0] = front, [1] = back */
    GLubyte value_mask[2];
    GLubyte write_mask[2];
    GLubyte clear_value;
 };
 
 
-/* This will change for hardware pipes...
- */
-struct pipe_surface
-{
-   GLuint width, height;
-   GLubyte *ptr;
-   GLint stride;
-   GLuint cpp;
-   GLuint format;
-};
-
-
 struct pipe_framebuffer_state
 {
    GLuint num_cbufs;               /**< Number of color bufs to draw to */
@@ -223,16 +219,66 @@ struct pipe_sampler_state
 };
 
 
+/***
+ *** Non-state Objects
+ ***/
+
+
+/**
+ * A mappable buffer (vertex data, pixel data, etc)
+ */
+struct pipe_buffer
+{
+   void *(*map)(struct pipe_buffer *pb, GLuint access_mode);
+   void (*unmap)(struct pipe_buffer *pb);
+   void *ptr;        /**< address, only valid while mapped */
+   GLuint mode;      /**< PIPE_MAP_x, only valid while mapped */
+};
+
+
+/**
+ * 2D surface.
+ * May be a renderbuffer, texture mipmap level, etc.
+ */
+struct pipe_surface
+{
+   struct pipe_buffer buffer;  /**< surfaces can be mapped */
+   GLuint format:5;            /**< PIPE_FORMAT_x */
+   GLuint width, height;
+#if 0
+   GLubyte *ptr;
+   GLint stride;
+   GLuint cpp;
+   GLuint format;
+#endif
+};
+
+
 /**
- * XXX rough approximation...
+ * Texture object.
+ * Mipmap levels, cube faces, 3D slices can be accessed as surfaces.
  */
 struct pipe_texture_object
 {
+   GLuint type:2;      /**< PIPE_TEXTURE_x */
    GLuint format:5;    /**< PIPE_FORMAT_x */
    GLuint width:13;    /**< 13 bits = 8K max size */
    GLuint height:13;
    GLuint depth:13;
-   GLubyte *data;      /**< only valid while buffer mapped? */
+   GLuint mipmapped:1;
+
+   /** to access a 1D or 2D texture object as a surface */
+   struct pipe_surface *(*get_2d_surface)(struct pipe_texture_object *pto,
+                                          GLuint level);
+   /** to access a 3D texture object as a surface */
+   struct pipe_surface *(*get_3d_surface)(struct pipe_texture_object *pto,
+                                          GLuint level, GLuint slice);
+   /** to access a cube texture object as a surface */
+   struct pipe_surface *(*get_cube_surface)(struct pipe_texture_object *pto,
+                                            GLuint face, GLuint level);
+   /** when finished with surface: */
+   void (*release_surface)(struct pipe_texture_object *pto,
+                           struct pipe_surface *ps);
 };