[Mesa-dev] [PATCH] st/mesa: use transfer_inline_write for memcpy TexSubImage path
Rob Herring
robh at kernel.org
Fri May 20 15:58:05 UTC 2016
On Fri, May 20, 2016 at 10:42 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Fri, May 20, 2016 at 11:39 AM, Rob Herring <robh at kernel.org> wrote:
>> On Mon, May 9, 2016 at 6:38 AM, Marek Olšák <maraeo at gmail.com> wrote:
>>> From: Marek Olšák <marek.olsak at amd.com>
>>>
>>> This allows drivers to use their own fast path for texture uploads.
>>> ---
>>> src/mesa/state_tracker/st_cb_texture.c | 43 ++++++++++++++++++++++++++++++----
>>> 1 file changed, 39 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
>>> index f181266..446a6d9 100644
>>> --- a/src/mesa/state_tracker/st_cb_texture.c
>>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>>> @@ -1698,15 +1698,50 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
>>> GLenum gl_target = texImage->TexObject->Target;
>>> unsigned bind;
>>> GLubyte *map;
>>> + unsigned dstz = texImage->Face + texImage->TexObject->MinLayer;
>>> + unsigned dst_level = 0;
>>> +
>>> + if (stObj->pt == stImage->pt)
>>> + dst_level = texImage->TexObject->MinLevel + texImage->Level;
>>>
>>> assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
>>> texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
>>>
>>> - if (!st->prefer_blit_based_texture_transfer) {
>>> + if (!dst)
>>> goto fallback;
>>> +
>>> + /* Try transfer_inline_write, which should be the fastest memcpy path. */
>>> + if (pixels &&
>>> + !_mesa_is_bufferobj(unpack->BufferObj) &&
>>> + _mesa_texstore_can_use_memcpy(ctx, texImage->_BaseFormat,
>>> + texImage->TexFormat, format, type,
>>> + unpack)) {
>>> + struct pipe_box box;
>>> + unsigned stride, layer_stride;
>>> + void *data;
>>> +
>>> + stride = _mesa_image_row_stride(unpack, width, format, type);
>>> + layer_stride = _mesa_image_image_stride(unpack, width, height, format,
>>> + type);
>>> + data = _mesa_image_address(dims, unpack, pixels, width, height, format,
>>> + type, 0, 0, 0);
>>> +
>>> + /* Convert to Gallium coordinates. */
>>> + if (gl_target == GL_TEXTURE_1D_ARRAY) {
>>> + zoffset = yoffset;
>>> + yoffset = 0;
>>> + depth = height;
>>> + height = 1;
>>> + layer_stride = stride;
>>> + }
>>> +
>>> + u_box_3d(xoffset, yoffset, zoffset + dstz, width, height, depth, &box);
>>> + pipe->transfer_inline_write(pipe, dst, dst_level, 0,
>>> + &box, data, stride, layer_stride);
>>
>> This crashes with a NULL ptr on Android+virgl for me.
>> transfer_inline_write is NULL for textures on virgl. It is not obvious
>> to me how to fix this as pipe->transfer_inline_write itself is not
>> NULL.
>
> virgl has to support transfer_inline_write... it's not legal to just
> leave that out. I'm surprised this is the only place that's hitting
> that path. Normally one uses the default implementation for this,
> which just does a map + write + unmap.
There's something strange that transfer_inline_write is first set here:
src/gallium/drivers/virgl/virgl_context.c:
vctx->base.transfer_inline_write = virgl_transfer_inline_write;
And then later on, it is overwritten:
src/gallium/drivers/virgl/virgl_resource.c:
ctx->transfer_inline_write = u_transfer_inline_write_vtbl;
So if u_transfer_inline_write_vtbl is used, then all resource types
must have a ptr?
Rob
More information about the mesa-dev
mailing list