[Mesa-dev] [PATCH] st/mesa: fix crash when using both user and vbo buffers with the same stride
Keith Whitwell
keithw at vmware.com
Tue Feb 22 03:04:06 PST 2011
Looks good to me.
Keith
On Sun, 2011-02-20 at 18:14 +0100, Marek Olšák wrote:
> If two buffers had the same stride where one buffer is a user one and
> the other is a vbo, it was considered to be one interleaved buffer,
> resulting in incorrect rendering and crashes.
>
> This patch makes sure that the interleaved buffer is either user or vbo,
> not both.
> ---
> src/mesa/state_tracker/st_draw.c | 8 ++++++++
> 1 files changed, 8 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
> index 5475e87..11ebd06 100644
> --- a/src/mesa/state_tracker/st_draw.c
> +++ b/src/mesa/state_tracker/st_draw.c
> @@ -249,6 +249,7 @@ is_interleaved_arrays(const struct st_vertex_program *vp,
> const struct gl_buffer_object *firstBufObj = NULL;
> GLint firstStride = -1;
> const GLubyte *client_addr = NULL;
> + GLboolean user_memory;
>
> for (attr = 0; attr < vpv->num_inputs; attr++) {
> const GLuint mesaAttr = vp->index_to_input[attr];
> @@ -257,6 +258,7 @@ is_interleaved_arrays(const struct st_vertex_program *vp,
>
> if (firstStride < 0) {
> firstStride = stride;
> + user_memory = !bufObj || !bufObj->Name;
> }
> else if (firstStride != stride) {
> return GL_FALSE;
> @@ -266,6 +268,9 @@ is_interleaved_arrays(const struct st_vertex_program *vp,
> /* Try to detect if the client-space arrays are
> * "close" to each other.
> */
> + if (!user_memory) {
> + return GL_FALSE;
> + }
> if (!client_addr) {
> client_addr = arrays[mesaAttr]->Ptr;
> }
> @@ -275,6 +280,9 @@ is_interleaved_arrays(const struct st_vertex_program *vp,
> }
> }
> else if (!firstBufObj) {
> + if (user_memory) {
> + return GL_FALSE;
> + }
> firstBufObj = bufObj;
> }
> else if (bufObj != firstBufObj) {
More information about the mesa-dev
mailing list