mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 09:18:04 +02:00
st/mesa: fix crash when using both user and vbo buffers with the same stride
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.
(cherry picked from commit 695cdee678)
This commit is contained in:
parent
c91d217ff7
commit
7272f8fb18
1 changed files with 8 additions and 0 deletions
|
|
@ -250,6 +250,7 @@ is_interleaved_arrays(const struct st_vertex_program *vp,
|
|||
GLint firstStride = -1;
|
||||
GLuint num_client_arrays = 0;
|
||||
const GLubyte *client_addr = NULL;
|
||||
GLboolean user_memory;
|
||||
|
||||
for (attr = 0; attr < vpv->num_inputs; attr++) {
|
||||
const GLuint mesaAttr = vp->index_to_input[attr];
|
||||
|
|
@ -258,6 +259,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;
|
||||
|
|
@ -268,6 +270,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;
|
||||
}
|
||||
|
|
@ -277,6 +282,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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue