repair breakage from recent pipe_winsys re-org
authorBrian <brian.paul@tungstengraphics.com>
Sat, 11 Aug 2007 16:04:12 +0000 (17:04 +0100)
committerBrian <brian.paul@tungstengraphics.com>
Sat, 11 Aug 2007 16:04:12 +0000 (17:04 +0100)
src/mesa/drivers/x11/xm_buffer.c
src/mesa/drivers/x11/xm_softpipe.c
src/mesa/drivers/x11/xm_surface.c

index fb6815ae1eb81b61b3ed842d458cf608a4470b67..4cd2ab7c6bd593f97b1ef1ca9704ae64765cb2b9 100644 (file)
@@ -248,6 +248,20 @@ xmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
 }
 
 
+static void
+finish_surface_init(GLcontext *ctx, struct xmesa_renderbuffer *xrb)
+{
+   struct pipe_context *pipe = ctx->st->pipe;
+
+   if (!xrb->St.surface) {
+      xrb->St.surface = xmesa_new_surface(ctx, xrb);
+   }
+   if (!xrb->St.surface->region) {
+      xrb->St.surface->region = pipe->region_alloc(pipe, 1, 0, 0, 0x0);
+   }
+}
+
+
 /**
  * Reallocate renderbuffer storage for front color buffer.
  * Called via gl_renderbuffer::AllocStorage()
@@ -271,8 +285,9 @@ xmesa_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
    rb->Height = height;
    rb->InternalFormat = internalFormat;
 
-   if (!xrb->St.surface)
-      xrb->St.surface = xmesa_new_surface(ctx, xrb);
+   if (!xrb->St.surface || !xrb->St.surface->region)
+      finish_surface_init(ctx, xrb);
+
    xrb->St.surface->width = width;
    xrb->St.surface->height = height;
 
@@ -325,8 +340,9 @@ xmesa_alloc_back_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
       xrb->origin4 = NULL;
    }
 
-   if (!xrb->St.surface)
-      xrb->St.surface = xmesa_new_surface(ctx, xrb);
+   if (!xrb->St.surface || !xrb->St.surface->region)
+      finish_surface_init(ctx, xrb);
+
    xrb->St.surface->width = width;
    xrb->St.surface->height = height;
 
@@ -340,7 +356,7 @@ xmesa_alloc_back_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
  */
 struct xmesa_renderbuffer *
 xmesa_create_renderbuffer(GLcontext *ctx, GLuint name, const GLvisual *visual,
-                       GLboolean backBuffer)
+                          GLboolean backBuffer)
 {
    struct xmesa_renderbuffer *xrb = CALLOC_STRUCT(xmesa_renderbuffer);
    struct pipe_context *pipe = NULL;/*ctx->st->pipe;*/
index 6e8ef21b507677bb3f8bc44de29e2001e2f47b31..2f93ff33097f20f5e2153a841939e8904eadaee1 100644 (file)
@@ -37,6 +37,7 @@
 #include "xmesaP.h"
 #include "main/macros.h"
 
+#include "pipe/p_winsys.h"
 #include "pipe/softpipe/sp_winsys.h"
 
 
@@ -62,36 +63,37 @@ struct xm_buffer
 static inline struct xm_buffer *
 xm_bo( struct pipe_buffer_handle *bo )
 {
-   return (struct xm_buffer *)bo;
+   return (struct xm_buffer *) bo;
 }
 
 static inline struct pipe_buffer_handle *
 pipe_bo( struct xm_buffer *bo )
 {
-   return (struct pipe_buffer_handle *)bo;
+   return (struct pipe_buffer_handle *) bo;
 }
 
 /* Turn a softpipe winsys into an xm/softpipe winsys:
  */
 static inline struct xm_softpipe_winsys *
-xm_softpipe_winsys( struct softpipe_winsys *sws )
+xm_softpipe_winsys(struct softpipe_winsys *sws)
 {
-   return (struct xm_softpipe_winsys *)sws;
+   return (struct xm_softpipe_winsys *) sws;
 }
 
 
 /* Most callbacks map direcly onto dri_bufmgr operations:
  */
-static void *xm_buffer_map(struct softpipe_winsys *sws, 
-                           struct pipe_buffer_handle *buf )
+static void *
+xm_buffer_map(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
+              unsigned flags)
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    xm_buf->mapped = xm_buf->data;
    return xm_buf->mapped;
 }
 
-static void xm_buffer_unmap(struct softpipe_winsys *sws, 
-                              struct pipe_buffer_handle *buf)
+static void
+xm_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer_handle *buf)
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    xm_buf->mapped = NULL;
@@ -99,16 +101,15 @@ static void xm_buffer_unmap(struct softpipe_winsys *sws,
 
 
 static struct pipe_buffer_handle *
-xm_buffer_reference(struct softpipe_winsys *sws,
-                    struct pipe_buffer_handle *buf)
+xm_buffer_reference(struct pipe_winsys *pws, struct pipe_buffer_handle *buf)
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    xm_buf->refcount++;
    return buf;
 }
 
-static void xm_buffer_unreference(struct softpipe_winsys *sws, 
-                                  struct pipe_buffer_handle **buf)
+static void
+xm_buffer_unreference(struct pipe_winsys *pws, struct pipe_buffer_handle **buf)
 {
    struct xm_buffer *xm_buf = xm_bo(*buf);
    xm_buf->refcount--;
@@ -122,21 +123,18 @@ static void xm_buffer_unreference(struct softpipe_winsys *sws,
    *buf = NULL;
 }
 
-
-static void xm_buffer_data(struct softpipe_winsys *sws, 
-                             struct pipe_buffer_handle *buf,
-                             unsigned size, const void *data )
+static void
+xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
+               unsigned size, const void *data )
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    assert(!xm_buf->data);
    xm_buf->data = malloc(size);
 }
 
-static void xm_buffer_subdata(struct softpipe_winsys *sws, 
-                              struct pipe_buffer_handle *buf,
-                              unsigned long offset, 
-                              unsigned long size, 
-                              const void *data)
+static void
+xm_buffer_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
+                  unsigned long offset, unsigned long size, const void *data)
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    GLubyte *b = (GLubyte *) xm_buf->data;
@@ -144,11 +142,9 @@ static void xm_buffer_subdata(struct softpipe_winsys *sws,
    memcpy(b + offset, data, size);
 }
 
-static void xm_buffer_get_subdata(struct softpipe_winsys *sws, 
-                                    struct pipe_buffer_handle *buf,
-                                    unsigned long offset, 
-                                    unsigned long size, 
-                                    void *data)
+static void
+xm_buffer_get_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
+                      unsigned long offset, unsigned long size, void *data)
 {
    const struct xm_buffer *xm_buf = xm_bo(buf);
    const GLubyte *b = (GLubyte *) xm_buf->data;
@@ -156,21 +152,86 @@ static void xm_buffer_get_subdata(struct softpipe_winsys *sws,
    memcpy(data, b + offset, size);
 }
 
+static void
+xm_flush_frontbuffer(struct pipe_winsys *pws)
+{
+   /*
+   struct intel_context *intel = intel_pipe_winsys(sws)->intel;
+   __DRIdrawablePrivate *dPriv = intel->driDrawable;
+   
+   intelCopyBuffer(dPriv, NULL);
+   */
+}
+
+static void
+xm_wait_idle(struct pipe_winsys *pws)
+{
+   /* no-op */
+}
+
+static void
+xm_printf(struct pipe_winsys *pws, const char *fmtString, ...)
+{
+   va_list args;
+   va_start( args, fmtString );  
+   vfprintf(stderr, fmtString, args);
+   va_end( args );
+}
+
+static const char *
+xm_get_name(struct pipe_winsys *pws)
+{
+   return "Xlib";
+}
+
 
 /* Softpipe has no concept of pools.  We choose the tex/region pool
  * for all buffers.
  */
 static struct pipe_buffer_handle *
-xm_create_buffer(struct softpipe_winsys *sws, 
-                 unsigned alignment)
+xm_buffer_create(struct pipe_winsys *pws, unsigned alignment)
 {
-   struct xm_buffer *buffer;
-
-   buffer = CALLOC_STRUCT(xm_buffer);
+   struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer);
    return pipe_bo(buffer);
 }
 
 
+struct xmesa_pipe_winsys
+{
+   struct pipe_winsys winsys;
+   XMesaContext xmesa;
+};
+
+static struct pipe_winsys *
+xmesa_create_pipe_winsys( XMesaContext xmesa )
+{
+   struct xmesa_pipe_winsys *xws = CALLOC_STRUCT(xmesa_pipe_winsys);
+   
+   /* Fill in this struct with callbacks that pipe will need to
+    * communicate with the window system, buffer manager, etc. 
+    *
+    * Pipe 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 _DriBufferObject.  
+    */
+   xws->winsys.buffer_create = xm_buffer_create;
+   xws->winsys.buffer_map = xm_buffer_map;
+   xws->winsys.buffer_unmap = xm_buffer_unmap;
+   xws->winsys.buffer_reference = xm_buffer_reference;
+   xws->winsys.buffer_unreference = xm_buffer_unreference;
+   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.flush_frontbuffer = xm_flush_frontbuffer;
+   xws->winsys.wait_idle = xm_wait_idle;
+   xws->winsys.printf = xm_printf;
+   xws->winsys.get_name = xm_get_name;
+   xws->xmesa = xmesa;
+
+   return &xws->winsys;
+}
+
+
 struct pipe_context *
 xmesa_create_softpipe(XMesaContext xmesa)
 {
@@ -183,6 +244,7 @@ xmesa_create_softpipe(XMesaContext xmesa)
     * 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;
@@ -191,8 +253,9 @@ xmesa_create_softpipe(XMesaContext xmesa)
    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( &isws->sws );
+   return softpipe_create( xmesa_create_pipe_winsys(xmesa), &isws->sws );
 }
index 1915151ba48a64d631a6e429919aa5d271913f20..c6057e5154fe5a0f7b0f5e2c2f7fadb91452bbe0 100644 (file)
@@ -168,6 +168,23 @@ write_quad_ub(struct softpipe_surface *sps, GLint x, GLint y,
 }
 
 
+static void
+get_tile(struct pipe_surface *ps,
+         GLuint x, GLuint y, GLuint w, GLuint h, GLfloat *p)
+{
+
+}
+
+
+static void
+put_tile(struct pipe_surface *ps,
+         GLuint x, GLuint y, GLuint w, GLuint h, const GLfloat *p)
+{
+
+}
+
+
+
 /**
  * Called to create a pipe_surface for each X renderbuffer.
  * Note: this is being used instead of pipe->surface_alloc() since we
@@ -186,6 +203,8 @@ xmesa_new_surface(GLcontext *ctx, struct xmesa_renderbuffer *xrb)
 #if 0
    sps->surface.rb = xrb; /* XXX only needed for quad funcs above */
 #endif
+   sps->surface.refcount = 1;
+
    sps->surface.width = xrb->St.Base.Width;
    sps->surface.height = xrb->St.Base.Height;
 
@@ -195,13 +214,15 @@ xmesa_new_surface(GLcontext *ctx, struct xmesa_renderbuffer *xrb)
    sps->write_quad_f = write_quad_f;
    sps->write_quad_f_swz = write_quad_f_swz;
    sps->write_quad_ub = write_quad_ub;
+   sps->surface.get_tile = get_tile;
+   sps->surface.put_tile = put_tile;
 
    /* Note, the region we allocate doesn't actually have any storage
     * since we're drawing into an XImage or Pixmap.
     * The region's size will get set in the xmesa_alloc_front/back_storage()
     * functions.
     */
-   sps->surface.region = pipe->region_alloc(pipe, 0, 0, 0);
+   sps->surface.region = pipe->region_alloc(pipe, 0, 0, 0, 0x0);
 
    return &sps->surface;
 }
@@ -215,6 +236,7 @@ xmesa_surface_alloc(struct pipe_context *pipe, GLuint pipeFormat)
    assert(pipeFormat);
 
    xms->surface.surface.format = pipeFormat;
+   xms->surface.surface.refcount = 1;
 
    switch (pipeFormat) {
    case PIPE_FORMAT_U_A8_R8_G8_B8:
@@ -225,6 +247,8 @@ xmesa_surface_alloc(struct pipe_context *pipe, GLuint pipeFormat)
       xms->surface.write_quad_f = write_quad_f;
       xms->surface.write_quad_f_swz = write_quad_f_swz;
       xms->surface.write_quad_ub = write_quad_ub;
+      xms->surface.surface.get_tile = get_tile;
+      xms->surface.surface.put_tile = put_tile;
       break;
    case PIPE_FORMAT_S8_Z24:
       softpipe_init_surface_funcs(&xms->surface);
@@ -237,6 +261,14 @@ xmesa_surface_alloc(struct pipe_context *pipe, GLuint pipeFormat)
       abort();
    }
 
+   /* Note, the region we allocate doesn't actually have any storage
+    * since we're drawing into an XImage or Pixmap.
+    * The region's size will get set in the xmesa_alloc_front/back_storage()
+    * functions.
+    */
+   if (pipe)
+      xms->surface.surface.region = pipe->region_alloc(pipe, 1, 0, 0, 0x0);
+
    return &xms->surface.surface;
 }