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