[Mesa-dev] [PATCH 08/16] i965: Pass flags to brw_bo_map_*
Matt Turner
mattst88 at gmail.com
Thu Jun 1 04:42:00 UTC 2017
On Fri, May 26, 2017 at 1:50 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Wednesday, May 24, 2017 1:04:50 PM PDT Matt Turner wrote:
>> brw_bo_map_cpu() took a write_enable arg, but it wasn't always clear
>> whether we were also planning to read from the buffer. I kept everything
>> semantically identical by passing only MAP_READ or MAP_READ | MAP_WRITE
>> depending on the write_enable argument.
>>
>> The other flags are not used yet, but MAP_ASYNC for instance, will be
>> used in a later patch to remove the need for a separate
>> brw_bo_map_unsynchronized() function.
> [snip]
>> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h
>> index 3dbde21..831da69 100644
>> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h
>> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h
>> @@ -173,13 +173,23 @@ void brw_bo_reference(struct brw_bo *bo);
>> */
>> void brw_bo_unreference(struct brw_bo *bo);
>>
>> +/* Must match MapBufferRange interface (for convenience) */
>> +#define MAP_READ GL_MAP_READ_BIT
>> +#define MAP_WRITE GL_MAP_WRITE_BIT
>> +#define MAP_ASYNC GL_MAP_UNSYNCHRONIZED_BIT
>> +#define MAP_PERSISTENT GL_MAP_PERSISTENT_BIT
>> +#define MAP_COHERENT GL_MAP_COHERENT_BIT
>> +/* internal */
>> +#define MAP_INTERNAL_MASK (0xff << 24)
>> +#define MAP_RAW (0x01 << 24)
>> +
>> /**
>> * Maps the buffer into userspace.
>> *
>> * This function will block waiting for any existing execution on the
>> * buffer to complete, first. The resulting mapping is returned.
>> */
>> -MUST_CHECK void *brw_bo_map_cpu(struct brw_context *brw, struct brw_bo *bo, int write_enable);
>> +MUST_CHECK void *brw_bo_map_cpu(struct brw_context *brw, struct brw_bo *bo, unsigned flags);
>>
>> /**
>> * Reduces the refcount on the userspace mapping of the buffer
> [snip]
>> diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.c b/src/mesa/drivers/dri/i965/intel_buffer_objects.c
>> index 090a38c..cf6382d 100644
>> --- a/src/mesa/drivers/dri/i965/intel_buffer_objects.c
>> +++ b/src/mesa/drivers/dri/i965/intel_buffer_objects.c
>> @@ -328,6 +328,13 @@ brw_map_buffer_range(struct gl_context *ctx,
>>
>> assert(intel_obj);
>>
>> + STATIC_ASSERT(GL_MAP_UNSYNCHRONIZED_BIT == MAP_ASYNC);
>> + STATIC_ASSERT(GL_MAP_WRITE_BIT == MAP_WRITE);
>> + STATIC_ASSERT(GL_MAP_READ_BIT == MAP_READ);
>> + STATIC_ASSERT(GL_MAP_PERSISTENT_BIT == MAP_PERSISTENT);
>> + STATIC_ASSERT(GL_MAP_COHERENT_BIT == MAP_COHERENT);
>> + assert((access & MAP_INTERNAL_MASK) == 0);
>> +
>> /* _mesa_MapBufferRange (GL entrypoint) sets these, but the vbo module also
>> * internally uses our functions directly.
>> */
>> @@ -390,10 +397,9 @@ brw_map_buffer_range(struct gl_context *ctx,
>> alignment);
>> void *map;
>> if (brw->has_llc) {
>> - map = brw_bo_map_cpu(brw, intel_obj->range_map_bo[index],
>> - (access & GL_MAP_WRITE_BIT) != 0);
>> + map = brw_bo_map_cpu(brw, intel_obj->range_map_bo[index], access);
>> } else {
>> - map = brw_bo_map_gtt(brw, intel_obj->range_map_bo[index]);
>> + map = brw_bo_map_gtt(brw, intel_obj->range_map_bo[index], access);
>> }
>> obj->Mappings[index].Pointer = map + intel_obj->map_extra[index];
>> return obj->Mappings[index].Pointer;
>> @@ -408,10 +414,10 @@ brw_map_buffer_range(struct gl_context *ctx,
>> map = brw_bo_map_unsynchronized(brw, intel_obj->buffer);
>> } else if (!brw->has_llc && (!(access & GL_MAP_READ_BIT) ||
>> (access & GL_MAP_PERSISTENT_BIT))) {
>> - map = brw_bo_map_gtt(brw, intel_obj->buffer);
>> + map = brw_bo_map_gtt(brw, intel_obj->buffer, access);
>> mark_buffer_inactive(intel_obj);
>> } else {
>> - map = brw_bo_map_cpu(brw, intel_obj->buffer, (access & GL_MAP_WRITE_BIT) != 0);
>> + map = brw_bo_map_cpu(brw, intel_obj->buffer, access);
>> mark_buffer_inactive(intel_obj);
>> }
>>
>
> One thing that's a bit odd here..."access" may contain several bits
> we don't use in brw_bo_map(), and don't #define MAP_* aliases for:
>
> GL_MAP_INVALIDATE_RANGE_BIT
> GL_MAP_INVALIDATE_BUFFER_BIT
> GL_MAP_FLUSH_EXPLICIT_BIT
>
> I guess it's harmless to pass them along...so if you think that's okay,
> I don't really have a problem with it...just thought it might be worth
> pointing out...
Yeah... seems like we can use these a lot more if and when we start
clflushing in userspace. I've put it on my TODO list.
More information about the mesa-dev
mailing list