[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