From: Fredrik Höglund Date: Fri, 22 Mar 2013 16:14:43 +0000 (+0100) Subject: r600g: Add support for GL_ARB_texture_buffer_range X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fb69dbb0d164fc617941943472cfa390510ec63b;p=mesa.git r600g: Add support for GL_ARB_texture_buffer_range Reviewed-by: Marek Olšák --- diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 7169614143a..86f14118241 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -1047,6 +1047,8 @@ texture_buffer_sampler_view(struct r600_pipe_sampler_view *view, unsigned swizzle_res; unsigned char swizzle[4]; const struct util_format_description *desc; + unsigned offset = view->base.u.buf.first_element * stride; + unsigned size = (view->base.u.buf.last_element - view->base.u.buf.first_element + 1) * stride; swizzle[0] = view->base.swizzle_r; swizzle[1] = view->base.swizzle_g; @@ -1061,12 +1063,12 @@ texture_buffer_sampler_view(struct r600_pipe_sampler_view *view, swizzle_res = r600_get_swizzle_combined(desc->swizzle, swizzle, TRUE); - va = r600_resource_va(ctx->screen, view->base.texture); + va = r600_resource_va(ctx->screen, view->base.texture) + offset; view->tex_resource = &tmp->resource; view->skip_mip_address_reloc = true; view->tex_resource_words[0] = va; - view->tex_resource_words[1] = width0 - 1; + view->tex_resource_words[1] = size - 1; view->tex_resource_words[2] = S_030008_BASE_ADDRESS_HI(va >> 32UL) | S_030008_STRIDE(stride) | S_030008_DATA_FORMAT(format) | diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 7f308f7d001..ec83c45c83e 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -575,6 +575,9 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: return 256; + case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: + return 1; + case PIPE_CAP_GLSL_FEATURE_LEVEL: return 140; @@ -601,7 +604,6 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: case PIPE_CAP_VERTEX_COLOR_CLAMPED: case PIPE_CAP_USER_VERTEX_BUFFERS: - case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: case PIPE_CAP_QUERY_PIPELINE_STATISTICS: return 0; diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index c6d98bbccf6..a7e69238bbe 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -1027,17 +1027,19 @@ texture_buffer_sampler_view(struct r600_pipe_sampler_view *view, uint64_t va; int stride = util_format_get_blocksize(view->base.format); unsigned format, num_format, format_comp, endian; + unsigned offset = view->base.u.buf.first_element * stride; + unsigned size = (view->base.u.buf.last_element - view->base.u.buf.first_element + 1) * stride; r600_vertex_data_type(view->base.format, &format, &num_format, &format_comp, &endian); - va = r600_resource_va(ctx->screen, view->base.texture); + va = r600_resource_va(ctx->screen, view->base.texture) + offset; view->tex_resource = &tmp->resource; view->skip_mip_address_reloc = true; view->tex_resource_words[0] = va; - view->tex_resource_words[1] = width0 - 1; + view->tex_resource_words[1] = size - 1; view->tex_resource_words[2] = S_038008_BASE_ADDRESS_HI(va >> 32UL) | S_038008_STRIDE(stride) | S_038008_DATA_FORMAT(format) |