diff options
author | Christoph Bumiller <[email protected]> | 2012-12-22 13:46:27 +0100 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2013-01-30 13:10:11 +0100 |
commit | a901d54f67be0a9ec5a33195036eb6dfc54b501c (patch) | |
tree | 9f36335e1998648d47576cd869c0663188b4fc86 | |
parent | 0fcd2c5e2fa06339de8af80ff8d35e479d61ccf5 (diff) |
st/mesa: add support for GL_ARB_texture_buffer_range
v2: Update to handle BufferSize being -1 and return a NULL sampler
view if the specified range would cause out of bounds access.
Reviewed-by: Brian Paul <[email protected]>
Acked-by: Ian Romanick <[email protected]>
-rw-r--r-- | src/mesa/state_tracker/st_atom_texture.c | 22 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 7 |
2 files changed, 28 insertions, 1 deletions
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index dba1d829c20..4b43b2a7da2 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -152,7 +152,27 @@ st_create_texture_sampler_view_from_stobj(struct pipe_context *pipe, u_sampler_view_default_template(&templ, stObj->pt, format); - templ.u.tex.first_level = stObj->base.BaseLevel; + + if (stObj->pt->target == PIPE_BUFFER) { + unsigned base, size; + unsigned f, n; + const struct util_format_description *desc + = util_format_description(templ.format); + + base = stObj->base.BufferOffset; + if (base >= stObj->pt->width0) + return NULL; + size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize); + + f = ((base * 8) / desc->block.bits) * desc->block.width; + n = ((size * 8) / desc->block.bits) * desc->block.width; + if (!n) + return NULL; + templ.u.buf.first_element = f; + templ.u.buf.last_element = f + (n - 1); + } else { + templ.u.tex.first_level = stObj->base.BaseLevel; + } if (swizzle != SWIZZLE_NOOP) { templ.swizzle_r = GET_SWZ(swizzle, 0); diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 34c0d7b4052..214588f1fdf 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -685,6 +685,13 @@ void st_init_extensions(struct st_context *st) } if (screen->get_param(screen, PIPE_CAP_TEXTURE_BUFFER_OBJECTS)) { ctx->Extensions.ARB_texture_buffer_object = GL_TRUE; + + ctx->Const.TextureBufferOffsetAlignment = + screen->get_param(screen, PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT); + + if (ctx->Const.TextureBufferOffsetAlignment) + ctx->Extensions.ARB_texture_buffer_range = GL_TRUE; + init_format_extensions(st, tbo_rgb32, Elements(tbo_rgb32), PIPE_BUFFER, PIPE_BIND_SAMPLER_VIEW); } |