[Mesa-dev] [PATCH 1/3] dri: Add helpers for implementing allocBuffer/releaseBuffer with __DRIimage
Kristian Høgsberg
krh at bitplanet.net
Mon Nov 11 14:20:22 PST 2013
On Mon, Nov 11, 2013 at 1:57 PM, Chad Versace
<chad.versace at linux.intel.com> wrote:
> On 11/11/2013 01:22 PM, Kristian Høgsberg wrote:
>>
>> Drivers that only call getBuffers to request color buffers can use these
>> generic, __DRIimage based helpers to implement the allocBuffer and
>> releaseBuffer functions of __DRIdri2Extension.
>>
>> For the intel dri driver, this consolidates window system color buffer
>> allocation in intel_create_image().
>>
>> Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
>> ---
>> src/mesa/drivers/dri/common/dri_util.c | 75
>> ++++++++++++++++++++++++++++++++
>> src/mesa/drivers/dri/common/dri_util.h | 10 +++++
>> src/mesa/drivers/dri/i915/intel_screen.c | 56 +-----------------------
>> src/mesa/drivers/dri/i965/intel_screen.c | 55 +----------------------
>> 4 files changed, 89 insertions(+), 107 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/common/dri_util.c
>> b/src/mesa/drivers/dri/common/dri_util.c
>> index 86cf24c..a7328e4 100644
>> --- a/src/mesa/drivers/dri/common/dri_util.c
>> +++ b/src/mesa/drivers/dri/common/dri_util.c
>
>
>
>> +__DRIbuffer *
>> +driAllocateBuffer(__DRIscreen *screen,
>> + unsigned attachment, unsigned format,
>> + int width, int height)
>> +{
>> + struct dri_image_buffer *buffer;
>> + __DRIimageExtension *image = screen->image_extension;
>> + int dri_format, name, stride;
>> +
>> + assert(attachment == __DRI_BUFFER_FRONT_LEFT ||
>> + attachment == __DRI_BUFFER_BACK_LEFT);
>> +
>> + /* We just need a __DRI_IMAGE_FORMAT code that has a cpp that matches
>> + * format / 8. The image format code is stored in the __DRIimage, but
>> the
>> + * __DRIbuffer we create from the image, only stores the cpp. */
>> +
>> + switch (format) {
>> + case 32:
>> + dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
>> + break;
>> + case 16:
>> + dri_format = __DRI_IMAGE_FORMAT_RGB565;
>> + break;
>> + default:
>> + return NULL;
>> + }
>> +
>> + buffer = calloc(1, sizeof *buffer);
>> + if (buffer == NULL)
>> + return NULL;
>> +
>> + buffer->image = image->createImage(screen,
>> + width, height, dri_format,
>> + __DRI_IMAGE_USE_SHARE |
>> + __DRI_IMAGE_USE_SCANOUT,
>> + buffer);
>
>
> It's incorrect to specify __DRI_IMAGE_USE_SCANOUT regardless of
> attachment type. GBM, Wayland, and Android use driAllocateBuffer
> to allocate more than just the scanout buffer. They use it to
> allocate auxillary buffers too. If i965 were to respect the
> caching restrictions implied by __DRI_IMAGE_USE_SCANOUT, its
> use for aux buffers would hurt performance. (As far as I can
> tell, though, intel_create_image() wrongly ignores __DRI_IMAGE_USE_SCANOUT).
>
> Instead, I think you should set the USE_SCANOUT bit if and only if
> attachment is one of __DRI_BUFFER_(BACK|FRONT)_(LEFT|RIGHT).
The commit message says:
"Drivers that only call getBuffers to request color buffers can use these
generic, __DRIimage based helpers to implement the allocBuffer and
releaseBuffer functions of __DRIdri2Extension."
which is true for the Intel DRI driver. The DRI2 interface allows the
driver to ask for auxillary buffers, but since we stopped supporting
multiple processes rendering to the same X window, our driver no
longer does that. This is under driver control and thus if a driver
knows it will never ask for aux buffers, it can use these helpers.
Kristian
>
>> +
>> + if (buffer->image == NULL) {
>> + free(buffer);
>> + return NULL;
>> + }
>> +
>> + image->queryImage(buffer->image, __DRI_IMAGE_ATTRIB_NAME, &name);
>> + image->queryImage(buffer->image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
>> +
>> + buffer->base.attachment = attachment;
>> + buffer->base.name = name;
>> + buffer->base.pitch = stride;
>> + buffer->base.cpp = format / 8;
>> +
>> + return &buffer->base;
>> +}
>
>
More information about the mesa-dev
mailing list