diff options
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 27 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 27 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_texture.c | 41 | 
3 files changed, 51 insertions, 44 deletions
| diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 05948f9ada..4869083837 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -173,13 +173,8 @@ struct r300_sampler_view {  };  struct r300_texture_fb_state { -    /* Colorbuffer. */ -    uint32_t colorpitch[R300_MAX_TEXTURE_LEVELS]; /* R300_RB3D_COLORPITCH[0-3]*/ -    uint32_t us_out_fmt; /* R300_US_OUT_FMT[0-3] */ - -    /* Zbuffer. */ -    uint32_t depthpitch[R300_MAX_TEXTURE_LEVELS]; /* R300_RB3D_DEPTHPITCH */ -    uint32_t zb_format; /* R300_ZB_FORMAT */ +    uint32_t pitch[R300_MAX_TEXTURE_LEVELS]; /* COLORPITCH or DEPTHPITCH. */ +    uint32_t format; /* US_OUT_FMT or R300_ZB_FORMAT */  };  struct r300_texture_sampler_state { @@ -275,6 +270,19 @@ struct r300_fence {      boolean signalled;  }; +struct r300_surface { +    struct pipe_surface base; + +    /* Winsys buffer backing the texture. */ +    struct r300_winsys_buffer *buffer; + +    enum r300_buffer_domain domain; + +    uint32_t offset; +    uint32_t pitch;     /* COLORPITCH or DEPTHPITCH. */ +    uint32_t format;    /* US_OUT_FMT or R300_ZB_FORMAT. */ +}; +  struct r300_texture {      /* Parent class */      struct u_resource b; @@ -479,6 +487,11 @@ static INLINE struct r300_query* r300_query(struct pipe_query* q)      return (struct r300_query*)q;  } +static INLINE struct r300_surface* r300_surface(struct pipe_surface* surf) +{ +    return (struct r300_surface*)surf; +} +  static INLINE struct r300_texture* r300_texture(struct pipe_resource* tex)  {      return (struct r300_texture*)tex; diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index 8e8b752577..7c96e2b031 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -270,9 +270,8 @@ void r500_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, vo  void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state)  {      struct pipe_framebuffer_state* fb = (struct pipe_framebuffer_state*)state; -    struct r300_texture* tex; -    struct pipe_surface* surf; -    int i; +    struct r300_surface* surf; +    unsigned i;      CS_LOCALS(r300);      BEGIN_CS(size); @@ -296,18 +295,15 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state)      /* Set up colorbuffers. */      for (i = 0; i < fb->nr_cbufs; i++) { -        surf = fb->cbufs[i]; -        tex = r300_texture(surf->texture); -        assert(tex && tex->buffer && "cbuf is marked, but NULL!"); +        surf = r300_surface(fb->cbufs[i]);          OUT_CS_REG_SEQ(R300_RB3D_COLOROFFSET0 + (4 * i), 1); -        OUT_CS_TEX_RELOC(tex, surf->offset, 0, tex->domain, 0); +        OUT_CS_RELOC(surf->buffer, surf->offset, 0, surf->domain, 0);          OUT_CS_REG_SEQ(R300_RB3D_COLORPITCH0 + (4 * i), 1); -        OUT_CS_TEX_RELOC(tex, tex->fb_state.colorpitch[surf->level], -                     0, tex->domain, 0); +        OUT_CS_RELOC(surf->buffer, surf->pitch, 0, surf->domain, 0); -        OUT_CS_REG(R300_US_OUT_FMT_0 + (4 * i), tex->fb_state.us_out_fmt); +        OUT_CS_REG(R300_US_OUT_FMT_0 + (4 * i), surf->format);      }      for (; i < 4; i++) {          OUT_CS_REG(R300_US_OUT_FMT_0 + (4 * i), R300_US_OUT_FMT_UNUSED); @@ -315,18 +311,15 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state)      /* Set up a zbuffer. */      if (fb->zsbuf) { -        surf = fb->zsbuf; -        tex = r300_texture(surf->texture); -        assert(tex && tex->buffer && "zsbuf is marked, but NULL!"); +        surf = r300_surface(fb->zsbuf);          OUT_CS_REG_SEQ(R300_ZB_DEPTHOFFSET, 1); -        OUT_CS_TEX_RELOC(tex, surf->offset, 0, tex->domain, 0); +        OUT_CS_RELOC(surf->buffer, surf->offset, 0, surf->domain, 0); -        OUT_CS_REG(R300_ZB_FORMAT, tex->fb_state.zb_format); +        OUT_CS_REG(R300_ZB_FORMAT, surf->format);          OUT_CS_REG_SEQ(R300_ZB_DEPTHPITCH, 1); -        OUT_CS_TEX_RELOC(tex, tex->fb_state.depthpitch[surf->level], -                     0, tex->domain, 0); +        OUT_CS_RELOC(surf->buffer, surf->pitch, 0, surf->domain, 0);      }      OUT_CS_REG_SEQ(R300_SC_SCISSORS_TL, 2); diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 4ca8ce037b..adab736454 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -596,21 +596,21 @@ static void r300_texture_setup_fb_state(struct r300_screen* screen,      /* Set framebuffer state. */      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->fb_state.pitch[i] =                  tex->hwpitch[i] |                  R300_DEPTHMACROTILE(tex->mip_macrotile[i]) |                  R300_DEPTHMICROTILE(tex->microtile);          } -        tex->fb_state.zb_format = r300_translate_zsformat(tex->b.b.format); +        tex->fb_state.format = r300_translate_zsformat(tex->b.b.format);      } else {          for (i = 0; i <= tex->b.b.last_level; i++) { -            tex->fb_state.colorpitch[i] = +            tex->fb_state.pitch[i] =                  tex->hwpitch[i] |                  r300_translate_colorformat(tex->b.b.format) |                  R300_COLOR_TILE(tex->mip_macrotile[i]) |                  R300_COLOR_MICROTILE(tex->microtile);          } -        tex->fb_state.us_out_fmt = r300_translate_out_fmt(tex->b.b.format); +        tex->fb_state.format = r300_translate_out_fmt(tex->b.b.format);      }  } @@ -1003,26 +1003,27 @@ struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,  					  unsigned flags)  {      struct r300_texture* tex = r300_texture(texture); -    struct pipe_surface* surface = CALLOC_STRUCT(pipe_surface); -    unsigned offset; - -    offset = r300_texture_get_offset(tex, level, zslice, face); +    struct r300_surface* surface = CALLOC_STRUCT(r300_surface);      if (surface) { -        pipe_reference_init(&surface->reference, 1); -        pipe_resource_reference(&surface->texture, texture); -        surface->format = texture->format; -        surface->width = u_minify(texture->width0, level); -        surface->height = u_minify(texture->height0, level); -        surface->offset = offset; -        surface->usage = flags; -        surface->zslice = zslice; -        surface->texture = texture; -        surface->face = face; -        surface->level = level; +        pipe_reference_init(&surface->base.reference, 1); +        pipe_resource_reference(&surface->base.texture, texture); +        surface->base.format = texture->format; +        surface->base.width = u_minify(texture->width0, level); +        surface->base.height = u_minify(texture->height0, level); +        surface->base.usage = flags; +        surface->base.zslice = zslice; +        surface->base.face = face; +        surface->base.level = level; + +        surface->buffer = tex->buffer; +        surface->domain = tex->domain; +        surface->offset = r300_texture_get_offset(tex, level, zslice, face); +        surface->pitch = tex->fb_state.pitch[level]; +        surface->format = tex->fb_state.format;      } -    return surface; +    return &surface->base;  }  /* Not required to implement u_resource_vtbl, consider moving to another file: | 
