diff options
author | Grigori Goronzy <[email protected]> | 2017-07-10 01:55:52 +0200 |
---|---|---|
committer | Grigori Goronzy <[email protected]> | 2017-07-14 21:20:31 +0200 |
commit | cfbf60b0c21b105ad162a0a451cd2f65124efedc (patch) | |
tree | 201ea26ab663a5b458213c3964106a40c2ab35a1 /src/mesa/main | |
parent | 1ad24faa116d9f8fab78ad3b81ff6a3625016e50 (diff) |
mesa/marshal: fix glNamedBufferData with NULL data
The semantics are similar to glBufferData.
Tested-by: Marc Dietrich <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/main')
-rw-r--r-- | src/mesa/main/marshal.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c index 391b6e746c2..8f8e8c78ed2 100644 --- a/src/mesa/main/marshal.c +++ b/src/mesa/main/marshal.c @@ -415,6 +415,7 @@ struct marshal_cmd_NamedBufferData GLuint name; GLsizei size; GLenum usage; + bool data_null; /* If set, no data follows for "data" */ /* Next size bytes are GLubyte data[size] */ }; @@ -425,7 +426,12 @@ _mesa_unmarshal_NamedBufferData(struct gl_context *ctx, const GLuint name = cmd->name; const GLsizei size = cmd->size; const GLenum usage = cmd->usage; - const void *data = (const void *) (cmd + 1); + const void *data; + + if (cmd->data_null) + data = NULL; + else + data = (const void *) (cmd + 1); CALL_NamedBufferData(ctx->CurrentServerDispatch, (name, size, data, usage)); @@ -436,7 +442,7 @@ _mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage) { GET_CURRENT_CONTEXT(ctx); - size_t cmd_size = sizeof(struct marshal_cmd_NamedBufferData) + size; + size_t cmd_size = sizeof(struct marshal_cmd_NamedBufferData) + (data ? size : 0); debug_print_marshal("NamedBufferData"); if (unlikely(size < 0)) { @@ -452,8 +458,11 @@ _mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size, cmd->name = buffer; cmd->size = size; cmd->usage = usage; - char *variable_data = (char *) (cmd + 1); - memcpy(variable_data, data, size); + cmd->data_null = !data; + if (data) { + char *variable_data = (char *) (cmd + 1); + memcpy(variable_data, data, size); + } _mesa_post_marshal_hook(ctx); } else { _mesa_glthread_finish(ctx); |