Kristian Høgsberg <k...@bitplanet.net> writes: > On Tue, Nov 12, 2013 at 12:15 PM, Eric Anholt <e...@anholt.net> wrote: >> Kristian Høgsberg <k...@bitplanet.net> writes: >> >>> 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 <k...@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 >>> @@ -115,6 +115,7 @@ driCreateNewScreen2(int scrn, int fd, >>> { >>> static const __DRIextension *emptyExtensionList[] = { NULL }; >>> __DRIscreen *psp; >>> + int i; >>> >>> psp = calloc(1, sizeof(*psp)); >>> if (!psp) >>> @@ -161,6 +162,11 @@ driCreateNewScreen2(int scrn, int fd, >>> return NULL; >>> } >>> >>> + for (i = 0; psp->extensions[i]; i++) { >>> + if (strcmp(psp->extensions[i]->name, __DRI_IMAGE) == 0) >>> + psp->image_extension = (__DRIimageExtension *) >>> psp->extensions[i]; >>> + } >>> + >>> int gl_version_override = _mesa_get_gl_version_override(); >>> if (gl_version_override >= 31) { >>> psp->max_gl_core_version = MAX2(psp->max_gl_core_version, >>> @@ -862,6 +868,75 @@ driImageFormatToGLFormat(uint32_t image_format) >>> } >>> } >>> >>> +struct dri_image_buffer { >>> + __DRIbuffer base; >>> + __DRIimage *image; >>> +}; >>> + >>> +__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. */ >> >> s/, only/ only/ >> >>> + >>> + 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); >> >> Chad's right about scanout here. > > These helpers are only for drivers that no longer use DRI2 back > buffers. This __DRIimage helper can only allocate color buffers and > they have to be usable for scanout. > > There is no impact on cacheability or tiling of aux buffers, since > this function will never allocate those. A given driver knows whether > or not it will call out to DRI2 getBuffersWithFormat to ask for aux > buffers or not. If it allocates its own aux buffers and supports the > __DRIimage extension, it can plug in these helpers and avoid > implementing allocateBuffer/releaseBuffer. If the driver still relies > on DRI2 getBufferWithFormat for aux buffers, it must implement its own > allocBuffer/releaseBuffer pair.
You've convinced me.
pgpeMmBS3rEe4.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev