diff options
| author | Marek Olšák <maraeo@gmail.com> | 2010-04-29 05:26:41 +0200 | 
|---|---|---|
| committer | Marek Olšák <maraeo@gmail.com> | 2010-04-29 05:26:41 +0200 | 
| commit | 9dd06b8da45aa8100d61a09fc93c1bdfc16e9df8 (patch) | |
| tree | d62a3493b57814a375c60ea10d7b5803ae33567c /src/gallium/drivers | |
| parent | 2ba0c64c26d3ec9b2806f577020d4fde826a858d (diff) | |
r300g: fix tests/yuvrect and possibly even rendering to YUV textures
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_texture.c | 8 | 
2 files changed, 9 insertions, 3 deletions
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index b6e20591ed..a05bf3ce09 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -257,6 +257,10 @@ struct r300_texture {      /* A pitch for each mip-level */      unsigned pitch[R300_MAX_TEXTURE_LEVELS]; +    /* A pitch multiplied by blockwidth as hardware wants +     * the number of pixels instead of the number of blocks. */ +    unsigned hwpitch[R300_MAX_TEXTURE_LEVELS]; +      /* Size of one zslice or face based on the texture target */      unsigned layer_size[R300_MAX_TEXTURE_LEVELS]; diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index ec4076120a..69e6a12445 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -558,7 +558,7 @@ static void r300_texture_setup_immutable_state(struct r300_screen* screen,      if (tex->uses_pitch) {          /* rectangles love this */          f->format0 |= R300_TX_PITCH_EN; -        f->format2 = (tex->pitch[0] - 1) & 0x1fff; +        f->format2 = (tex->hwpitch[0] - 1) & 0x1fff;      } else {          /* power of two textures (3D, mipmaps, and no pitch) */          f->format0 |= R300_TX_DEPTH(util_logbase2(pt->depth0) & 0xf); @@ -599,7 +599,7 @@ static void r300_texture_setup_fb_state(struct r300_screen* screen,      if (util_format_is_depth_or_stencil(tex->b.b.format)) {          for (i = 0; i <= tex->b.b.last_level; i++) {              tex->fb_state.depthpitch[i] = -                tex->pitch[i] | +                tex->hwpitch[i] |                  R300_DEPTHMACROTILE(tex->mip_macrotile[i]) |                  R300_DEPTHMICROTILE(tex->microtile);          } @@ -607,7 +607,7 @@ static void r300_texture_setup_fb_state(struct r300_screen* screen,      } else {          for (i = 0; i <= tex->b.b.last_level; i++) {              tex->fb_state.colorpitch[i] = -                tex->pitch[i] | +                tex->hwpitch[i] |                  r300_translate_colorformat(tex->b.b.format) |                  R300_COLOR_TILE(tex->mip_macrotile[i]) |                  R300_COLOR_MICROTILE(tex->microtile); @@ -798,6 +798,8 @@ static void r300_setup_miptree(struct r300_screen* screen,          tex->size = tex->offset[i] + size;          tex->layer_size[i] = layer_size;          tex->pitch[i] = stride / util_format_get_blocksize(base->format); +        tex->hwpitch[i] = +                tex->pitch[i] * util_format_get_blockwidth(base->format);          SCREEN_DBG(screen, DBG_TEX, "r300: Texture miptree: Level %d "                  "(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n",  | 
