summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/llvmpipe/lp_texture.c
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2010-04-19 14:43:22 -0600
committerBrian Paul <brianp@vmware.com>2010-04-19 17:07:25 -0600
commitee7cf9d80ff962e714bc66487f621e03f21e1293 (patch)
treeaf23e8ff598091c461d857de71e3b5592ab3d98a /src/gallium/drivers/llvmpipe/lp_texture.c
parent254dd0c23f53d535fb612746885fea8c0d4c21cd (diff)
llvmpipe: checkpoint: fixes for render to 3D texture
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_texture.c')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_texture.c114
1 files changed, 62 insertions, 52 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c
index 41f028a238..fd2d5b0a13 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.c
+++ b/src/gallium/drivers/llvmpipe/lp_texture.c
@@ -117,7 +117,7 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen,
lpr->tiles_per_row[level] = align(width, TILE_SIZE) / TILE_SIZE;
for (face = 0; face < num_faces; face++) {
- lpr->layout[face][level] = alloc_layout_array(width, height);
+ lpr->layout[level][face] = alloc_layout_array(width, height);
}
width = u_minify(width, 1);
@@ -250,8 +250,8 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen,
/* free layout flag arrays */
for (level = 0; level < Elements(lpr->tiled); level++) {
for (face = 0; face < num_faces; face++) {
- free(lpr->layout[face][level]);
- lpr->layout[face][level] = NULL;
+ free(lpr->layout[level][face]);
+ lpr->layout[level][face] = NULL;
}
}
}
@@ -798,6 +798,32 @@ llvmpipe_get_texture_image_address(struct llvmpipe_resource *lpr,
}
+static INLINE enum lp_texture_layout
+llvmpipe_get_texture_tile_layout(const struct llvmpipe_resource *lpr,
+ unsigned face_slice, unsigned level,
+ unsigned x, unsigned y)
+{
+ uint i;
+ assert(resource_is_texture(&lpr->base));
+ assert(x < lpr->tiles_per_row[level]);
+ i = y * lpr->tiles_per_row[level] + x;
+ return lpr->layout[level][face_slice][i];
+}
+
+
+static INLINE void
+llvmpipe_set_texture_tile_layout(struct llvmpipe_resource *lpr,
+ unsigned face_slice, unsigned level,
+ unsigned x, unsigned y,
+ enum lp_texture_layout layout)
+{
+ uint i;
+ assert(resource_is_texture(&lpr->base));
+ assert(x < lpr->tiles_per_row[level]);
+ i = y * lpr->tiles_per_row[level] + x;
+ lpr->layout[level][face_slice][i] = layout;
+}
+
/**
* Return pointer to texture image data (either linear or tiled layout).
@@ -806,7 +832,7 @@ llvmpipe_get_texture_image_address(struct llvmpipe_resource *lpr,
*/
void *
llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
- unsigned face, unsigned level,
+ unsigned face_slice, unsigned level,
enum lp_texture_usage usage,
enum lp_texture_layout layout)
{
@@ -870,8 +896,15 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
target_data = target_img->data;
}
- if (face > 0) {
- unsigned offset = face * tex_image_face_size(lpr, level, layout);
+ if (face_slice > 0) {
+ unsigned offset;
+ if (layout == LP_TEX_LAYOUT_LINEAR)
+ offset = tex_image_face_size(lpr, level, LP_TEX_LAYOUT_LINEAR);
+ else
+ offset = tex_image_face_size(lpr, level, LP_TEX_LAYOUT_TILED);
+
+ offset *= face_slice;
+
if (target_data) {
target_data = (uint8_t *) target_data + offset;
}
@@ -890,12 +923,13 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
if (other_data) {
/* may need to convert other data to the requested layout */
enum lp_texture_layout new_layout;
- unsigned x, y, i = 0;
+ unsigned x, y;
/* loop over all image tiles, doing layout conversion where needed */
for (y = 0; y < height_t; y++) {
for (x = 0; x < width_t; x++) {
- enum lp_texture_layout cur_layout = lpr->layout[face][level][i];
+ enum lp_texture_layout cur_layout =
+ llvmpipe_get_texture_tile_layout(lpr, face_slice, level, x, y);
boolean convert;
layout_logic(cur_layout, layout, usage, &new_layout, &convert);
@@ -917,16 +951,19 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
}
}
- lpr->layout[face][level][i] = new_layout;
- i++;
+ llvmpipe_set_texture_tile_layout(lpr, face_slice, level, x, y,
+ new_layout);
}
}
}
else {
/* no other data */
- unsigned i;
- for (i = 0; i < width_t * height_t; i++) {
- lpr->layout[face][level][i] = layout;
+ unsigned x, y;
+ for (y = 0; y < height_t; y++) {
+ for (x = 0; x < width_t; x++) {
+ llvmpipe_set_texture_tile_layout(lpr, face_slice, level,
+ x, y, layout);
+ }
}
}
@@ -936,33 +973,6 @@ llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
}
-static INLINE enum lp_texture_layout
-llvmpipe_get_texture_tile_layout(const struct llvmpipe_resource *lpr,
- unsigned face, unsigned level,
- unsigned x, unsigned y)
-{
- uint i;
- assert(resource_is_texture(&lpr->base));
- assert(x < lpr->tiles_per_row[level]);
- i = y * lpr->tiles_per_row[level] + x;
- return lpr->layout[face][level][i];
-}
-
-
-static INLINE void
-llvmpipe_set_texture_tile_layout(struct llvmpipe_resource *lpr,
- unsigned face, unsigned level,
- unsigned x, unsigned y,
- enum lp_texture_layout layout)
-{
- uint i;
- assert(resource_is_texture(&lpr->base));
- assert(x < lpr->tiles_per_row[level]);
- i = y * lpr->tiles_per_row[level] + x;
- lpr->layout[face][level][i] = layout;
-}
-
-
/**
* Get pointer to a linear image where the tile at (x,y) is known to be
* in linear layout.
@@ -971,7 +981,7 @@ llvmpipe_set_texture_tile_layout(struct llvmpipe_resource *lpr,
*/
ubyte *
llvmpipe_get_texture_tile_linear(struct llvmpipe_resource *lpr,
- unsigned face, unsigned level,
+ unsigned face_slice, unsigned level,
enum lp_texture_usage usage,
unsigned x, unsigned y)
{
@@ -991,7 +1001,7 @@ llvmpipe_get_texture_tile_linear(struct llvmpipe_resource *lpr,
linear_img->data = align_malloc(buffer_size, 16);
}
- cur_layout = llvmpipe_get_texture_tile_layout(lpr, face, level, tx, ty);
+ cur_layout = llvmpipe_get_texture_tile_layout(lpr, face_slice, level, tx, ty);
layout_logic(cur_layout, LP_TEX_LAYOUT_LINEAR, usage,
&new_layout, &convert);
@@ -1003,11 +1013,11 @@ llvmpipe_get_texture_tile_linear(struct llvmpipe_resource *lpr,
}
if (new_layout != cur_layout)
- llvmpipe_set_texture_tile_layout(lpr, face, level, tx, ty, new_layout);
+ llvmpipe_set_texture_tile_layout(lpr, face_slice, level, tx, ty, new_layout);
- if (face > 0) {
+ if (face_slice > 0) {
unsigned offset
- = face * tex_image_face_size(lpr, level, LP_TEX_LAYOUT_LINEAR);
+ = face_slice * tex_image_face_size(lpr, level, LP_TEX_LAYOUT_LINEAR);
return (ubyte *) linear_img->data + offset;
}
else {
@@ -1022,7 +1032,7 @@ llvmpipe_get_texture_tile_linear(struct llvmpipe_resource *lpr,
*/
ubyte *
llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
- unsigned face, unsigned level,
+ unsigned face_slice, unsigned level,
enum lp_texture_usage usage,
unsigned x, unsigned y)
{
@@ -1042,7 +1052,7 @@ llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
tiled_img->data = align_malloc(buffer_size, 16);
}
- cur_layout = llvmpipe_get_texture_tile_layout(lpr, face, level, tx, ty);
+ cur_layout = llvmpipe_get_texture_tile_layout(lpr, face_slice, level, tx, ty);
layout_logic(cur_layout, LP_TEX_LAYOUT_TILED, usage, &new_layout, &convert);
if (convert) {
@@ -1052,11 +1062,11 @@ llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
}
if (new_layout != cur_layout)
- llvmpipe_set_texture_tile_layout(lpr, face, level, tx, ty, new_layout);
+ llvmpipe_set_texture_tile_layout(lpr, face_slice, level, tx, ty, new_layout);
/* compute, return address of the 64x64 tile */
{
- unsigned tiles_per_row, tile_offset, face_offset;
+ unsigned tiles_per_row, tile_offset, face_slice_offset;
tiles_per_row = align(width, TILE_SIZE) / TILE_SIZE;
@@ -1067,11 +1077,11 @@ llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
assert(tiled_img->data);
- face_offset = (face > 0)
- ? (face * tex_image_face_size(lpr, level, LP_TEX_LAYOUT_TILED))
+ face_slice_offset = (face_slice > 0)
+ ? (face_slice * tex_image_face_size(lpr, level, LP_TEX_LAYOUT_TILED))
: 0;
- return (ubyte *) tiled_img->data + face_offset + tile_offset;
+ return (ubyte *) tiled_img->data + face_slice_offset + tile_offset;
}
}