summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/dri
diff options
context:
space:
mode:
authorRob Herring <[email protected]>2016-05-03 21:02:44 -0500
committerEmil Velikov <[email protected]>2016-05-23 12:07:46 +0100
commite8431a630d64a39c1cf2feda08e0450d4e522d7d (patch)
treedca5ac0ca6177b2ee94a4311e752786b56cc3a15 /src/gallium/state_trackers/dri
parenta0f06f168fd951d5b50b892786f041b58e9554ae (diff)
st/dri: Add support for DRIimage extension mapImage/unmapImage
Implement support for mapImage/unmapImage functions in version 12 of the DRIimage extension. Signed-off-by: Rob Herring <[email protected]> [Emil Velikov: align/indent the map/unmap vfuncs] Signed-off-by: Emil Velikov <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/dri')
-rw-r--r--src/gallium/state_trackers/dri/dri2.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 675a9bb21cf..6b3acdefb15 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1232,6 +1232,45 @@ dri2_blit_image(__DRIcontext *context, __DRIimage *dst, __DRIimage *src,
}
}
+static void *
+dri2_map_image(__DRIcontext *context, __DRIimage *image,
+ int x0, int y0, int width, int height,
+ unsigned int flags, int *stride, void **data)
+{
+ struct dri_context *ctx = dri_context(context);
+ struct pipe_context *pipe = ctx->st->pipe;
+ enum pipe_transfer_usage pipe_access = 0;
+ struct pipe_transfer *trans;
+ void *map;
+
+ if (!image || !data || *data)
+ return NULL;
+
+ if (flags & __DRI_IMAGE_TRANSFER_READ)
+ pipe_access |= PIPE_TRANSFER_READ;
+ if (flags & __DRI_IMAGE_TRANSFER_WRITE)
+ pipe_access |= PIPE_TRANSFER_WRITE;
+
+ map = pipe_transfer_map(pipe, image->texture,
+ 0, 0, pipe_access, x0, y0, width, height,
+ &trans);
+ if (map) {
+ *data = trans;
+ *stride = trans->stride;
+ }
+
+ return map;
+}
+
+static void
+dri2_unmap_image(__DRIcontext *context, __DRIimage *image, void *data)
+{
+ struct dri_context *ctx = dri_context(context);
+ struct pipe_context *pipe = ctx->st->pipe;
+
+ pipe_transfer_unmap(pipe, (struct pipe_transfer *)data);
+}
+
static void
dri2_destroy_image(__DRIimage *img)
{
@@ -1249,7 +1288,7 @@ dri2_get_capabilities(__DRIscreen *_screen)
/* The extension is modified during runtime if DRI_PRIME is detected */
static __DRIimageExtension dri2ImageExtension = {
- .base = { __DRI_IMAGE, 11 },
+ .base = { __DRI_IMAGE, 12 },
.createImageFromName = dri2_create_image_from_name,
.createImageFromRenderbuffer = dri2_create_image_from_renderbuffer,
@@ -1265,6 +1304,8 @@ static __DRIimageExtension dri2ImageExtension = {
.createImageFromDmaBufs = NULL,
.blitImage = dri2_blit_image,
.getCapabilities = dri2_get_capabilities,
+ .mapImage = dri2_map_image,
+ .unmapImage = dri2_unmap_image,
};