u_linear.c revision ea4bf267e4b023b08043f91ac44592fed1736e7f
1f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
2ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
3f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz#include "u_linear.h"
4f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
5f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantzvoid
66b06a6b929aa742f92653728254255f1867d6210Brian Paulpipe_linear_to_tile(size_t src_stride, const void *src_ptr,
7f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz		    struct pipe_tile_info *t, void *dst_ptr)
8f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz{
9f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   int x, y, z;
10f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   char *ptr;
11f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   size_t bytes = t->cols * t->block.size;
1281374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul   char *dst_ptr2 = (char *) dst_ptr;
13f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
14f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   assert(pipe_linear_check_tile(t));
15f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
16f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   /* lets write lineary to the tiled buffer */
17f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   for (y = 0; y < t->tiles_y; y++) {
18f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      for (x = 0; x < t->tiles_x; x++) {
19f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 /* this inner loop could be replace with SSE magic */
20f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 ptr = (char*)src_ptr + src_stride * t->rows * y + bytes * x;
21f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 for (z = 0; z < t->rows; z++) {
2281374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    memcpy(dst_ptr2, ptr, bytes);
2381374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    dst_ptr2 += bytes;
24f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	    ptr += src_stride;
25f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 }
26f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      }
27f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   }
28f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz}
29f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
306b06a6b929aa742f92653728254255f1867d6210Brian Paulvoid pipe_linear_from_tile(struct pipe_tile_info *t, const void *src_ptr,
31f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz			   size_t dst_stride, void *dst_ptr)
32f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz{
33f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   int x, y, z;
34f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   char *ptr;
35f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   size_t bytes = t->cols * t->block.size;
3681374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul   const char *src_ptr2 = (const char *) src_ptr;
37f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
38f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   /* lets read lineary from the tiled buffer */
39f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   for (y = 0; y < t->tiles_y; y++) {
40f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      for (x = 0; x < t->tiles_x; x++) {
41f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 /* this inner loop could be replace with SSE magic */
42f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 ptr = (char*)dst_ptr + dst_stride * t->rows * y + bytes * x;
43f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 for (z = 0; z < t->rows; z++) {
4481374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    memcpy(ptr, src_ptr2, bytes);
4581374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    src_ptr2 += bytes;
46f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	    ptr += dst_stride;
47f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 }
48f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      }
49f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   }
50f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz}
51f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
52f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantzvoid
53f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantzpipe_linear_fill_info(struct pipe_tile_info *t,
546b06a6b929aa742f92653728254255f1867d6210Brian Paul		      const struct pipe_format_block *block,
55f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz		      unsigned tile_width, unsigned tile_height,
56f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz		      unsigned tiles_x, unsigned tiles_y)
57f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz{
58f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->block = *block;
59f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
60f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tile.width = tile_width;
61f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tile.height = tile_height;
62f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->cols = t->tile.width / t->block.width;
63f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->rows = t->tile.height / t->block.height;
64f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tile.size = t->cols * t->rows * t->block.size;
65f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
66f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tiles_x = tiles_x;
67f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tiles_y = tiles_y;
68f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->stride = t->cols * t->tiles_x * t->block.size;
69f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->size = t->tiles_x * t->tiles_y * t->tile.size;
70f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz}
71