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. */
|
/** Next offset within the VBO that glamor_get_vbo_space() will use. */
|
||||||
int vbo_offset;
|
int vbo_offset;
|
||||||
int vbo_size;
|
int vbo_size;
|
||||||
|
Bool vbo_mapped;
|
||||||
/**
|
/**
|
||||||
* Pointer to glamor_get_vbo_space()'s current VBO mapping.
|
* 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;
|
data = glamor_priv->vb + glamor_priv->vbo_offset;
|
||||||
glamor_priv->vbo_offset += size;
|
glamor_priv->vbo_offset += size;
|
||||||
} else if (glamor_priv->has_map_buffer_range) {
|
} 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) {
|
if (glamor_priv->vbo_size < glamor_priv->vbo_offset + size) {
|
||||||
glamor_priv->vbo_size = MAX(GLAMOR_VBO_SIZE, size);
|
glamor_priv->vbo_size = MAX(GLAMOR_VBO_SIZE, size);
|
||||||
glamor_priv->vbo_offset = 0;
|
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_WRITE_BIT |
|
||||||
GL_MAP_UNSYNCHRONIZED_BIT |
|
GL_MAP_UNSYNCHRONIZED_BIT |
|
||||||
GL_MAP_INVALIDATE_RANGE_BIT);
|
GL_MAP_INVALIDATE_RANGE_BIT);
|
||||||
assert(data != NULL);
|
|
||||||
*vbo_offset = (char *)(uintptr_t)glamor_priv->vbo_offset;
|
*vbo_offset = (char *)(uintptr_t)glamor_priv->vbo_offset;
|
||||||
glamor_priv->vbo_offset += size;
|
glamor_priv->vbo_offset += size;
|
||||||
|
glamor_priv->vbo_mapped = TRUE;
|
||||||
} else {
|
} else {
|
||||||
/* Return a pointer to the statically allocated non-VBO
|
/* Return a pointer to the statically allocated non-VBO
|
||||||
* memory. We'll upload it through glBufferData() later.
|
* memory. We'll upload it through glBufferData() later.
|
||||||
|
@ -145,7 +154,10 @@ glamor_put_vbo_space(ScreenPtr screen)
|
||||||
* reach the end of the buffer.
|
* reach the end of the buffer.
|
||||||
*/
|
*/
|
||||||
} else if (glamor_priv->has_map_buffer_range) {
|
} 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 {
|
} else {
|
||||||
glBufferData(GL_ARRAY_BUFFER, glamor_priv->vbo_offset,
|
glBufferData(GL_ARRAY_BUFFER, glamor_priv->vbo_offset,
|
||||||
glamor_priv->vb, GL_DYNAMIC_DRAW);
|
glamor_priv->vb, GL_DYNAMIC_DRAW);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user