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) {
 | 
				
			||||||
 | 
					        if (glamor_priv->vbo_mapped) {
 | 
				
			||||||
            glUnmapBuffer(GL_ARRAY_BUFFER);
 | 
					            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