Eliminate struct pipe_region.
[mesa.git] / src / mesa / pipe / xlib / xm_winsys.c
index 3dd15e198de3404a0fc42134d1fa4110fc2feaed..295174d4bbacf58103198abbd563edc6471fecee 100644 (file)
@@ -120,7 +120,7 @@ xm_buffer_reference(struct pipe_winsys *pws,
 
 static void
 xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
-               unsigned size, const void *data )
+               unsigned size, const void *data, unsigned usage )
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    assert(!xm_buf->userBuffer);
@@ -157,21 +157,17 @@ xm_buffer_get_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
 }
 
 static void
-xm_flush_frontbuffer(struct pipe_winsys *pws)
+xm_flush_frontbuffer(struct pipe_winsys *pws,
+                     struct pipe_surface *surf,
+                     void *context_private)
 {
-   /*
-   struct intel_context *intel = intel_pipe_winsys(sws)->intel;
-   __DRIdrawablePrivate *dPriv = intel->driDrawable;
-   
-   intelCopyBuffer(dPriv, NULL);
-   */
+   /* The Xlib driver's front color surfaces are actually X Windows so
+    * this flush is a no-op.
+    * If we instead did front buffer rendering to a temporary XImage,
+    * this would be the place to copy the Ximage to the on-screen Window.
+    */
 }
 
-static void
-xm_wait_idle(struct pipe_winsys *pws)
-{
-   /* no-op */
-}
 
 static void
 xm_printf(struct pipe_winsys *pws, const char *fmtString, ...)
@@ -190,7 +186,7 @@ xm_get_name(struct pipe_winsys *pws)
 
 
 static struct pipe_buffer_handle *
-xm_buffer_create(struct pipe_winsys *pws, unsigned alignment)
+xm_buffer_create(struct pipe_winsys *pws, unsigned flags)
 {
    struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
    buffer->refcount = 1;
@@ -224,48 +220,11 @@ round_up(unsigned n, unsigned multiple)
 }
 
 
-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)
+static unsigned
+xm_surface_pitch(struct pipe_winsys *winsys, unsigned cpp, unsigned width,
+                unsigned flags)
 {
-   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;
+   return round_up(width, 64 / cpp);
 }
 
 
@@ -283,6 +242,7 @@ xm_surface_alloc(struct pipe_winsys *ws, GLuint pipeFormat)
 
    xms->surface.format = pipeFormat;
    xms->surface.refcount = 1;
+   xms->surface.winsys = ws;
 #if 0
    /*
     * This is really just a softpipe surface, not an XImage/Pixmap surface.
@@ -294,49 +254,81 @@ xm_surface_alloc(struct pipe_winsys *ws, GLuint pipeFormat)
 
 
 
+static void
+xm_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
+{
+   struct pipe_surface *surf = *s;
+   surf->refcount--;
+   if (surf->refcount == 0) {
+      if (surf->buffer)
+        winsys->buffer_reference(winsys, &surf->buffer, NULL);
+      free(surf);
+   }
+   *s = NULL;
+}
+
+
 
 /**
- * Create a winsys layer.
+ * Return pointer to a pipe_winsys object.
+ * For Xlib, this is a singleton object.
  * Nothing special for the Xlib driver so no subclassing or anything.
  */
-static struct pipe_winsys *
-xmesa_create_pipe_winsys(void)
+struct pipe_winsys *
+xmesa_get_pipe_winsys(void)
 {
-   struct pipe_winsys *ws = CALLOC_STRUCT(pipe_winsys);
-   
-   /* Fill in this struct with callbacks that pipe will need to
-    * communicate with the window system, buffer manager, etc. 
-    */
-   ws->buffer_create = xm_buffer_create;
-   ws->user_buffer_create = xm_user_buffer_create;
-   ws->buffer_map = xm_buffer_map;
-   ws->buffer_unmap = xm_buffer_unmap;
-   ws->buffer_reference = xm_buffer_reference;
-   ws->buffer_data = xm_buffer_data;
-   ws->buffer_subdata = xm_buffer_subdata;
-   ws->buffer_get_subdata = xm_buffer_get_subdata;
-
-   ws->region_alloc = xm_region_alloc;
-   ws->region_release = xm_region_release;
+   static struct pipe_winsys *ws = NULL;
 
-   ws->surface_alloc = xm_surface_alloc;
-
-   ws->flush_frontbuffer = xm_flush_frontbuffer;
-   ws->wait_idle = xm_wait_idle;
-   ws->printf = xm_printf;
-   ws->get_name = xm_get_name;
+   if (!ws) {
+      ws = CALLOC_STRUCT(pipe_winsys);
+   
+      /* Fill in this struct with callbacks that pipe will need to
+       * communicate with the window system, buffer manager, etc. 
+       */
+      ws->buffer_create = xm_buffer_create;
+      ws->user_buffer_create = xm_user_buffer_create;
+      ws->buffer_map = xm_buffer_map;
+      ws->buffer_unmap = xm_buffer_unmap;
+      ws->buffer_reference = xm_buffer_reference;
+      ws->buffer_data = xm_buffer_data;
+      ws->buffer_subdata = xm_buffer_subdata;
+      ws->buffer_get_subdata = xm_buffer_get_subdata;
+
+      ws->surface_pitch = xm_surface_pitch;
+      ws->surface_alloc = xm_surface_alloc;
+      ws->surface_release = xm_surface_release;
+
+      ws->flush_frontbuffer = xm_flush_frontbuffer;
+      ws->printf = xm_printf;
+      ws->get_name = xm_get_name;
+   }
 
    return ws;
 }
 
 
+/**
+ * XXX this depends on the depths supported by the screen (8/16/32/etc).
+ * Maybe when we're about to create a context/drawable we create a new
+ * softpipe_winsys object that corresponds to the specified screen...
+ *
+ * Also, this query only really matters for on-screen drawables.
+ * For textures and FBOs we (softpipe) can support any format.o
+ */
 static boolean
 xmesa_is_format_supported(struct softpipe_winsys *sws, uint format)
 {
+   /* Any format supported by softpipe can be listed here.
+    * This query is not used for allocating window-system color buffers
+    * (which would depend on the screen depth/bpp).
+    */
    switch (format) {
    case PIPE_FORMAT_U_A8_R8_G8_B8:
    case PIPE_FORMAT_S_R16_G16_B16_A16:
    case PIPE_FORMAT_S8_Z24:
+   case PIPE_FORMAT_U_S8:
+   case PIPE_FORMAT_U_Z16:
+   case PIPE_FORMAT_U_Z32:
       return TRUE;
    default:
       return FALSE;
@@ -344,22 +336,31 @@ xmesa_is_format_supported(struct softpipe_winsys *sws, uint format)
 }
 
 
+/**
+ * Return pointer to a softpipe_winsys object.
+ * For Xlib, this is a singleton object.
+ */
 static struct softpipe_winsys *
-xmesa_create_softpipe_winsys(void)
+xmesa_get_softpipe_winsys(void)
 {
-   struct softpipe_winsys *spws = CALLOC_STRUCT(softpipe_winsys);
-   if (spws) {
-      spws->is_format_supported = xmesa_is_format_supported;
+   static struct softpipe_winsys *spws = NULL;
+
+   if (!spws) {
+      spws = CALLOC_STRUCT(softpipe_winsys);
+      if (spws) {
+         spws->is_format_supported = xmesa_is_format_supported;
+      }
    }
+
    return spws;
 }
 
 
 struct pipe_context *
-xmesa_create_softpipe(XMesaContext xmesa)
+xmesa_create_context(XMesaContext xmesa)
 {
-   struct pipe_winsys *pws = xmesa_create_pipe_winsys();
-   struct softpipe_winsys *spws = xmesa_create_softpipe_winsys();
+   struct pipe_winsys *pws = xmesa_get_pipe_winsys();
+   struct softpipe_winsys *spws = xmesa_get_softpipe_winsys();
    
    return softpipe_create( pws, spws );
 }