OSDN Git Service

gallium: Expose the ability to get a tile outside a surface.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 17 Jul 2008 13:54:14 +0000 (22:54 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 17 Jul 2008 16:20:44 +0000 (01:20 +0900)
src/gallium/auxiliary/util/p_tile.c
src/gallium/auxiliary/util/p_tile.h

index 580a955..1daae6b 100644 (file)
@@ -706,81 +706,92 @@ ycbcr_get_tile_rgba(ushort *src,
 
 
 void
-pipe_get_tile_rgba(struct pipe_surface *ps,
-                   uint x, uint y, uint w, uint h,
-                   float *p)
+pipe_tile_raw_to_rgba(enum pipe_format format,
+                      void *src,
+                      uint w, uint h,
+                      float *dst, unsigned dst_stride)
 {
-   unsigned dst_stride = w * 4;
-   void *packed;
-
-   if (pipe_clip_tile(x, y, &w, &h, ps))
-      return;
-
-   packed = MALLOC(pf_get_nblocks(&ps->block, w, h) * ps->block.size);
-
-   if (!packed)
-      return;
-
-   pipe_get_tile_raw(ps, x, y, w, h, packed, 0);
-
-   switch (ps->format) {
+   switch (format) {
    case PIPE_FORMAT_A8R8G8B8_UNORM:
-      a8r8g8b8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);
+      a8r8g8b8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_X8R8G8B8_UNORM:
-      x8r8g8b8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);
+      x8r8g8b8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_B8G8R8A8_UNORM:
-      b8g8r8a8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);
+      b8g8r8a8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_A1R5G5B5_UNORM:
-      a1r5g5b5_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);
+      a1r5g5b5_get_tile_rgba((ushort *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_A4R4G4B4_UNORM:
-      a4r4g4b4_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);
+      a4r4g4b4_get_tile_rgba((ushort *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_R5G6B5_UNORM:
-      r5g6b5_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);
+      r5g6b5_get_tile_rgba((ushort *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_L8_UNORM:
-      l8_get_tile_rgba((ubyte *) packed, w, h, p, dst_stride);
+      l8_get_tile_rgba((ubyte *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_A8_UNORM:
-      a8_get_tile_rgba((ubyte *) packed, w, h, p, dst_stride);
+      a8_get_tile_rgba((ubyte *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_I8_UNORM:
-      i8_get_tile_rgba((ubyte *) packed, w, h, p, dst_stride);
+      i8_get_tile_rgba((ubyte *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_A8L8_UNORM:
-      a8_l8_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);
+      a8_l8_get_tile_rgba((ushort *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_R16G16B16A16_SNORM:
-      r16g16b16a16_get_tile_rgba((short *) packed, w, h, p, dst_stride);
+      r16g16b16a16_get_tile_rgba((short *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_Z16_UNORM:
-      z16_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);
+      z16_get_tile_rgba((ushort *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_Z32_UNORM:
-      z32_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);
+      z32_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_S8Z24_UNORM:
    case PIPE_FORMAT_X8Z24_UNORM:
-      s8z24_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);
+      s8z24_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_Z24S8_UNORM:
-      z24s8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);
+      z24s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
       break;
    case PIPE_FORMAT_YCBCR:
-      assert((x & 1) == 0);
-      ycbcr_get_tile_rgba((ushort *) packed, w, h, p, dst_stride, FALSE);
+      ycbcr_get_tile_rgba((ushort *) src, w, h, dst, dst_stride, FALSE);
       break;
    case PIPE_FORMAT_YCBCR_REV:
-      assert((x & 1) == 0);
-      ycbcr_get_tile_rgba((ushort *) packed, w, h, p, dst_stride, TRUE);
+      ycbcr_get_tile_rgba((ushort *) src, w, h, dst, dst_stride, TRUE);
       break;
    default:
       assert(0);
    }
+}
+
+
+void
+pipe_get_tile_rgba(struct pipe_surface *ps,
+                   uint x, uint y, uint w, uint h,
+                   float *p)
+{
+   unsigned dst_stride = w * 4;
+   void *packed;
+
+   if (pipe_clip_tile(x, y, &w, &h, ps))
+      return;
+
+   packed = MALLOC(pf_get_nblocks(&ps->block, w, h) * ps->block.size);
+
+   if (!packed)
+      return;
+
+   if(ps->format == PIPE_FORMAT_YCBCR || ps->format == PIPE_FORMAT_YCBCR_REV)
+      assert((x & 1) == 0);
+
+   pipe_get_tile_raw(ps, x, y, w, h, packed, 0);
+
+   pipe_tile_raw_to_rgba(ps->format, packed, w, h, p, dst_stride);
 
    FREE(packed);
 }
index adfec8b..a8ac805 100644 (file)
@@ -87,6 +87,13 @@ pipe_put_tile_z(struct pipe_surface *ps,
                 uint x, uint y, uint w, uint h,
                 const uint *z);
 
+void
+pipe_tile_raw_to_rgba(enum pipe_format format,
+                      void *src,
+                      uint w, uint h,
+                      float *dst, unsigned dst_stride);
+
+
 #ifdef __cplusplus
 }
 #endif