Merge branch 'mesa_7_5_branch'
[mesa.git] / src / gallium / winsys / xlib / xlib_brw_screen.c
index 9325bdc7a6849edcc0b0df8265f27c19f69628a5..fe8dfff767209d610ed4d478924337c86abd105a 100644 (file)
 //#include "state_trackers/xlib/glxheader.h"
 //#include "state_trackers/xlib/xmesaP.h"
 
-#include "pipe/p_winsys.h"
-#include "pipe/p_inlines.h"
+#include "pipe/internal/p_winsys_screen.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
 #include "i965simple/brw_winsys.h"
 #include "i965simple/brw_screen.h"
+#include "i965simple/brw_context.h"
+
 
 #include "xlib_brw_aub.h"
 #include "xlib_brw.h"
+#include "xlib.h"
 
-
+static struct pipe_buffer *
+buffer_from_surface(struct pipe_surface *surface)
+{
+   struct brw_texture *texture = (struct brw_texture *)surface;
+   return texture->buffer;
+}
 
 struct aub_buffer {
+   struct pipe_reference reference;
    char *data;
    unsigned offset;
    unsigned size;
-   unsigned refcount;
    unsigned map_count;
    boolean dump_on_unmap;
 };
@@ -136,8 +143,7 @@ static void aub_buffer_unmap(struct pipe_winsys *winsys,
 
 
 static void
-aub_buffer_destroy(struct pipe_winsys *winsys,
-                  struct pipe_buffer *buf)
+aub_buffer_destroy(struct pipe_buffer *buf)
 {
    free(buf);
 }
@@ -181,7 +187,7 @@ aub_buffer_create(struct pipe_winsys *winsys,
    struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys);
    struct aub_buffer *sbo = CALLOC_STRUCT(aub_buffer);
 
-   sbo->refcount = 1;
+   pipe_reference_init(&sbo->reference, 1);
 
    /* Could reuse buffers that are not referenced in current
     * batchbuffer.  Can't do that atm, so always reallocate:
@@ -225,18 +231,7 @@ aub_flush_frontbuffer( struct pipe_winsys *winsys,
 //   struct aub_pipe_winsys *iws = aub_pipe_winsys(winsys);
    brw_aub_dump_bmp( global_winsys->aubfile, 
                     surface,
-                    aub_bo(surface->buffer)->offset );
-}
-
-static struct pipe_surface *
-aub_i915_surface_alloc(struct pipe_winsys *winsys)
-{
-   struct pipe_surface *surf = CALLOC_STRUCT(pipe_surface);
-   if (surf) {
-      surf->refcount = 1;
-      surf->winsys = winsys;
-   }
-   return surf;
+                    aub_bo(buffer_from_surface(surface))->offset );
 }
 
 
@@ -249,50 +244,28 @@ round_up(unsigned n, unsigned multiple)
    return (n + multiple - 1) & ~(multiple - 1);
 }
 
-static int
-aub_i915_surface_alloc_storage(struct pipe_winsys *winsys,
-                               struct pipe_surface *surf,
+static struct pipe_buffer *
+aub_i915_surface_buffer_create(struct pipe_winsys *winsys,
                                unsigned width, unsigned height,
                                enum pipe_format format,
-                               unsigned flags,
-                               unsigned tex_usage)
+                               unsigned usage,
+                               unsigned *stride)
 {
    const unsigned alignment = 64;
+   struct pipe_format_block block;
+   unsigned nblocksx, nblocksy;
 
-   surf->width = width;
-   surf->height = height;
-   surf->format = format;
-   pf_get_block(format, &surf->block);
-   surf->nblocksx = pf_get_nblocksx(&surf->block, width);
-   surf->nblocksy = pf_get_nblocksy(&surf->block, height);
-   surf->stride = round_up(surf->nblocksx * surf->block.size, alignment);
-   surf->usage = flags;
-
-   assert(!surf->buffer);
-   surf->buffer = winsys->buffer_create(winsys, alignment,
-                                        PIPE_BUFFER_USAGE_PIXEL,
-                                        surf->stride * surf->nblocksy);
-    if(!surf->buffer)
-       return -1;
-
-   return 0;
-}
+   pf_get_block(format, &block);
+   nblocksx = pf_get_nblocksx(&block, width);
+   nblocksy = pf_get_nblocksy(&block, height);
+   *stride = round_up(nblocksx * block.size, alignment);
 
-static void
-aub_i915_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;
+   return winsys->buffer_create(winsys, alignment,
+                                usage,
+                                *stride * nblocksy);
 }
 
 
-
 static const char *
 aub_get_name( struct pipe_winsys *winsys )
 {
@@ -311,7 +284,7 @@ xlib_brw_destroy_pipe_winsys_aub( struct pipe_winsys *winsys )
 
 
 
-struct pipe_winsys *
+static struct pipe_winsys *
 xlib_create_brw_winsys( void )
 {
    struct aub_pipe_winsys *iws = CALLOC_STRUCT( aub_pipe_winsys );
@@ -332,9 +305,7 @@ xlib_create_brw_winsys( void )
    iws->winsys.get_name = aub_get_name;
    iws->winsys.destroy = xlib_brw_destroy_pipe_winsys_aub;
 
-   iws->winsys.surface_alloc = aub_i915_surface_alloc;
-   iws->winsys.surface_alloc_storage = aub_i915_surface_alloc_storage;
-   iws->winsys.surface_release = aub_i915_surface_release;
+   iws->winsys.surface_buffer_create = aub_i915_surface_buffer_create;
 
    iws->aubfile = brw_aubfile_create();
    iws->size = AUB_BUF_SIZE;
@@ -349,14 +320,29 @@ xlib_create_brw_winsys( void )
 }
 
 
-struct pipe_screen *
-xlib_create_brw_screen( struct pipe_winsys *winsys )
+static struct pipe_screen *
+xlib_create_brw_screen( void )
 {
-#ifdef GALLIUM_CELL
-   return NULL;
-#else
-   return brw_create_screen(winsys, 0/* XXX pci_id */);
+#ifndef GALLIUM_CELL
+   struct pipe_winsys *winsys;
+   struct pipe_screen *screen;
+
+   winsys = xlib_create_brw_winsys();
+   if (winsys == NULL)
+      return NULL;
+
+   screen = brw_create_screen(winsys, 0/* XXX pci_id */);
+   if (screen == NULL)
+      goto fail;
+
+   return screen;
+
+fail:
+   if (winsys)
+      winsys->destroy( winsys );
+
 #endif
+   return NULL;
 }
 
 
@@ -464,11 +450,19 @@ void xlib_brw_buffer_subdata_typed( struct pipe_winsys *pws,
 }
  
 
-void
+static void
 xlib_brw_display_surface(struct xmesa_buffer *b, 
                          struct pipe_surface *surf)
 {
    brw_aub_dump_bmp( global_winsys->aubfile, 
                     surf,
-                    aub_bo(surf->buffer)->offset );
+                    aub_bo(buffer_from_surface(surf))->offset );
 }
+
+
+struct xm_driver xlib_brw_driver = 
+{
+   .create_pipe_screen = xlib_create_brw_screen,
+   .create_pipe_context = xlib_create_brw_context,
+   .display_surface = xlib_brw_display_surface,
+};