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. */ + + 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); + + 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; +} + +void +driReleaseBuffer(__DRIscreen *screen, __DRIbuffer *_buffer) +{ + struct dri_image_buffer *buffer = (struct dri_image_buffer *) _buffer; + __DRIimageExtension *image = screen->image_extension; + + image->destroyImage(buffer->image); + free(buffer); +} + + /** Image driver interface */ const __DRIimageDriverExtension driImageDriverExtension = { .base = { __DRI_IMAGE_DRIVER, __DRI_IMAGE_DRIVER_VERSION }, diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 79a8564..240213d 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -165,6 +165,7 @@ struct __DRIscreenRec { int max_gl_es2_version; const __DRIextension **extensions; + __DRIimageExtension *image_extension; const __DRIswrastLoaderExtension *swrast_loader; @@ -291,4 +292,13 @@ driUpdateFramebufferSize(struct gl_context *ctx, const __DRIdrawable *dPriv); extern const __DRIimageDriverExtension driImageDriverExtension; +extern __DRIbuffer * +driAllocateBuffer(__DRIscreen *screen, + unsigned attachment, unsigned format, + int width, int height); + +extern void +driReleaseBuffer(__DRIscreen *screen, __DRIbuffer *_buffer); + + #endif /* _DRI_UTIL_H_ */ diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 2c309ed..a143652 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -1185,58 +1185,6 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp) return (const __DRIconfig**) intel_screen_make_configs(psp); } -struct intel_buffer { - __DRIbuffer base; - struct intel_region *region; -}; - -static __DRIbuffer * -intelAllocateBuffer(__DRIscreen *screen, - unsigned attachment, unsigned format, - int width, int height) -{ - struct intel_buffer *intelBuffer; - struct intel_screen *intelScreen = screen->driverPrivate; - - assert(attachment == __DRI_BUFFER_FRONT_LEFT || - attachment == __DRI_BUFFER_BACK_LEFT); - - intelBuffer = calloc(1, sizeof *intelBuffer); - if (intelBuffer == NULL) - return NULL; - - /* The front and back buffers are color buffers, which are X tiled. */ - intelBuffer->region = intel_region_alloc(intelScreen, - I915_TILING_X, - format / 8, - width, - height, - true); - - if (intelBuffer->region == NULL) { - free(intelBuffer); - return NULL; - } - - intel_region_flink(intelBuffer->region, &intelBuffer->base.name); - - intelBuffer->base.attachment = attachment; - intelBuffer->base.cpp = intelBuffer->region->cpp; - intelBuffer->base.pitch = intelBuffer->region->pitch; - - return &intelBuffer->base; -} - -static void -intelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) -{ - struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer; - - intel_region_release(&intelBuffer->region); - free(intelBuffer); -} - - static const struct __DriverAPIRec i915_driver_api = { .InitScreen = intelInitScreen2, .DestroyScreen = intelDestroyScreen, @@ -1246,8 +1194,8 @@ static const struct __DriverAPIRec i915_driver_api = { .DestroyBuffer = intelDestroyBuffer, .MakeCurrent = intelMakeCurrent, .UnbindContext = intelUnbindContext, - .AllocateBuffer = intelAllocateBuffer, - .ReleaseBuffer = intelReleaseBuffer + .AllocateBuffer = driAllocateBuffer, + .ReleaseBuffer = driReleaseBuffer }; static const struct __DRIDriverVtableExtensionRec i915_vtable = { diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index e39d654..92b2eac 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -1302,57 +1302,6 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp) return (const __DRIconfig**) intel_screen_make_configs(psp); } -struct intel_buffer { - __DRIbuffer base; - struct intel_region *region; -}; - -static __DRIbuffer * -intelAllocateBuffer(__DRIscreen *screen, - unsigned attachment, unsigned format, - int width, int height) -{ - struct intel_buffer *intelBuffer; - struct intel_screen *intelScreen = screen->driverPrivate; - - assert(attachment == __DRI_BUFFER_FRONT_LEFT || - attachment == __DRI_BUFFER_BACK_LEFT); - - intelBuffer = calloc(1, sizeof *intelBuffer); - if (intelBuffer == NULL) - return NULL; - - /* The front and back buffers are color buffers, which are X tiled. */ - intelBuffer->region = intel_region_alloc(intelScreen, - I915_TILING_X, - format / 8, - width, - height, - true); - - if (intelBuffer->region == NULL) { - free(intelBuffer); - return NULL; - } - - intel_region_flink(intelBuffer->region, &intelBuffer->base.name); - - intelBuffer->base.attachment = attachment; - intelBuffer->base.cpp = intelBuffer->region->cpp; - intelBuffer->base.pitch = intelBuffer->region->pitch; - - return &intelBuffer->base; -} - -static void -intelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) -{ - struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer; - - intel_region_release(&intelBuffer->region); - free(intelBuffer); -} - static const struct __DriverAPIRec brw_driver_api = { .InitScreen = intelInitScreen2, .DestroyScreen = intelDestroyScreen, @@ -1362,8 +1311,8 @@ static const struct __DriverAPIRec brw_driver_api = { .DestroyBuffer = intelDestroyBuffer, .MakeCurrent = intelMakeCurrent, .UnbindContext = intelUnbindContext, - .AllocateBuffer = intelAllocateBuffer, - .ReleaseBuffer = intelReleaseBuffer + .AllocateBuffer = driAllocateBuffer, + .ReleaseBuffer = driReleaseBuffer }; static const struct __DRIDriverVtableExtensionRec brw_vtable = { -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev