glamor: Avoid GL errors from mapping with size == 0.
GL 4.5 / GLES 3.0 require throwing GL errors at map time, and Mesa before that might throw errors accidentally if a malloc(0) call was made to return the mapping. Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
a6cddb8c04
commit
74be466d40
|
@ -251,6 +251,7 @@ typedef struct glamor_screen_private {
|
|||
/** Next offset within the VBO that glamor_get_vbo_space() will use. */
|
||||
int vbo_offset;
|
||||
int vbo_size;
|
||||
Bool vbo_mapped;
|
||||
/**
|
||||
* Pointer to glamor_get_vbo_space()'s current VBO mapping.
|
||||
*
|
||||
|
|
|
@ -96,6 +96,15 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset)
|
|||
data = glamor_priv->vb + glamor_priv->vbo_offset;
|
||||
glamor_priv->vbo_offset += size;
|
||||
} else if (glamor_priv->has_map_buffer_range) {
|
||||
/* Avoid GL errors on GL 4.5 / ES 3.0 with mapping size == 0,
|
||||
* which callers may sometimes pass us (for example, if
|
||||
* clipping leads to zero rectangles left). Prior to that
|
||||
* version, Mesa would sometimes throw errors on unmapping a
|
||||
* zero-size mapping.
|
||||
*/
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
if (glamor_priv->vbo_size < glamor_priv->vbo_offset + size) {
|
||||
glamor_priv->vbo_size = MAX(GLAMOR_VBO_SIZE, size);
|
||||
glamor_priv->vbo_offset = 0;
|
||||
|
@ -109,9 +118,9 @@ glamor_get_vbo_space(ScreenPtr screen, unsigned size, char **vbo_offset)
|
|||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_UNSYNCHRONIZED_BIT |
|
||||
GL_MAP_INVALIDATE_RANGE_BIT);
|
||||
assert(data != NULL);
|
||||
*vbo_offset = (char *)(uintptr_t)glamor_priv->vbo_offset;
|
||||
glamor_priv->vbo_offset += size;
|
||||
glamor_priv->vbo_mapped = TRUE;
|
||||
} else {
|
||||
/* Return a pointer to the statically allocated non-VBO
|
||||
* memory. We'll upload it through glBufferData() later.
|
||||
|
@ -145,7 +154,10 @@ glamor_put_vbo_space(ScreenPtr screen)
|
|||
* reach the end of the buffer.
|
||||
*/
|
||||
} else if (glamor_priv->has_map_buffer_range) {
|
||||
glUnmapBuffer(GL_ARRAY_BUFFER);
|
||||
if (glamor_priv->vbo_mapped) {
|
||||
glUnmapBuffer(GL_ARRAY_BUFFER);
|
||||
glamor_priv->vbo_mapped = FALSE;
|
||||
}
|
||||
} else {
|
||||
glBufferData(GL_ARRAY_BUFFER, glamor_priv->vbo_offset,
|
||||
glamor_priv->vb, GL_DYNAMIC_DRAW);
|
||||
|
|
Loading…
Reference in New Issue
Block a user