Merge branch 'mesa_7_5_branch'
[mesa.git] / src / gallium / winsys / xlib / xlib_brw_screen.c
index 030cd66bd90932fb5616ab1a634bce2f8d1390b8..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;
 };
@@ -137,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);
 }
@@ -182,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:
@@ -226,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 );
 }
 
 
@@ -250,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 )
 {
@@ -333,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;
@@ -353,6 +323,7 @@ xlib_create_brw_winsys( void )
 static struct pipe_screen *
 xlib_create_brw_screen( void )
 {
+#ifndef GALLIUM_CELL
    struct pipe_winsys *winsys;
    struct pipe_screen *screen;
 
@@ -370,6 +341,7 @@ fail:
    if (winsys)
       winsys->destroy( winsys );
 
+#endif
    return NULL;
 }
 
@@ -484,7 +456,7 @@ xlib_brw_display_surface(struct xmesa_buffer *b,
 {
    brw_aub_dump_bmp( global_winsys->aubfile, 
                     surf,
-                    aub_bo(surf->buffer)->offset );
+                    aub_bo(buffer_from_surface(surf))->offset );
 }