sketch out new pipe surface/sampler types
authorBrian <brian@i915.localnet.net>
Tue, 7 Aug 2007 19:13:41 +0000 (13:13 -0600)
committerBrian <brian@i915.localnet.net>
Tue, 7 Aug 2007 19:13:41 +0000 (13:13 -0600)
src/mesa/drivers/dri/i915pipe/intel_fbo.c
src/mesa/drivers/dri/intel/intel_tex_layout.c
src/mesa/pipe/p_context.h
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_context.c
src/mesa/pipe/softpipe/sp_surface.c
src/mesa/pipe/softpipe/sp_surface.h

index a53563f52b9864637aa7fe4c46c8d531d600e3ef..0b6c6a94ee5af4fb781f50d3f534b7f1a5aa27b4 100644 (file)
@@ -578,7 +578,9 @@ intel_render_texture(GLcontext * ctx,
    }
 
    /* store that offset in the region */
+#if 0
    st_image->mt->region->draw_offset = imageOffset;
+#endif
 
    /* update drawing region, etc */
    intel_draw_buffer(ctx, fb);
index 344aff396f7e5c789df410ecae444fc2307167f0..882d9e04a2c442c1d7f1cf510e6552da4e6ab1ae 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "macros.h"
 #include "pipe/p_state.h"
+#include "pipe/p_context.h"
 #include "intel_tex_layout.h"
 #include "state_tracker/st_mipmap_tree.h"
 
@@ -472,3 +473,4 @@ i945_miptree_layout(struct pipe_context *pipe, struct pipe_mipmap_tree * mt)
 
    return GL_TRUE;
 }
+
index 08b9b18393d0f7e0eb4bc95cc5cfebc2520d5766..3062eda3298ff04a7d8fdbb9d3f4a3ec7b248f01 100644 (file)
@@ -130,6 +130,10 @@ struct pipe_context {
    struct pipe_surface *(*surface_alloc)(struct pipe_context *pipe,
                                          GLuint format);
 
+   struct pipe_surface *(*get_tex_surface)(struct pipe_context *pipe,
+                                           struct pipe_mipmap_tree *texture,
+                                           GLuint face, GLuint level,
+                                           GLuint zslice);
 
    /*
     * Memory region functions
@@ -230,5 +234,16 @@ pipe_region_reference(struct pipe_region **dst, struct pipe_region *src)
 }
 
 
+static INLINE void
+pipe_surface_reference(struct pipe_surface **dst, struct pipe_surface *src)
+{
+   assert(*dst == NULL);
+   if (src) {
+      src->refcount++;
+      *dst = src;
+   }
+}
+
+
 
 #endif /* PIPE_CONTEXT_H */
index f75d8f1957d1b140ed10d438a5c87e292de9ab0d..e51b9c460f2522fd43f342ed89c3e1c06ca8d628 100644 (file)
@@ -245,13 +245,11 @@ struct pipe_region
    GLuint height;   /**< in pixels */
    GLubyte *map;    /**< only non-NULL when region is actually mapped */
    GLuint map_refcount;  /**< Reference count for mapping */
-
-   GLuint draw_offset; /**< Offset of drawing address within the region */
 };
 
 
 /**
- * 2D surface.
+ * 2D surface.  This is basically a view into a pipe_region (memory buffer).
  * May be a renderbuffer, texture mipmap level, etc.
  */
 struct pipe_surface
@@ -259,39 +257,32 @@ struct pipe_surface
    struct pipe_region *region;
    GLuint format:5;            /**< PIPE_FORMAT_x */
    GLuint width, height;
+   GLuint offset;              /**< offset from start of region, in bytes */
+   GLint refcount;
 
    void *rb;  /**< Ptr back to renderbuffer (temporary?) */
+
+   /** get block/tile of pixels from surface */
+   void (*get_tile)(struct pipe_surface *ps,
+                    GLuint x, GLuint y, GLuint w, GLuint h, GLfloat *p);
+
+   /** put block/tile of pixels into surface */
+   void (*put_tile)(struct pipe_surface *ps,
+                    GLuint x, GLuint y, GLuint w, GLuint h, const GLfloat *p);
 };
 
 
-#if 0
 /**
- * Texture object.
- * Mipmap levels, cube faces, 3D slices can be accessed as surfaces.
+ * surface sampler object
+ * XXX prototype
  */
-struct pipe_texture_object
+struct pipe_surface_sampler
 {
-   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;
-   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);
+   struct pipe_sampler_state state;
+   struct pipe_mipmap_tree *texture;
+   void (*get_sample)(struct pipe_surface_sampler *sampler,
+                      const GLfloat strq[4], GLfloat rgba[4]);
 };
-#endif
 
 
 /**
index 139afde3765873895aaccd7d618e52c048b09992..264f3d6e584d47e77ea8e53da7b805f83152e1ee 100644 (file)
@@ -201,6 +201,7 @@ struct pipe_context *softpipe_create( struct softpipe_winsys *sws )
    softpipe->pipe.get_occlusion_counter = softpipe_get_occlusion_counter;
 
    softpipe->pipe.mipmap_tree_layout = softpipe_mipmap_tree_layout;
+   softpipe->pipe.get_tex_surface = softpipe_get_tex_surface;
 
    softpipe->quad.polygon_stipple = sp_quad_polygon_stipple_stage(softpipe);
    softpipe->quad.shade = sp_quad_shade_stage(softpipe);
index 819243ae6e43ca7162afd40d40a2fc13aeb9a451..6512f1d78936691e967adaa9e704f7e0c9ffd2f1 100644 (file)
@@ -351,12 +351,54 @@ sp_surface_alloc(struct pipe_context *pipe, GLenum format)
       return NULL;
 
    sps->surface.format = format;
+   sps->surface.refcount = 1;
    init_quad_funcs(sps);
 
    return &sps->surface;
 }
 
 
+
+
+
+/**
+ * Called via pipe->get_tex_surface()
+ * XXX is this in the right place?
+ */
+struct pipe_surface *
+softpipe_get_tex_surface(struct pipe_context *pipe,
+                         struct pipe_mipmap_tree *mt,
+                         GLuint face, GLuint level, GLuint zslice)
+{
+   struct pipe_surface *ps;
+   GLuint offset;  /* in bytes */
+
+   offset = mt->level[level].level_offset;
+
+   if (mt->target == GL_TEXTURE_CUBE_MAP_ARB) {
+      offset += mt->level[level].image_offset[face] * mt->cpp;
+   }
+   else if (mt->target == GL_TEXTURE_3D) {
+      offset += mt->level[level].image_offset[zslice] * mt->cpp;
+   }
+   else {
+      assert(face == 0);
+      assert(zslice == 0);
+   }
+
+   ps = pipe->surface_alloc(pipe, mt->internal_format);
+   if (ps) {
+      assert(ps->format);
+      assert(ps->refcount);
+      ps->region = mt->region;
+      ps->width = mt->level[level].width;
+      ps->height = mt->level[level].height;
+      ps->offset = offset;
+   }
+   return ps;
+}
+
+
 void
 sp_init_surface_functions(struct softpipe_context *sp)
 {
index 6782bba376e1298468235fa30e9040c359a1d1d7..90086c327f41c7e901705890a19aae3e5ef3f66a 100644 (file)
@@ -85,6 +85,12 @@ struct softpipe_surface {
 };
 
 
+extern struct pipe_surface *
+softpipe_get_tex_surface(struct pipe_context *pipe,
+                         struct pipe_mipmap_tree *mt,
+                         GLuint face, GLuint level, GLuint zslice);
+
+
 /** Cast wrapper */
 static INLINE struct softpipe_surface *
 softpipe_surface(struct pipe_surface *ps)