texenvprogram: fix for ARB_draw_buffers.
[mesa.git] / src / gallium / winsys / drm / i965 / xlib / xlib_i965.c
index f46d9961c6e0d60085b15bb9dbfb5759a8580ad3..74501eeb16f7e87af4de21e50fd535f65c835e27 100644 (file)
@@ -47,6 +47,8 @@
 
 #define MAX_VRAM (128*1024*1024)
 
+
+
 extern int brw_disasm (FILE *file, 
                        const struct brw_instruction *inst,
                        unsigned count );
@@ -142,6 +144,8 @@ const char *data_types[BRW_DATA_MAX] =
    "GS: CLIP_PROG",
    "SS: SURFACE",
    "SS: SURF_BIND",
+   "CONSTANT DATA",
+   "BATCH DATA",
    "(untyped)"
 };
 
@@ -156,8 +160,9 @@ xlib_brw_bo_alloc( struct brw_winsys_screen *sws,
    struct xlib_brw_winsys *xbw = xlib_brw_winsys(sws);
    struct xlib_brw_buffer *buf;
 
-   debug_printf("%s type %s sz %d align %d\n",
-                __FUNCTION__, names[type], size, alignment );
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s type %s sz %d align %d\n",
+                   __FUNCTION__, names[type], size, alignment );
 
    buf = CALLOC_STRUCT(xlib_brw_buffer);
    if (!buf)
@@ -205,10 +210,11 @@ xlib_brw_bo_emit_reloc( struct brw_winsys_buffer *buffer,
    struct xlib_brw_buffer *buf = xlib_brw_buffer(buffer);
    struct xlib_brw_buffer *buf2 = xlib_brw_buffer(buffer2);
 
-   debug_printf("%s buf %p offset %x val %x + %x buf2 %p/%s/%s\n",
-                __FUNCTION__, (void *)buffer, offset,
-                buf2->offset, delta,
-                (void *)buffer2, names[buf2->type], usages[usage]);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s buf %p offset %x val %x + %x buf2 %p/%s/%s\n",
+                   __FUNCTION__, (void *)buffer, offset,
+                   buf2->offset, delta,
+                   (void *)buffer2, names[buf2->type], usages[usage]);
 
    *(uint32_t *)(buf->virtual + offset) = buf2->offset + delta;
 
@@ -219,74 +225,13 @@ static int
 xlib_brw_bo_exec( struct brw_winsys_buffer *buffer,
                     unsigned bytes_used )
 {
-   debug_printf("execute buffer %p, bytes %d\n", (void *)buffer, bytes_used);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("execute buffer %p, bytes %d\n", (void *)buffer, bytes_used);
 
    return 0;
 }
 
-static void dump_data( struct xlib_brw_winsys *xbw,
-                       enum brw_buffer_data_type data_type,
-                       const void *data,
-                       size_t size )
-{
-   switch (data_type) {
-   case BRW_DATA_GS_CC_VP:
-      brw_dump_cc_viewport( data );
-      break;
-   case BRW_DATA_GS_CC_UNIT:
-      brw_dump_cc_unit_state( data );
-      break;
-   case BRW_DATA_GS_WM_PROG:
-   case BRW_DATA_GS_SF_PROG:
-   case BRW_DATA_GS_VS_PROG:
-   case BRW_DATA_GS_GS_PROG:
-   case BRW_DATA_GS_CLIP_PROG:
-      brw_disasm( stderr, data, size / sizeof(struct brw_instruction) );
-      break;
-   case BRW_DATA_GS_SAMPLER_DEFAULT_COLOR:
-      brw_dump_sampler_default_color( data );
-      break;
-   case BRW_DATA_GS_SAMPLER:
-      brw_dump_sampler_state( data );
-      break;
-   case BRW_DATA_GS_WM_UNIT:
-      brw_dump_wm_unit_state( data );
-      break;
-   case BRW_DATA_GS_SF_VP:
-      brw_dump_sf_viewport( data );
-      break;
-   case BRW_DATA_GS_SF_UNIT:
-      brw_dump_sf_unit_state( data );
-      break;
-   case BRW_DATA_GS_VS_UNIT:
-      brw_dump_vs_unit_state( data );
-      break;
-   case BRW_DATA_GS_GS_UNIT:
-      brw_dump_gs_unit_state( data );
-      break;
-   case BRW_DATA_GS_CLIP_VP:
-      brw_dump_clipper_viewport( data );
-      break;
-   case BRW_DATA_GS_CLIP_UNIT:
-      brw_dump_clip_unit_state( data );
-      break;
-   case BRW_DATA_SS_SURFACE:
-      brw_dump_surface_state( data );
-      break;
-   case BRW_DATA_SS_SURF_BIND:
-      break;
-   case BRW_DATA_OTHER:
-      break;
-   case BRW_DATA_BATCH_BUFFER:
-      intel_decode(data, size / 4, 0, xbw->chipset.pci_id);
-      break;
-   case BRW_DATA_CONSTANT_BUFFER:
-      break;
-   default:
-      assert(0);
-      break;
-   }
-}
+
 
 
 static int
@@ -294,21 +239,42 @@ xlib_brw_bo_subdata(struct brw_winsys_buffer *buffer,
                     enum brw_buffer_data_type data_type,
                     size_t offset,
                     size_t size,
-                    const void *data)
+                    const void *data,
+                    const struct brw_winsys_reloc *reloc,
+                    unsigned nr_relocs)
 {
    struct xlib_brw_buffer *buf = xlib_brw_buffer(buffer);
    struct xlib_brw_winsys *xbw = xlib_brw_winsys(buffer->sws);
+   unsigned i;
 
-   debug_printf("%s buf %p off %d sz %d %s\n", 
-                __FUNCTION__
-                (void *)buffer, offset, size, data_types[data_type]);
-
-   if (1)
-      dump_data( xbw, data_type, data, size );
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s buf %p off %d sz %d %s relocs: %d\n"
+                   __FUNCTION__, 
+                   (void *)buffer, offset, size, 
+                   data_types[data_type],
+                   nr_relocs);
 
    assert(buf->base.size >= offset + size);
    memcpy(buf->virtual + offset, data, size);
 
+   /* Apply the relocations:
+    */
+   for (i = 0; i < nr_relocs; i++) {
+      if (BRW_DEBUG & DEBUG_WINSYS)
+         debug_printf("\treloc[%d] usage %s off %d value %x+%x\n", 
+                      i, usages[reloc[i].usage], reloc[i].offset,
+                      xlib_brw_buffer(reloc[i].bo)->offset, reloc[i].delta);
+
+      *(unsigned *)(buf->virtual + offset + reloc[i].offset) = 
+         xlib_brw_buffer(reloc[i].bo)->offset + reloc[i].delta;
+   }
+
+   if (BRW_DUMP)
+      brw_dump_data( xbw->chipset.pci_id,
+                    data_type,
+                    buf->offset + offset, 
+                    buf->virtual + offset, size );
+
 
    return 0;
 }
@@ -317,7 +283,8 @@ xlib_brw_bo_subdata(struct brw_winsys_buffer *buffer,
 static boolean 
 xlib_brw_bo_is_busy(struct brw_winsys_buffer *buffer)
 {
-   debug_printf("%s %p\n", __FUNCTION__, (void *)buffer);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s %p\n", __FUNCTION__, (void *)buffer);
    return TRUE;
 }
 
@@ -325,7 +292,8 @@ static boolean
 xlib_brw_bo_references(struct brw_winsys_buffer *a,
                          struct brw_winsys_buffer *b)
 {
-   debug_printf("%s %p %p\n", __FUNCTION__, (void *)a, (void *)b);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s %p %p\n", __FUNCTION__, (void *)a, (void *)b);
    return TRUE;
 }
 
@@ -340,9 +308,10 @@ xlib_brw_check_aperture_space( struct brw_winsys_screen *iws,
    for (i = 0; i < count; i++)
       tot_size += buffers[i]->size;
 
-   debug_printf("%s %d bufs, tot_size: %d kb\n", 
-                __FUNCTION__, count, 
-                (tot_size + 1023) / 1024);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s %d bufs, tot_size: %d kb\n", 
+                   __FUNCTION__, count, 
+                   (tot_size + 1023) / 1024);
 
    return PIPE_OK;
 }
@@ -350,13 +319,18 @@ xlib_brw_check_aperture_space( struct brw_winsys_screen *iws,
 static void *
 xlib_brw_bo_map(struct brw_winsys_buffer *buffer,
                 enum brw_buffer_data_type data_type,
-                boolean write)
+                unsigned offset,
+                unsigned length,
+                boolean write,
+                boolean discard,
+                boolean explicit)
 {
    struct xlib_brw_buffer *buf = xlib_brw_buffer(buffer);
 
-   debug_printf("%s %p %s %s\n", __FUNCTION__, (void *)buffer, 
-                write ? "read/write" : "read",
-                write ? data_types[data_type] : "");
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s %p %s %s\n", __FUNCTION__, (void *)buffer, 
+                   write ? "read/write" : "read",
+                   write ? data_types[data_type] : "");
 
    if (write)
       buf->modified = 1;
@@ -365,12 +339,22 @@ xlib_brw_bo_map(struct brw_winsys_buffer *buffer,
    return buf->virtual;
 }
 
+
+static void
+xlib_brw_bo_flush_range( struct brw_winsys_buffer *buffer,
+                         unsigned offset,
+                         unsigned length )
+{
+}
+
+
 static void 
 xlib_brw_bo_unmap(struct brw_winsys_buffer *buffer)
 {
    struct xlib_brw_buffer *buf = xlib_brw_buffer(buffer);
 
-   debug_printf("%s %p\n", __FUNCTION__, (void *)buffer);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s %p\n", __FUNCTION__, (void *)buffer);
 
    --buf->map_count;
    assert(buf->map_count >= 0);
@@ -380,7 +364,8 @@ xlib_brw_bo_unmap(struct brw_winsys_buffer *buffer)
 
       buf->modified = 0;
       
-      /* Consider dumping new buffer contents here.
+      /* Consider dumping new buffer contents here, using the
+       * flush-range info to minimize verbosity.
        */
    }
 }
@@ -421,6 +406,7 @@ xlib_create_brw_winsys_screen( void )
    ws->base.bo_references        = xlib_brw_bo_references;
    ws->base.check_aperture_space = xlib_brw_check_aperture_space;
    ws->base.bo_map               = xlib_brw_bo_map;
+   ws->base.bo_flush_range       = xlib_brw_bo_flush_range;
    ws->base.bo_unmap             = xlib_brw_bo_unmap;
    ws->base.bo_wait_idle         = xlib_brw_bo_wait_idle;
 
@@ -439,11 +425,12 @@ xlib_i965_display_surface(struct xmesa_buffer *xm_buffer,
    struct brw_surface *surface = brw_surface(surf);
    struct xlib_brw_buffer *bo = xlib_brw_buffer(surface->bo);
 
-   debug_printf("%s offset %x+%x sz %dx%d\n", __FUNCTION__, 
-                bo->offset,
-                surface->draw_offset,
-                surf->width,
-                surf->height);
+   if (BRW_DEBUG & DEBUG_WINSYS)
+      debug_printf("%s offset %x+%x sz %dx%d\n", __FUNCTION__, 
+                   bo->offset,
+                   surface->draw_offset,
+                   surf->width,
+                   surf->height);
 }
 
 static void
@@ -482,31 +469,12 @@ fail:
 }
 
 
-static struct pipe_context *
-xlib_create_i965_context( struct pipe_screen *screen,
-                          void *context_private )
-{
-   struct pipe_context *pipe;
-   
-   pipe = brw_create_context(screen);
-   if (pipe == NULL)
-      goto fail;
-
-   pipe->priv = context_private;
-   return pipe;
-
-fail:
-   /* Free stuff here */
-   return NULL;
-}
-
 
 
 
 struct xm_driver xlib_i965_driver = 
 {
    .create_pipe_screen = xlib_create_i965_screen,
-   .create_pipe_context = xlib_create_i965_context,
    .display_surface = xlib_i965_display_surface
 };