Merge branch 'gallium-wgl-rework' into gallium-0.2
[mesa.git] / src / gallium / drivers / i915simple / i915_surface.c
index 17fd27895a27d7943de34cb054895260eacefdf1..5ffdb76682c56aeb3ced0596587d8a1a5e5077eb 100644 (file)
 #include "i915_state.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_inlines.h"
-#include "pipe/p_util.h"
 #include "pipe/p_inlines.h"
-#include "pipe/p_winsys.h"
-#include "util/p_tile.h"
-
-
-/*
- * XXX note: same as code in sp_surface.c
- */
-static struct pipe_surface *
-i915_get_tex_surface(struct pipe_context *pipe,
-                     struct pipe_texture *pt,
-                     unsigned face, unsigned level, unsigned zslice)
-{
-   struct i915_texture *tex = (struct i915_texture *)pt;
-   struct pipe_surface *ps;
-   unsigned offset;  /* in bytes */
-
-   offset = tex->level_offset[level];
-
-   if (pt->target == PIPE_TEXTURE_CUBE) {
-      offset += tex->image_offset[level][face] * pt->cpp;
-   }
-   else if (pt->target == PIPE_TEXTURE_3D) {
-      offset += tex->image_offset[level][zslice] * pt->cpp;
-   }
-   else {
-      assert(face == 0);
-      assert(zslice == 0);
-   }
-
-   ps = pipe->winsys->surface_alloc(pipe->winsys);
-   if (ps) {
-      assert(ps->refcount);
-      assert(ps->winsys);
-      pipe_buffer_reference(pipe->winsys, &ps->buffer, tex->buffer);
-      ps->format = pt->format;
-      ps->cpp = pt->cpp;
-      ps->width = pt->width[level];
-      ps->height = pt->height[level];
-      ps->pitch = tex->pitch;
-      ps->offset = offset;
-   }
-   return ps;
-}
-
+#include "pipe/internal/p_winsys_screen.h"
+#include "util/u_tile.h"
+#include "util/u_rect.h"
 
 
 /* Assumes all values are within bounds -- no checking at this level -
@@ -83,47 +41,50 @@ i915_get_tex_surface(struct pipe_context *pipe,
  */
 static void
 i915_surface_copy(struct pipe_context *pipe,
-                  unsigned do_flip,
+                  boolean do_flip,
                  struct pipe_surface *dst,
                  unsigned dstx, unsigned dsty,
                  struct pipe_surface *src,
                  unsigned srcx, unsigned srcy, unsigned width, unsigned height)
 {
    assert( dst != src );
-   assert( dst->cpp == src->cpp );
+   assert( dst->block.size == src->block.size );
+   assert( dst->block.width == src->block.height );
+   assert( dst->block.height == src->block.height );
 
    if (0) {
-      pipe_copy_rect(pipe_surface_map(dst),
-                     dst->cpp,
-                     dst->pitch,
-                     dstx, dsty, 
-                     width, height, 
-                     pipe_surface_map(src), 
-                     do_flip ? -(int) src->pitch : src->pitch, 
-                     srcx, do_flip ? 1 - srcy - height : srcy);
-
-      pipe_surface_unmap(src);
-      pipe_surface_unmap(dst);
+      void *dst_map = pipe->screen->surface_map( pipe->screen,
+                                                 dst,
+                                                 PIPE_BUFFER_USAGE_CPU_WRITE );
+      
+      const void *src_map = pipe->screen->surface_map( pipe->screen,
+                                                       src,
+                                                       PIPE_BUFFER_USAGE_CPU_READ );
+      
+      pipe_copy_rect(dst_map,
+                     &dst->block,
+                     dst->stride,
+                     dstx, dsty,
+                     width, height,
+                     src_map,
+                     do_flip ? -(int) src->stride : src->stride,
+                     srcx, do_flip ? height - 1 - srcy : srcy);
+
+      pipe->screen->surface_unmap(pipe->screen, src);
+      pipe->screen->surface_unmap(pipe->screen, dst);
    }
    else {
+      assert(dst->block.width == 1);
+      assert(dst->block.height == 1);
       i915_copy_blit( i915_context(pipe),
                       do_flip,
-                     dst->cpp,
-                     (short) src->pitch, src->buffer, src->offset,
-                     (short) dst->pitch, dst->buffer, dst->offset,
+                      dst->block.size,
+                     (unsigned short) src->stride, src->buffer, src->offset,
+                     (unsigned short) dst->stride, dst->buffer, dst->offset,
                      (short) srcx, (short) srcy, (short) dstx, (short) dsty, (short) width, (short) height );
    }
 }
 
-/* Fill a rectangular sub-region.  Need better logic about when to
- * push buffers into AGP - will currently do so whenever possible.
- */
-static void *
-get_pointer(struct pipe_surface *dst, void *dst_map, unsigned x, unsigned y)
-{
-   return (char *)dst_map + (y * dst->pitch + x) * dst->cpp;
-}
-
 
 static void
 i915_surface_fill(struct pipe_context *pipe,
@@ -132,50 +93,23 @@ i915_surface_fill(struct pipe_context *pipe,
                  unsigned width, unsigned height, unsigned value)
 {
    if (0) {
-      unsigned i, j;
-      void *dst_map = pipe_surface_map(dst);
+      void *dst_map = pipe->screen->surface_map( pipe->screen,
+                                                 dst,
+                                                 PIPE_BUFFER_USAGE_CPU_WRITE );
 
-      switch (dst->cpp) {
-      case 1: {
-        ubyte *row = get_pointer(dst, dst_map, dstx, dsty);
-        for (i = 0; i < height; i++) {
-           memset(row, value, width);
-           row += dst->pitch;
-        }
-      }
-        break;
-      case 2: {
-        ushort *row = get_pointer(dst, dst_map, dstx, dsty);
-        for (i = 0; i < height; i++) {
-           for (j = 0; j < width; j++)
-              row[j] = (ushort) value;
-           row += dst->pitch;
-        }
-      }
-        break;
-      case 4: {
-        unsigned *row = get_pointer(dst, dst_map, dstx, dsty);
-        for (i = 0; i < height; i++) {
-           for (j = 0; j < width; j++)
-              row[j] = value;
-           row += dst->pitch;
-        }
-      }
-        break;
-      default:
-        assert(0);
-        break;
-      }
+      pipe_fill_rect(dst_map, &dst->block, dst->stride, dstx, dsty, width, height, value);
 
-      pipe_surface_unmap( dst );
+      pipe->screen->surface_unmap(pipe->screen, dst);
    }
    else {
+      assert(dst->block.width == 1);
+      assert(dst->block.height == 1);
       i915_fill_blit( i915_context(pipe),
-                     dst->cpp,
-                     (short) dst->pitch, 
+                     dst->block.size,
+                     (unsigned short) dst->stride,
                      dst->buffer, dst->offset,
-                     (short) dstx, (short) dsty, 
-                     (short) width, (short) height, 
+                     (short) dstx, (short) dsty,
+                     (short) width, (short) height,
                      value );
    }
 }
@@ -184,8 +118,6 @@ i915_surface_fill(struct pipe_context *pipe,
 void
 i915_init_surface_functions(struct i915_context *i915)
 {
-   i915->pipe.get_tex_surface = i915_get_tex_surface;
-
    i915->pipe.surface_copy = i915_surface_copy;
    i915->pipe.surface_fill = i915_surface_fill;
 }