[Mesa-dev] i965 GL_ARB_buffer_storage
Eric Anholt
eric at anholt.net
Fri Mar 14 11:35:58 PDT 2014
Kenneth Graunke <kenneth at whitecape.org> writes:
> On 02/27/2014 02:52 PM, Eric Anholt wrote:
>> One thing I noticed while working on this was that we only reallocate buffer
>> storage for INVALIDATE_BUFFER_BIT when UNSYNCHRONIZED_BIT is unset. The
>> ARB_mbr spec says that the contents "may be discarded", not "must be
>> discarded". However, while writing the glamor code I happened to type this
>> for the wraparound case:
>>
>> glamor_priv->vb = glMapBufferRange(GL_ARRAY_BUFFER,
>> 0, size,
>> GL_MAP_WRITE_BIT |
>> GL_MAP_INVALIDATE_BUFFER_BIT |
>> GL_MAP_UNSYNCHRONIZED_BIT |
>> GL_MAP_PERSISTENT_BIT |
>> GL_MAP_COHERENT_BIT);
>>
>> intending that the buffer storage get reallocated, and that we not worry about
>> any synchronization after that. My code would have been broken on the i965
>> driver. I'm wondering if this is the intended behavior of the spec, or if we
>> want to treat the "may" as a "must".
>
> I don't understand. Your code here sets GL_MAP_INVALIDATE_BUFFER_BIT
> and GL_MAP_UNSYNCHRONIZED_BIT, which would have reallocated the storage,
> as you intended. Was this a mispaste - you originally lacked the
> GL_MAP_UNSYNCHRONIZED_BIT, were surprised, and eventually added it?
Here's the only i965 code referencing MAP_INVALIDATE_BUFFER_BIT:
if (!(access & GL_MAP_UNSYNCHRONIZED_BIT)) {
if (drm_intel_bo_references(brw->batch.bo, intel_obj->buffer)) {
if (access & GL_MAP_INVALIDATE_BUFFER_BIT) {
drm_intel_bo_unreference(intel_obj->buffer);
intel_bufferobj_alloc_buffer(brw, intel_obj);
} else {
perf_debug("Stalling on the GPU for mapping a busy buffer "
"object\n");
intel_batchbuffer_flush(brw);
}
} else if (drm_intel_bo_busy(intel_obj->buffer) &&
(access & GL_MAP_INVALIDATE_BUFFER_BIT)) {
drm_intel_bo_unreference(intel_obj->buffer);
intel_bufferobj_alloc_buffer(brw, intel_obj);
}
}
so for that glamor call we wouldn't have thrown out the storage, even
though it was referenced by the batch or the GPU. I think we should
pull the INVALIDATE_BUFFER test out and just always invalidate when it's
set.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140314/a985822a/attachment.pgp>
More information about the mesa-dev
mailing list