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