diff --git a/.pick_status.json b/.pick_status.json index 328ceb6c042..acf9c3b79e6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -850,7 +850,7 @@ "description": "st/mesa: always use PIPE_USAGE_STAGING for GL_MAP_READ_BIT usage", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 2fd5aeef152..fdb1ec69a67 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -250,16 +250,20 @@ static enum pipe_resource_usage buffer_usage(GLenum target, GLboolean immutable, GLbitfield storageFlags, GLenum usage) { + /* "immutable" means that "storageFlags" was set by the user and "usage" + * was guessed by Mesa. Otherwise, "usage" was set by the user and + * storageFlags was guessed by Mesa. + * + * Therefore, use storageFlags with immutable, else use "usage". + */ if (immutable) { /* BufferStorage */ - if (storageFlags & GL_CLIENT_STORAGE_BIT) { - if (storageFlags & GL_MAP_READ_BIT) - return PIPE_USAGE_STAGING; - else - return PIPE_USAGE_STREAM; - } else { + if (storageFlags & GL_MAP_READ_BIT) + return PIPE_USAGE_STAGING; + else if (storageFlags & GL_CLIENT_STORAGE_BIT) + return PIPE_USAGE_STREAM; + else return PIPE_USAGE_DEFAULT; - } } else { /* These are often read by the CPU, so enable CPU caches. */