1c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul/**************************************************************************
2c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul *
3c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * Copyright 2009 VMware, Inc.
4c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * All Rights Reserved.
5c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul *
6c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
7c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * copy of this software and associated documentation files (the
8c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * "Software"), to deal in the Software without restriction, including
9c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * without limitation the rights to use, copy, modify, merge, publish,
10c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * distribute, sub license, and/or sell copies of the Software, and to
11c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * permit persons to whom the Software is furnished to do so, subject to
12c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * the following conditions:
13c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul *
14c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * The above copyright notice and this permission notice (including the
15c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * next paragraph) shall be included in all copies or substantial portions
16c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * of the Software.
17c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul *
18c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul *
26c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul **************************************************************************/
27c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul
28c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul/**
29c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul * Functions for converting tiled data to linear and vice versa.
30c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul */
31c5a97eda32d37de7d1154288bf4298dff3542551Brian Paul
32f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
33ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
34f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz#include "u_linear.h"
35f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
36f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantzvoid
376b06a6b929aa742f92653728254255f1867d6210Brian Paulpipe_linear_to_tile(size_t src_stride, const void *src_ptr,
38f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz		    struct pipe_tile_info *t, void *dst_ptr)
39f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz{
40f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   int x, y, z;
41f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   char *ptr;
42f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   size_t bytes = t->cols * t->block.size;
4381374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul   char *dst_ptr2 = (char *) dst_ptr;
44f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
45f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   assert(pipe_linear_check_tile(t));
46f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
47f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   /* lets write lineary to the tiled buffer */
48f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   for (y = 0; y < t->tiles_y; y++) {
49f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      for (x = 0; x < t->tiles_x; x++) {
50f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 /* this inner loop could be replace with SSE magic */
51f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 ptr = (char*)src_ptr + src_stride * t->rows * y + bytes * x;
52f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 for (z = 0; z < t->rows; z++) {
5381374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    memcpy(dst_ptr2, ptr, bytes);
5481374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    dst_ptr2 += bytes;
55f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	    ptr += src_stride;
56f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 }
57f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      }
58f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   }
59f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz}
60f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
616b06a6b929aa742f92653728254255f1867d6210Brian Paulvoid pipe_linear_from_tile(struct pipe_tile_info *t, const void *src_ptr,
62f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz			   size_t dst_stride, void *dst_ptr)
63f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz{
64f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   int x, y, z;
65f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   char *ptr;
66f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   size_t bytes = t->cols * t->block.size;
6781374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul   const char *src_ptr2 = (const char *) src_ptr;
68f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
69f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   /* lets read lineary from the tiled buffer */
70f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   for (y = 0; y < t->tiles_y; y++) {
71f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      for (x = 0; x < t->tiles_x; x++) {
72f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 /* this inner loop could be replace with SSE magic */
73f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 ptr = (char*)dst_ptr + dst_stride * t->rows * y + bytes * x;
74f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 for (z = 0; z < t->rows; z++) {
7581374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    memcpy(ptr, src_ptr2, bytes);
7681374d1ebed16aa3eed336295e80be0dfebfad75Brian Paul	    src_ptr2 += bytes;
77f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	    ptr += dst_stride;
78f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz	 }
79f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz      }
80f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   }
81f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz}
82f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
83f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantzvoid
84f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantzpipe_linear_fill_info(struct pipe_tile_info *t,
85ac400ffce62be47fc77e8d10cabcd39b92b6c627Roland Scheidegger		      const struct u_linear_format_block *block,
86f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz		      unsigned tile_width, unsigned tile_height,
87f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz		      unsigned tiles_x, unsigned tiles_y)
88f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz{
89f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->block = *block;
90f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
91f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tile.width = tile_width;
92f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tile.height = tile_height;
93f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->cols = t->tile.width / t->block.width;
94f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->rows = t->tile.height / t->block.height;
95f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tile.size = t->cols * t->rows * t->block.size;
96f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz
97f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tiles_x = tiles_x;
98f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->tiles_y = tiles_y;
99f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->stride = t->cols * t->tiles_x * t->block.size;
100f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz   t->size = t->tiles_x * t->tiles_y * t->tile.size;
101f0e3366b0860047632bec59c8ee815670cfb2d25Jakob Bornecrantz}
102