cell: Update for cpp removal.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Fri, 27 Jun 2008 11:10:04 +0000 (20:10 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Fri, 27 Jun 2008 11:10:04 +0000 (20:10 +0900)
Not tested -- just mymic the softpipe changes.

src/gallium/drivers/cell/ppu/cell_surface.c
src/gallium/drivers/cell/ppu/cell_texture.c

index 18f37919241c5b1ad89b2b087e7494f92cfb53f1..5549eb496d8470c3d892ad7088683d476652d6c1 100644 (file)
 #include "cell_surface.h"
 
 
-/* Upload data to a rectangular sub-region.  Lots of choices how to do this:
- *
- * - memcpy by span to current destination
- * - upload data as new buffer and blit
- *
- * Currently always memcpy.
- */
-static void
-cell_surface_data(struct pipe_context *pipe,
-                  struct pipe_surface *dst,
-                  unsigned dstx, unsigned dsty,
-                  const void *src, unsigned src_pitch,
-                  unsigned srcx, unsigned srcy,
-                  unsigned width, unsigned height)
-{
-   pipe_copy_rect(pipe_surface_map(dst),
-                  dst->cpp,
-                  dst->pitch,
-                  dstx, dsty, width, height, src, src_pitch, srcx, srcy);
-
-   pipe_surface_unmap(dst);
-}
-
-
 static void
 cell_surface_copy(struct pipe_context *pipe,
                   boolean do_flip,
@@ -70,12 +46,12 @@ cell_surface_copy(struct pipe_context *pipe,
    assert( dst->cpp == src->cpp );
 
    pipe_copy_rect(pipe_surface_map(dst),
-                  dst->cpp,
-                  dst->pitch,
+                  &dst->block,
+                  dst->stride,
                   dstx, dsty,
                   width, height,
                   pipe_surface_map(src),
-                  do_flip ? -src->pitch : src->pitch,
+                  do_flip ? -src->stride : src->stride,
                   srcx, do_flip ? height - 1 - srcy : srcy);
 
    pipe_surface_unmap(src);
@@ -86,7 +62,7 @@ cell_surface_copy(struct pipe_context *pipe,
 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;
+   return (char *)dst_map + y / dst->block.height * dst->stride + x / dst->block.width * dst->block.size;
 }
 
 
@@ -106,38 +82,13 @@ cell_surface_fill(struct pipe_context *pipe,
    unsigned i, j;
    void *dst_map = pipe_surface_map(dst);
 
-   assert(dst->pitch > 0);
-   assert(width <= dst->pitch);
+   assert(dst->stride > 0);
 
-   switch (dst->cpp) {
+   switch (dst->block.size) {
    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;
-         }
-      }
+      pipe_fill_rect(dst_map, &dst->block, dst->stride, dstx, dsty, width, height, value);
       break;
    case 8:
       {
@@ -158,7 +109,7 @@ cell_surface_fill(struct pipe_context *pipe,
                row[j*4+2] = val2;
                row[j*4+3] = val3;
             }
-            row += dst->pitch * 4;
+            row += dst->stride/2;
          }
       }
       break;
index 07717da8f6aee76e5340c1782e06c0cbaa1bbd0e..533b64227d6c9f639c394cf2f68fdc625138457c 100644 (file)
@@ -65,12 +65,14 @@ cell_texture_layout(struct cell_texture * spt)
       pt->width[level] = width;
       pt->height[level] = height;
       pt->depth[level] = depth;
+      pt->nblocksx[level] = pf_get_nblocksx(&pt->block, width);  
+      pt->nblocksy[level] = pf_get_nblocksy(&pt->block, height);  
 
       spt->level_offset[level] = spt->buffer_size;
 
-      spt->buffer_size += ((pt->compressed) ? MAX2(1, height/4) : height) *
+      spt->buffer_size += (pt->nblocksy[level] *
                          ((pt->target == PIPE_TEXTURE_CUBE) ? 6 : depth) *
-                         width * pt->cpp;
+                         pt->nblocksx[level] * pt->block.size;
 
       width  = minify(width);
       height = minify(height);
@@ -157,16 +159,18 @@ cell_get_tex_surface_screen(struct pipe_screen *screen,
       assert(ps->winsys);
       pipe_buffer_reference(ws, &ps->buffer, spt->buffer);
       ps->format = pt->format;
-      ps->cpp = pt->cpp;
+      ps->block = pt->block;
       ps->width = pt->width[level];
       ps->height = pt->height[level];
-      ps->pitch = ps->width;
+      ps->nblocksx = pt->nblocksx[level];
+      ps->nblocksy = pt->nblocksy[level];
+      ps->stride = spt->stride[level];
       ps->offset = spt->level_offset[level];
 
       if (pt->target == PIPE_TEXTURE_CUBE || pt->target == PIPE_TEXTURE_3D) {
         ps->offset += ((pt->target == PIPE_TEXTURE_CUBE) ? face : zslice) *
-                      (pt->compressed ? ps->height/4 : ps->height) *
-                      ps->width * ps->cpp;
+                      ps->nblocksy *
+                      ps->stride;
       } else {
         assert(face == 0);
         assert(zslice == 0);