[Mesa-dev] [PATCH 2/3] r600g: add support for separately allocated CMASKs
Marek Olšák
maraeo at gmail.com
Mon Sep 9 07:09:05 PDT 2013
On Mon, Sep 9, 2013 at 11:52 AM, Grigori Goronzy <greg at chown.ath.cx> wrote:
> ---
> src/gallium/drivers/r600/evergreen_state.c | 24 +++++++++++++++++++-----
> src/gallium/drivers/r600/r600_hw_context.c | 12 +++++++++---
> src/gallium/drivers/r600/r600_resource.h | 3 +++
> src/gallium/drivers/r600/r600_texture.c | 25 ++++++++++++++++++++++++-
> 4 files changed, 55 insertions(+), 9 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 887f736..469b3a3 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -1555,8 +1555,11 @@ void evergreen_init_color_surface(struct r600_context *rctx,
> surf->export_16bpc = true;
> }
>
> - if (rtex->fmask_size && rtex->cmask_size) {
> - color_info |= S_028C70_COMPRESSION(1) | S_028C70_FAST_CLEAR(1);
> + if (rtex->fmask_size) {
> + color_info |= S_028C70_COMPRESSION(1);
> + }
> + if (rtex->cmask_size) {
> + color_info |= S_028C70_FAST_CLEAR(1);
> }
>
> base_offset = r600_resource_va(rctx->b.b.screen, pipe_tex);
> @@ -1574,11 +1577,15 @@ void evergreen_init_color_surface(struct r600_context *rctx,
> S_028C6C_SLICE_MAX(surf->base.u.tex.last_layer);
> }
> surf->cb_color_attrib = color_attrib;
> - if (rtex->fmask_size && rtex->cmask_size) {
> + if (rtex->fmask_size) {
> surf->cb_color_fmask = (base_offset + rtex->fmask_offset) >> 8;
> - surf->cb_color_cmask = (base_offset + rtex->cmask_offset) >> 8;
> } else {
> surf->cb_color_fmask = surf->cb_color_base;
> + }
> + if (rtex->cmask_size) {
> + uint64_t va = r600_resource_va(rctx->b.b.screen, &rtex->cmask->b.b);
> + surf->cb_color_cmask = (va + rtex->cmask_offset) >> 8;
> + } else {
> surf->cb_color_cmask = surf->cb_color_base;
> }
> surf->cb_color_fmask_slice = S_028C88_TILE_MAX(rtex->fmask_slice_tile_max);
> @@ -2180,6 +2187,13 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r
> &rctx->b.rings.gfx,
> (struct r600_resource*)cb->base.texture,
> RADEON_USAGE_READWRITE);
> + unsigned cmask_reloc = 0;
> + if (tex->cmask && tex->cmask != &tex->resource) {
> + cmask_reloc = r600_context_bo_reloc(&rctx->b, &rctx->b.rings.gfx,
> + tex->cmask, RADEON_USAGE_READWRITE);
> + } else {
> + cmask_reloc = reloc;
> + }
>
> r600_write_context_reg_seq(cs, R_028C60_CB_COLOR0_BASE + i * 0x3C, 13);
> radeon_emit(cs, cb->cb_color_base); /* R_028C60_CB_COLOR0_BASE */
> @@ -2208,7 +2222,7 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r
> radeon_emit(cs, reloc);
>
> radeon_emit(cs, PKT3(PKT3_NOP, 0, 0)); /* R_028C7C_CB_COLOR0_CMASK */
> - radeon_emit(cs, reloc);
> + radeon_emit(cs, cmask_reloc);
>
> radeon_emit(cs, PKT3(PKT3_NOP, 0, 0)); /* R_028C84_CB_COLOR0_FMASK */
> radeon_emit(cs, reloc);
> diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c
> index d985af9..c2cd521 100644
> --- a/src/gallium/drivers/r600/r600_hw_context.c
> +++ b/src/gallium/drivers/r600/r600_hw_context.c
> @@ -644,11 +644,11 @@ void r600_flag_resource_cache_flush(struct r600_context *rctx,
>
> /* Check colorbuffers. */
> for (i = 0; i < rctx->framebuffer.state.nr_cbufs; i++) {
> + struct r600_texture *tex =
> + (struct r600_texture*)rctx->framebuffer.state.cbufs[i]->texture;
> +
Please check if cbufs[i] != NULL.
Marek
More information about the mesa-dev
mailing list