Mesa (master): st/mesa: add support for GL_ARB_texture_buffer_range
Christoph Bumiller
chrisbmr at kemper.freedesktop.org
Wed Jan 30 12:11:05 UTC 2013
Module: Mesa
Branch: master
Commit: a901d54f67be0a9ec5a33195036eb6dfc54b501c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a901d54f67be0a9ec5a33195036eb6dfc54b501c
Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date: Sat Dec 22 13:46:27 2012 +0100
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 <brianp at vmware.com>
Acked-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/mesa/state_tracker/st_atom_texture.c | 22 +++++++++++++++++++++-
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 dba1d82..4b43b2a 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 34c0d7b..214588f 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);
}
More information about the mesa-commit
mailing list