Move region_alloc() and region_release() to pipe_winsys.
authorBrian <brian.paul@tungstengraphics.com>
Fri, 26 Oct 2007 01:27:29 +0000 (19:27 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 26 Oct 2007 02:35:23 +0000 (20:35 -0600)
This allows regions to be allocated w/out a rendering context.

12 files changed:
src/mesa/drivers/dri/intel_winsys/intel_winsys_i915.c
src/mesa/drivers/x11/xm_buffer.c
src/mesa/drivers/x11/xm_surface.c
src/mesa/drivers/x11/xm_winsys.c
src/mesa/pipe/failover/fo_context.c
src/mesa/pipe/i915simple/i915_regions.c
src/mesa/pipe/p_context.h
src/mesa/pipe/p_winsys.h
src/mesa/pipe/softpipe/sp_region.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_mipmap_tree.c

index f6eb050..c481495 100644 (file)
@@ -120,6 +120,64 @@ static void intel_i915_batch_flush( struct i915_winsys *sws )
 
 
 
+static struct pipe_region *
+intel_i915_region_alloc(struct pipe_winsys *winsys,
+                        unsigned cpp, unsigned width,
+                        unsigned height, unsigned flags)
+{
+   struct pipe_region *region = calloc(sizeof(*region), 1);
+   const unsigned alignment = 64;
+
+   /* Choose a pitch to match hardware requirements - requires 64 byte
+    * alignment of render targets.  
+    *
+    * XXX: is this ok for textures??
+    * clearly want to be able to render to textures under some
+    * circumstances, but maybe not always a requirement.
+    */
+   unsigned pitch;
+
+   /* XXX is the pitch different for textures vs. drawables? */
+   if (flags & PIPE_SURFACE_FLAG_TEXTURE)  /* or PIPE_SURFACE_FLAG_RENDER? */
+      pitch = ((cpp * width + 63) & ~63) / cpp;
+   else
+      pitch = ((cpp * width + 63) & ~63) / cpp;
+
+   region->cpp = cpp;
+   region->pitch = pitch;
+   region->height = height;     /* needed? */
+   region->refcount = 1;
+
+   region->buffer = winsys->buffer_create( winsys, alignment );
+
+   winsys->buffer_data( winsys,
+                        region->buffer, 
+                        pitch * cpp * height, 
+                        NULL );
+
+   return region;
+}
+
+static void
+intel_i915_region_release(struct pipe_winsys *winsys,
+                          struct pipe_region **region)
+{
+   if (!*region)
+      return;
+
+   assert((*region)->refcount > 0);
+   (*region)->refcount--;
+
+   if ((*region)->refcount == 0) {
+      assert((*region)->map_refcount == 0);
+
+      winsys->buffer_reference( winsys,
+                                &((*region)->buffer), NULL );
+      free(*region);
+   }
+   *region = NULL;
+}
+
 
 struct pipe_context *
 intel_create_i915simple( struct intel_context *intel )
@@ -135,6 +193,9 @@ intel_create_i915simple( struct intel_context *intel )
    iws->winsys.batch_flush = intel_i915_batch_flush;
    iws->intel = intel;
 
+   iws->winsys.region_alloc = intel_i915_region_alloc;
+   iws->winsys.region_release = intel_i915_region_release;
+
    /* Create the i915simple context:
     */
    return i915_create( intel_create_pipe_winsys(intel),
index b8d3df1..09356c7 100644 (file)
@@ -37,6 +37,7 @@
 #include "renderbuffer.h"
 #include "pipe/p_state.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
 #include "state_tracker/st_context.h"
 
 
@@ -254,7 +255,8 @@ finish_surface_init(GLcontext *ctx, struct xmesa_renderbuffer *xrb)
    struct pipe_context *pipe = ctx->st->pipe;
    if (!xrb->St.surface->region) {
       int w = 1, h = 1;
-      xrb->St.surface->region = pipe->region_alloc(pipe, 1, w, h, 0x0);
+      xrb->St.surface->region = pipe->winsys->region_alloc(pipe->winsys,
+                                                           1, w, h, 0x0);
    }
 }
 
index 340f796..337033f 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
 #include "pipe/softpipe/sp_context.h"
 #include "pipe/softpipe/sp_clear.h"
 #include "pipe/softpipe/sp_tile_cache.h"
@@ -163,7 +164,8 @@ xmesa_new_color_surface(struct pipe_context *pipe, GLuint pipeFormat)
     * functions.
     */
    if (pipe)
-      xms->surface.surface.region = pipe->region_alloc(pipe, 1, 0, 0, 0x0);
+      xms->surface.surface.region = pipe->winsys->region_alloc(pipe->winsys,
+                                                               1, 0, 0, 0x0);
 
    return &xms->surface.surface;
 }
index 7e29580..624d28d 100644 (file)
@@ -233,6 +233,63 @@ xm_user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
 }
 
 
+
+/**
+ * Round n up to next multiple.
+ */
+static INLINE unsigned
+round_up(unsigned n, unsigned multiple)
+{
+   return (n + multiple - 1) & ~(multiple - 1);
+}
+
+
+static struct pipe_region *
+xm_region_alloc(struct pipe_winsys *winsys,
+                unsigned cpp, unsigned width, unsigned height, unsigned flags)
+{
+   struct pipe_region *region = CALLOC_STRUCT(pipe_region);
+   const unsigned alignment = 64;
+
+   region->cpp = cpp;
+   region->pitch = round_up(width, alignment / cpp);
+   region->height = height;
+   region->refcount = 1;
+
+   assert(region->pitch > 0);
+
+   region->buffer = winsys->buffer_create( winsys, alignment )
+;
+
+   /* NULL data --> just allocate the space */
+   winsys->buffer_data( winsys,
+                        region->buffer, 
+                        region->pitch * cpp * height, 
+                        NULL );
+   return region;
+}
+
+
+static void
+xm_region_release(struct pipe_winsys *winsys, struct pipe_region **region)
+{
+   if (!*region)
+      return;
+
+   assert((*region)->refcount > 0);
+   (*region)->refcount--;
+
+   if ((*region)->refcount == 0) {
+      assert((*region)->map_refcount == 0);
+
+      winsys->buffer_reference( winsys, &((*region)->buffer), NULL );
+      free(*region);
+   }
+   *region = NULL;
+}
+
+
+
 struct xmesa_pipe_winsys
 {
    struct pipe_winsys winsys;
@@ -259,6 +316,10 @@ xmesa_create_pipe_winsys( XMesaContext xmesa )
    xws->winsys.buffer_data = xm_buffer_data;
    xws->winsys.buffer_subdata = xm_buffer_subdata;
    xws->winsys.buffer_get_subdata = xm_buffer_get_subdata;
+
+   xws->winsys.region_alloc = xm_region_alloc;
+   xws->winsys.region_release = xm_region_release;
+
    xws->winsys.flush_frontbuffer = xm_flush_frontbuffer;
    xws->winsys.wait_idle = xm_wait_idle;
    xws->winsys.printf = xm_printf;
@@ -272,27 +333,9 @@ xmesa_create_pipe_winsys( XMesaContext xmesa )
 struct pipe_context *
 xmesa_create_softpipe(XMesaContext xmesa)
 {
-   struct xm_winsys *isws = CALLOC_STRUCT( xm_winsys );
+   struct xm_winsys *xm_ws = CALLOC_STRUCT( xm_winsys );
    
-   /* Fill in this struct with callbacks that softpipe will need to
-    * communicate with the window system, buffer manager, etc. 
-    *
-    * Softpipe would be happy with a malloc based memory manager, but
-    * the SwapBuffers implementation in this winsys driver requires
-    * that rendering be done to an appropriate xm_buffer.  
-    */
-#if 0
-   isws->sws.create_buffer = xm_create_buffer;
-   isws->sws.buffer_map = xm_buffer_map;
-   isws->sws.buffer_unmap = xm_buffer_unmap;
-   isws->sws.buffer_reference = xm_buffer_reference;
-   isws->sws.buffer_unreference = xm_buffer_unreference;
-   isws->sws.buffer_data = xm_buffer_data;
-   isws->sws.buffer_subdata = xm_buffer_subdata;
-   isws->sws.buffer_get_subdata = xm_buffer_get_subdata;
-#endif
-
    /* Create the softpipe context:
     */
-   return softpipe_create( xmesa_create_pipe_winsys(xmesa), &isws->sws );
+   return softpipe_create( xmesa_create_pipe_winsys(xmesa), &xm_ws->sws );
 }
index 076d516..a3a0296 100644 (file)
@@ -137,8 +137,6 @@ struct pipe_context *failover_create( struct pipe_context *hw,
    failover->pipe.surface_alloc = hw->surface_alloc;
    failover->pipe.get_tex_surface = hw->get_tex_surface;
 
-   failover->pipe.region_alloc = hw->region_alloc;
-   failover->pipe.region_release = hw->region_release;
    failover->pipe.region_map = hw->region_map;
    failover->pipe.region_unmap = hw->region_unmap;
    failover->pipe.region_data = hw->region_data;
index 577a6ad..0410446 100644 (file)
@@ -69,65 +69,6 @@ i915_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
    }
 }
 
-static struct pipe_region *
-i915_region_alloc(struct pipe_context *pipe,
-                 unsigned cpp, unsigned width, unsigned height, unsigned flags)
-{
-   struct i915_context *i915 = i915_context( pipe );
-   struct pipe_region *region = calloc(sizeof(*region), 1);
-   const unsigned alignment = 64;
-
-   /* Choose a pitch to match hardware requirements - requires 64 byte
-    * alignment of render targets.  
-    *
-    * XXX: is this ok for textures??
-    * clearly want to be able to render to textures under some
-    * circumstances, but maybe not always a requirement.
-    */
-   unsigned pitch;
-
-   /* XXX is the pitch different for textures vs. drawables? */
-   if (flags & PIPE_SURFACE_FLAG_TEXTURE)  /* or PIPE_SURFACE_FLAG_RENDER? */
-      pitch = ((cpp * width + 63) & ~63) / cpp;
-   else
-      pitch = ((cpp * width + 63) & ~63) / cpp;
-
-   region->cpp = cpp;
-   region->pitch = pitch;
-   region->height = height;     /* needed? */
-   region->refcount = 1;
-
-   region->buffer = i915->pipe.winsys->buffer_create( i915->pipe.winsys, alignment );
-
-   i915->pipe.winsys->buffer_data( i915->pipe.winsys,
-                                  region->buffer, 
-                                  pitch * cpp * height, 
-                                  NULL );
-
-   return region;
-}
-
-static void
-i915_region_release(struct pipe_context *pipe, struct pipe_region **region)
-{
-   struct i915_context *i915 = i915_context( pipe );
-
-   if (!*region)
-      return;
-
-   assert((*region)->refcount > 0);
-   (*region)->refcount--;
-
-   if ((*region)->refcount == 0) {
-      assert((*region)->map_refcount == 0);
-
-      i915->pipe.winsys->buffer_reference( i915->pipe.winsys,
-                                           &((*region)->buffer), NULL );
-      free(*region);
-   }
-   *region = NULL;
-}
-
 
 /*
  * XXX Move this into core Mesa?
@@ -302,8 +243,6 @@ i915_init_region_functions(struct i915_context *i915)
 {
    i915->pipe.region_map = i915_region_map;
    i915->pipe.region_unmap = i915_region_unmap;
-   i915->pipe.region_alloc = i915_region_alloc;
-   i915->pipe.region_release = i915_region_release;
    i915->pipe.region_data = i915_region_data;
    i915->pipe.region_copy = i915_region_copy;
    i915->pipe.region_fill = i915_region_fill;
index a22ea3a..b9de366 100644 (file)
@@ -208,14 +208,7 @@ struct pipe_context {
 
    /*
     * Memory region functions
-    * Some of these may go away...
     */
-   struct pipe_region *(*region_alloc)(struct pipe_context *pipe,
-                                       unsigned cpp, unsigned width, unsigned height,
-                                       unsigned flags);
-
-   void (*region_release)(struct pipe_context *pipe, struct pipe_region **r);
-
    ubyte *(*region_map)(struct pipe_context *pipe, struct pipe_region *r);
 
    void (*region_unmap)(struct pipe_context *pipe, struct pipe_region *r);
@@ -225,7 +218,8 @@ struct pipe_context {
                        unsigned dest_offset,
                        unsigned destx, unsigned desty,
                        const void *src, unsigned src_stride,
-                       unsigned srcx, unsigned srcy, unsigned width, unsigned height);
+                       unsigned srcx, unsigned srcy,
+                       unsigned width, unsigned height);
 
    void (*region_copy)(struct pipe_context *pipe,
                        struct pipe_region *dest,
@@ -234,7 +228,8 @@ struct pipe_context {
                        struct pipe_region *src,        /* don't make this const - 
                                                   need to map/unmap */
                        unsigned src_offset,
-                       unsigned srcx, unsigned srcy, unsigned width, unsigned height);
+                       unsigned srcx, unsigned srcy,
+                       unsigned width, unsigned height);
 
    void (*region_fill)(struct pipe_context *pipe,
                        struct pipe_region *dst,
index 7e5d394..3b04c44 100644 (file)
@@ -50,6 +50,13 @@ struct pipe_buffer_handle;
  * driver and the hardware driver about the format of command buffers,
  * etc.
  */
+
+
+struct pipe_region;
+
+/** Opaque type */
+struct pipe_buffer_handle;
+
 struct pipe_winsys
 {
    /**
@@ -63,6 +70,13 @@ struct pipe_winsys
                   const char *, ... ); 
 
 
+   struct pipe_region *(*region_alloc)(struct pipe_winsys *ws,
+                                       unsigned cpp, unsigned width,
+                                       unsigned height, unsigned flags);
+
+   void (*region_release)(struct pipe_winsys *ws, struct pipe_region **r);
+
+
    /**
     * The buffer manager is modeled after the dri_bufmgr interface, which 
     * in turn is modeled after the ARB_vertex_buffer_object extension,  
index 4317a9e..80a67dc 100644 (file)
 #include "pipe/p_defines.h"
 
 
-/**
- * Round n up to next multiple.
- */
-static INLINE unsigned
-round_up(unsigned n, unsigned multiple)
-{
-   return (n + multiple - 1) & ~(multiple - 1);
-}
-
-
 
 static ubyte *
 sp_region_map(struct pipe_context *pipe, struct pipe_region *region)
@@ -79,51 +69,6 @@ sp_region_unmap(struct pipe_context *pipe, struct pipe_region *region)
    }
 }
 
-static struct pipe_region *
-sp_region_alloc(struct pipe_context *pipe,
-               unsigned cpp, unsigned width, unsigned height, unsigned flags)
-{
-   struct softpipe_context *sp = softpipe_context( pipe );
-   struct pipe_region *region = CALLOC_STRUCT(pipe_region);
-   const unsigned alignment = 64;
-
-   region->cpp = cpp;
-   region->pitch = round_up(width, alignment / cpp);
-   region->height = height;
-   region->refcount = 1;
-
-   assert(region->pitch > 0);
-
-   region->buffer = sp->pipe.winsys->buffer_create( sp->pipe.winsys, alignment );
-
-   /* NULL data --> just allocate the space */
-   sp->pipe.winsys->buffer_data( sp->pipe.winsys,
-                                region->buffer, 
-                                region->pitch * cpp * height, 
-                                NULL );
-   return region;
-}
-
-static void
-sp_region_release(struct pipe_context *pipe, struct pipe_region **region)
-{
-   struct softpipe_context *sp = softpipe_context( pipe );
-
-   if (!*region)
-      return;
-
-   assert((*region)->refcount > 0);
-   (*region)->refcount--;
-
-   if ((*region)->refcount == 0) {
-      assert((*region)->map_refcount == 0);
-
-      sp->pipe.winsys->buffer_reference( sp->pipe.winsys,
-                                         &((*region)->buffer), NULL );
-      free(*region);
-   }
-   *region = NULL;
-}
 
 
 /**
@@ -313,8 +258,6 @@ sp_init_region_functions(struct softpipe_context *sp)
 {
    sp->pipe.region_map = sp_region_map;
    sp->pipe.region_unmap = sp_region_unmap;
-   sp->pipe.region_alloc = sp_region_alloc;
-   sp->pipe.region_release = sp_region_release;
    sp->pipe.region_data = sp_region_data;
    sp->pipe.region_copy = sp_region_copy;
    sp->pipe.region_fill = sp_region_fill;
index c4a954c..5d8890e 100644 (file)
@@ -47,6 +47,7 @@
 #include "st_format.h"
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
 #include "pipe/tgsi/mesa/mesa_to_tgsi.h"
 #include "shader/prog_instruction.h"
 
@@ -346,7 +347,8 @@ alloc_mipmap_tree(struct st_context *st,
    cpp = st_sizeof_format(pipeFormat);
 
    /* allocate texture region/storage */
-   mt->region = st->pipe->region_alloc(st->pipe, cpp, width, height, flags);
+   mt->region = st->pipe->winsys->region_alloc(st->pipe->winsys,
+                                               cpp, width, height, flags);
 
    mt->target = PIPE_TEXTURE_2D;
    mt->internal_format = GL_RGBA;
@@ -468,7 +470,7 @@ make_mipmap_tree(struct st_context *st,
 static void
 free_mipmap_tree(struct pipe_context *pipe, struct pipe_mipmap_tree *mt)
 {
-   pipe->region_release(pipe, &mt->region);
+   pipe->winsys->region_release(pipe->winsys, &mt->region);
    free(mt);
 }
 
@@ -977,7 +979,8 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,
 
 
    /* allocate texture region/storage */
-   mt->region = pipe->region_alloc(pipe, cpp, width, height, flags);
+   mt->region = pipe->winsys->region_alloc(pipe->winsys,
+                                           cpp, width, height, flags);
    pitch = mt->region->pitch;
 
    /* map texture region */
index 94e286f..f22132b 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
 #include "st_context.h"
 #include "st_cb_fbo.h"
 #include "st_cb_texture.h"
@@ -95,10 +96,11 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
       struct pipe_region *r = strb->surface->region;
       while (r->map)
          pipe->region_unmap(pipe, r);
-      pipe->region_release(pipe, &strb->surface->region);
+      pipe->winsys->region_release(pipe->winsys, &strb->surface->region);
    }
 
-   strb->surface->region = pipe->region_alloc(pipe, cpp, width, height, flags);
+   strb->surface->region = pipe->winsys->region_alloc(pipe->winsys, cpp,
+                                                      width, height, flags);
    if (!strb->surface->region)
       return GL_FALSE; /* out of memory, try s/w buffer? */
 
@@ -125,7 +127,7 @@ st_renderbuffer_delete(struct gl_renderbuffer *rb)
       ASSERT(strb);
       if (strb && strb->surface) {
          if (strb->surface->region) {
-            pipe->region_release(pipe, &strb->surface->region);
+            pipe->winsys->region_release(pipe->winsys, &strb->surface->region);
          }
          free(strb->surface);
       }
index faca148..d1db590 100644 (file)
@@ -31,6 +31,7 @@
 #include "pipe/p_state.h"
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
 
 
 #define DBG if(0) printf
@@ -87,8 +88,8 @@ st_miptree_create(struct pipe_context *pipe,
    ok = pipe->mipmap_tree_layout(pipe, mt);
    if (ok) {
       /* note: it's OK to pass 'pitch' as 'width' here: */
-      mt->region = pipe->region_alloc(pipe, mt->cpp, mt->pitch,
-                                      mt->total_height, flags);
+      mt->region = pipe->winsys->region_alloc(pipe->winsys, mt->cpp, mt->pitch,
+                                              mt->total_height, flags);
       mt->pitch = mt->region->pitch; /*XXX NEW */
    }
 
@@ -124,7 +125,7 @@ st_miptree_release(struct pipe_context *pipe,
 
       DBG("%s deleting %p\n", __FUNCTION__, (void *) *mt);
 
-      pipe->region_release(pipe, &((*mt)->region));
+      pipe->winsys->region_release(pipe->winsys, &((*mt)->region));
 
       for (i = 0; i < MAX_TEXTURE_LEVELS; i++)
          if ((*mt)->level[i].image_offset)