diff options
author | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-03-10 00:27:13 -0700 |
---|---|---|
committer | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-03-10 00:27:13 -0700 |
commit | 9d9e0815be41fa72ff5df6752b02551b648b33b6 (patch) | |
tree | 1c278cf8c2f8943a70c0e5594e6e9c11fcc38f49 /src/gallium/drivers/r300/r300_texture.c | |
parent | c9da0283e7a9b95df7762b519f6fe5b89f17ae95 (diff) |
r300-gallium: First stab at texture support.
Diffstat (limited to 'src/gallium/drivers/r300/r300_texture.c')
-rw-r--r-- | src/gallium/drivers/r300/r300_texture.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index b7027553b5..ae388c7360 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -27,6 +27,30 @@ static int minify(int i) return MAX2(1, i >> 1); } +static void r300_setup_texture_state(struct r300_texture* tex, + unsigned width, + unsigned height, + unsigned pitch) +{ + struct r300_texture_state* state = &tex->state; + + state->format0 = R300_TX_WIDTH((width - 1) & 0x7ff) | + R300_TX_HEIGHT((height - 1) & 0x7ff) | R300_TX_PITCH_EN; + + /* XXX */ + state->format1 = R300_TX_FORMAT_A8R8G8B8; + + state->format2 = pitch - 1; + + /* XXX + if (width > 2048) { + state->pitch |= R300_TXWIDTH_11; + } + if (height > 2048) { + state->pitch |= R300_TXHEIGHT_11; + } */ +} + static void r300_setup_miptree(struct r300_texture* tex) { struct pipe_texture* base = &tex->tex; @@ -44,11 +68,10 @@ static void r300_setup_miptree(struct r300_texture* tex) base->nblocksy[i] = pf_get_nblocksy(&base->block, base->width[i]); /* Radeons enjoy things in multiples of 32. */ - /* XXX NPOT -> 64, not 32 */ + /* XXX this can be 32 when POT */ stride = (base->nblocksx[i] * base->block.size + 63) & ~63; size = stride * base->nblocksy[i] * base->depth[i]; - /* XXX 64 for NPOT */ tex->offset[i] = (tex->size + 63) & ~63; tex->size = tex->offset[i] + size; } @@ -73,6 +96,10 @@ static struct pipe_texture* r300_setup_miptree(tex); + /* XXX */ + r300_setup_texture_state(tex, tex->tex.width[0], tex->tex.height[0], + tex->tex.width[0]); + tex->buffer = screen->buffer_create(screen, 64, PIPE_BUFFER_USAGE_PIXEL, tex->size); @@ -153,6 +180,9 @@ static struct pipe_texture* tex->stride = *stride; + r300_setup_texture_state(tex, tex->tex.width[0], tex->tex.height[0], + tex->stride); + pipe_buffer_reference(&tex->buffer, buffer); return (struct pipe_texture*)tex; |