[Mesa-dev] [PATCH 1/3] gallium: split transfer_inline_write into buffer and texture callbacks

Marek Olšák maraeo at gmail.com
Wed Jul 20 11:02:57 UTC 2016


On Tue, Jul 19, 2016 at 4:00 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> On 18.07.2016 14:25, Marek Olšák wrote:
>>
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> to reduce the call indirections with u_resource_vtbl.
>>
>> The worst call tree you could get was:
>>    - u_transfer_inline_write_vtbl
>>      - u_default_transfer_inline_write
>>        - u_transfer_map_vtbl
>>          - driver_transfer_map
>>        - u_transfer_unmap_vtbl
>>          - driver_transfer_unmap
>>
>> That's 6 indirect calls. Some drivers only had 5. The goal is to have
>> 1 indirect call for drivers that care. The resource type can be determined
>> statically at most call sites.
>>
>> The new interface is:
>>    pipe_context::buffer_subdata(ctx, resource, usage, offset, size, data)
>>    pipe_context::texture_subdata(ctx, resource, level, usage, box, data,
>>                                  stride, layer_stride)
>> ---
>
> [snip]
>
>> diff --git a/src/gallium/drivers/ilo/ilo_transfer.c
>> b/src/gallium/drivers/ilo/ilo_transfer.c
>> index 5abd3be..53029b6 100644
>> --- a/src/gallium/drivers/ilo/ilo_transfer.c
>> +++ b/src/gallium/drivers/ilo/ilo_transfer.c
>> @@ -1236,34 +1236,6 @@ ilo_transfer_map(struct pipe_context *pipe,
>>      return ptr;
>>   }
>>
>> -static void
>> -ilo_transfer_inline_write(struct pipe_context *pipe,
>> -                          struct pipe_resource *res,
>> -                          unsigned level,
>> -                          unsigned usage,
>> -                          const struct pipe_box *box,
>> -                          const void *data,
>> -                          unsigned stride,
>> -                          unsigned layer_stride)
>> -{
>> -   if (likely(res->target == PIPE_BUFFER) &&
>> -       !(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
>> -      /* they should specify just an offset and a size */
>> -      assert(level == 0);
>> -      assert(box->y == 0);
>> -      assert(box->z == 0);
>> -      assert(box->height == 1);
>> -      assert(box->depth == 1);
>> -
>> -      buf_pwrite(ilo_context(pipe), res,
>> -            usage, box->x, box->width, data);
>> -   }
>> -   else {
>> -      u_default_transfer_inline_write(pipe, res,
>> -            level, usage, box, data, stride, layer_stride);
>> -   }
>> -}
>> -
>>   /**
>>    * Initialize transfer-related functions.
>>    */
>> @@ -1273,5 +1245,6 @@ ilo_init_transfer_functions(struct ilo_context *ilo)
>>      ilo->base.transfer_map = ilo_transfer_map;
>>      ilo->base.transfer_flush_region = ilo_transfer_flush_region;
>>      ilo->base.transfer_unmap = ilo_transfer_unmap;
>> -   ilo->base.transfer_inline_write = ilo_transfer_inline_write;
>> +   ilo->base.buffer_subdata = u_default_buffer_subdata;
>> +   ilo->base.texture_subdata = u_default_texture_subdata;
>
>
> This is a change of behavior - buffer_subdata should end up calling
> buf_pwrite in the !PIPE_TRANSFER_UNSYNCHRONIZED case. Or, if nobody cares,
> buf_pwrite should be deleted.

Or ilo can be deleted. It seems to be a dead driver.

Marek


More information about the mesa-dev mailing list