diff options
author | Dave Airlie <[email protected]> | 2016-03-31 15:33:16 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-03-15 14:33:26 +1000 |
commit | 686d06045805fae9d17f9354edb4c6301c260f07 (patch) | |
tree | d6cbe7ef289574bde86fba21c58ae265acad9143 /src/gallium/drivers/r600/evergreen_state.c | |
parent | 222e42e45fc1e91e707343a7e6a32c6bd725eb10 (diff) |
r600: refactor binding code for attach buffer to CB.
This refactors out the code and fixes it up to be used
for images later. It uses the code in the current RAT binding
for compute.
Reviewed-by: Edward O'Callaghan <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600/evergreen_state.c')
-rw-r--r-- | src/gallium/drivers/r600/evergreen_state.c | 111 |
1 files changed, 78 insertions, 33 deletions
diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 4d86570ade8..900e0738deb 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -1011,6 +1011,71 @@ struct r600_tex_color_info { boolean export_16bpc; }; +static void evergreen_set_color_surface_buffer(struct r600_context *rctx, + struct r600_resource *res, + enum pipe_format pformat, + unsigned first_element, + unsigned last_element, + struct r600_tex_color_info *color) +{ + unsigned format, swap, ntype, endian; + const struct util_format_description *desc; + unsigned block_size = align(util_format_get_blocksize(res->b.b.format), 4); + unsigned pitch_alignment = + MAX2(64, rctx->screen->b.info.pipe_interleave_bytes / block_size); + unsigned pitch = align(res->b.b.width0, pitch_alignment); + int i; + unsigned width_elements; + + width_elements = last_element - first_element + 1; + + format = r600_translate_colorformat(rctx->b.chip_class, pformat, FALSE); + swap = r600_translate_colorswap(pformat, FALSE); + + endian = r600_colorformat_endian_swap(format, FALSE); + + desc = util_format_description(pformat); + for (i = 0; i < 4; i++) { + if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { + break; + } + } + ntype = V_028C70_NUMBER_UNORM; + if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) + ntype = V_028C70_NUMBER_SRGB; + else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { + if (desc->channel[i].normalized) + ntype = V_028C70_NUMBER_SNORM; + else if (desc->channel[i].pure_integer) + ntype = V_028C70_NUMBER_SINT; + } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { + if (desc->channel[i].normalized) + ntype = V_028C70_NUMBER_UNORM; + else if (desc->channel[i].pure_integer) + ntype = V_028C70_NUMBER_UINT; + } + pitch = (pitch / 8) - 1; + color->pitch = S_028C64_PITCH_TILE_MAX(pitch); + + color->info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED); + color->info |= S_028C70_FORMAT(format) | + S_028C70_COMP_SWAP(swap) | + S_028C70_BLEND_CLAMP(0) | + S_028C70_BLEND_BYPASS(1) | + S_028C70_NUMBER_TYPE(ntype) | + S_028C70_ENDIAN(endian); + color->attrib = S_028C74_NON_DISP_TILING_ORDER(1); + color->ntype = ntype; + color->export_16bpc = false; + color->dim = width_elements - 1; + color->slice = 0; /* (width_elements / 64) - 1;*/ + color->view = 0; + color->offset = res->gpu_address >> 8; + + color->fmask = color->offset; + color->fmask_slice = 0; +} + static void evergreen_set_color_surface_common(struct r600_context *rctx, struct r600_texture *rtex, unsigned level, @@ -1190,47 +1255,27 @@ void evergreen_init_color_surface_rat(struct r600_context *rctx, struct r600_surface *surf) { struct pipe_resource *pipe_buffer = surf->base.texture; - unsigned format = r600_translate_colorformat(rctx->b.chip_class, - surf->base.format, FALSE); - unsigned endian = r600_colorformat_endian_swap(format, FALSE); - unsigned swap = r600_translate_colorswap(surf->base.format, FALSE); - unsigned block_size = - align(util_format_get_blocksize(pipe_buffer->format), 4); - unsigned pitch_alignment = - MAX2(64, rctx->screen->b.info.pipe_interleave_bytes / block_size); - unsigned pitch = align(pipe_buffer->width0, pitch_alignment); - - surf->cb_color_base = r600_resource(pipe_buffer)->gpu_address >> 8; + struct r600_tex_color_info color; - surf->cb_color_pitch = (pitch / 8) - 1; + evergreen_set_color_surface_buffer(rctx, (struct r600_resource *)surf->base.texture, + surf->base.format, 0, pipe_buffer->width0, + &color); - surf->cb_color_slice = 0; + surf->cb_color_base = color.offset; + surf->cb_color_dim = color.dim; + surf->cb_color_info = color.info | S_028C70_RAT(1); + surf->cb_color_pitch = color.pitch; + surf->cb_color_slice = color.slice; + surf->cb_color_view = color.view; + surf->cb_color_attrib = color.attrib; + surf->cb_color_fmask = color.fmask; + surf->cb_color_fmask_slice = color.fmask_slice; surf->cb_color_view = 0; - surf->cb_color_info = - S_028C70_ENDIAN(endian) - | S_028C70_FORMAT(format) - | S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED) - | S_028C70_NUMBER_TYPE(V_028C70_NUMBER_UINT) - | S_028C70_COMP_SWAP(swap) - | S_028C70_BLEND_BYPASS(1) /* We must set this bit because we - * are using NUMBER_UINT */ - | S_028C70_RAT(1) - ; - - surf->cb_color_attrib = S_028C74_NON_DISP_TILING_ORDER(1); - - /* For buffers, CB_COLOR0_DIM needs to be set to the number of - * elements. */ - surf->cb_color_dim = pipe_buffer->width0; - /* Set the buffer range the GPU will have access to: */ util_range_add(&r600_resource(pipe_buffer)->valid_buffer_range, 0, pipe_buffer->width0); - - surf->cb_color_fmask = surf->cb_color_base; - surf->cb_color_fmask_slice = 0; } |