[Mesa-dev] [PATCH 1/3] dri: Add helpers for implementing allocBuffer/releaseBuffer with __DRIimage
Kristian Høgsberg
krh at bitplanet.net
Mon Nov 11 13:22:05 PST 2013
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
@@ -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
More information about the mesa-dev
mailing list