diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2018-10-23 06:36:00 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2018-10-23 06:36:00 +0000 |
commit | b65fcab046d3a1b6b6ac315720df220925c5322e (patch) | |
tree | ff73dcc383ac0799c655ff6194cda9dacb75dde9 /lib/mesa/src/gallium/auxiliary/renderonly | |
parent | 18d6381c51e253e4c41c62619f80d9ce745b95c8 (diff) |
Merge Mesa 17.3.9
Mesa 18.x needs an ld with build-id for at least the intel code
Mesa 18.2 assumes linux only memfd syscalls in intel code
Tested by matthieu@, kettenis@ and myself on a variety of hardware and
architectures. ok kettenis@
Diffstat (limited to 'lib/mesa/src/gallium/auxiliary/renderonly')
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/renderonly/renderonly.c | 163 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/renderonly/renderonly.h | 111 |
2 files changed, 274 insertions, 0 deletions
diff --git a/lib/mesa/src/gallium/auxiliary/renderonly/renderonly.c b/lib/mesa/src/gallium/auxiliary/renderonly/renderonly.c new file mode 100644 index 000000000..d31f45884 --- /dev/null +++ b/lib/mesa/src/gallium/auxiliary/renderonly/renderonly.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2016 Christian Gmeiner <christian.gmeiner@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Christian Gmeiner <christian.gmeiner@gmail.com> + */ + +#include "renderonly/renderonly.h" + +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <xf86drm.h> + +#include "state_tracker/drm_driver.h" +#include "pipe/p_screen.h" +#include "util/u_format.h" +#include "util/u_inlines.h" +#include "util/u_memory.h" + +struct renderonly * +renderonly_dup(const struct renderonly *ro) +{ + struct renderonly *copy; + + copy = CALLOC_STRUCT(renderonly); + if (!copy) + return NULL; + + memcpy(copy, ro, sizeof(*ro)); + + return copy; +} + +void +renderonly_scanout_destroy(struct renderonly_scanout *scanout, + struct renderonly *ro) +{ + struct drm_mode_destroy_dumb destroy_dumb = { }; + + if (ro->kms_fd != -1) { + destroy_dumb.handle = scanout->handle; + drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb); + } + FREE(scanout); +} + +struct renderonly_scanout * +renderonly_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc, + struct renderonly *ro, + struct winsys_handle *out_handle) +{ + struct renderonly_scanout *scanout; + int err; + struct drm_mode_create_dumb create_dumb = { + .width = rsc->width0, + .height = rsc->height0, + .bpp = util_format_get_blocksizebits(rsc->format), + }; + struct drm_mode_destroy_dumb destroy_dumb = { }; + + scanout = CALLOC_STRUCT(renderonly_scanout); + if (!scanout) + return NULL; + + /* create dumb buffer at scanout GPU */ + err = drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb); + if (err < 0) { + fprintf(stderr, "DRM_IOCTL_MODE_CREATE_DUMB failed: %s\n", + strerror(errno)); + goto free_scanout; + } + + scanout->handle = create_dumb.handle; + scanout->stride = create_dumb.pitch; + + if (!out_handle) + return scanout; + + /* fill in winsys handle */ + memset(out_handle, 0, sizeof(*out_handle)); + out_handle->type = DRM_API_HANDLE_TYPE_FD; + out_handle->stride = create_dumb.pitch; + + err = drmPrimeHandleToFD(ro->kms_fd, create_dumb.handle, O_CLOEXEC, + (int *)&out_handle->handle); + if (err < 0) { + fprintf(stderr, "failed to export dumb buffer: %s\n", strerror(errno)); + goto free_dumb; + } + + return scanout; + +free_dumb: + destroy_dumb.handle = scanout->handle; + drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb); + +free_scanout: + FREE(scanout); + + return NULL; +} + +struct renderonly_scanout * +renderonly_create_gpu_import_for_resource(struct pipe_resource *rsc, + struct renderonly *ro, + struct winsys_handle *out_handle) +{ + struct pipe_screen *screen = rsc->screen; + struct renderonly_scanout *scanout; + boolean status; + int fd, err; + struct winsys_handle handle = { + .type = DRM_API_HANDLE_TYPE_FD + }; + + scanout = CALLOC_STRUCT(renderonly_scanout); + if (!scanout) + return NULL; + + status = screen->resource_get_handle(screen, NULL, rsc, &handle, + PIPE_HANDLE_USAGE_READ_WRITE); + if (!status) + goto free_scanout; + + scanout->stride = handle.stride; + fd = handle.handle; + + err = drmPrimeFDToHandle(ro->kms_fd, fd, &scanout->handle); + close(fd); + + if (err < 0) { + fprintf(stderr, "drmPrimeFDToHandle() failed: %s\n", strerror(errno)); + goto free_scanout; + } + + return scanout; + +free_scanout: + FREE(scanout); + + return NULL; +} + diff --git a/lib/mesa/src/gallium/auxiliary/renderonly/renderonly.h b/lib/mesa/src/gallium/auxiliary/renderonly/renderonly.h new file mode 100644 index 000000000..6a89c29e2 --- /dev/null +++ b/lib/mesa/src/gallium/auxiliary/renderonly/renderonly.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2016 Christian Gmeiner <christian.gmeiner@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Christian Gmeiner <christian.gmeiner@gmail.com> + */ + +#ifndef RENDERONLY_H +#define RENDERONLY_H + +#include <stdint.h> +#include "state_tracker/drm_driver.h" +#include "pipe/p_state.h" + +struct renderonly_scanout { + uint32_t handle; + uint32_t stride; +}; + +struct renderonly { + /** + * Create a renderonly_scanout object for scanout resource. + * + * This function creates a renderonly_scanout object based on the provided + * resource. The library is designed that the driver specific pipe_resource + * struct holds a pointer to a renderonly_scanout struct. + * + * struct driver_resource { + * struct pipe_resource base; + * struct renderonly_scanout *scanout; + * ... + * }; + * + * The renderonly_scanout object exits for two reasons: + * - Do any special treatment for a scanout resource like importing the GPU + * resource into the scanout hw. + * - Make it easier for a gallium driver to detect if anything special needs + * to be done in flush_resource(..) like a resolve to linear. + */ + struct renderonly_scanout *(*create_for_resource)(struct pipe_resource *rsc, + struct renderonly *ro, + struct winsys_handle *out_handle); + int kms_fd; + int gpu_fd; +}; + +struct renderonly * +renderonly_dup(const struct renderonly *ro); + +static inline struct renderonly_scanout * +renderonly_scanout_for_resource(struct pipe_resource *rsc, + struct renderonly *ro, + struct winsys_handle *out_handle) +{ + return ro->create_for_resource(rsc, ro, out_handle); +} + +void +renderonly_scanout_destroy(struct renderonly_scanout *scanout, + struct renderonly *ro); + +static inline boolean +renderonly_get_handle(struct renderonly_scanout *scanout, + struct winsys_handle *handle) +{ + if (!scanout) + return FALSE; + + assert(handle->type == DRM_API_HANDLE_TYPE_KMS); + handle->handle = scanout->handle; + handle->stride = scanout->stride; + + return TRUE; +} + +/** + * Create a dumb buffer object for a resource at scanout hw. + */ +struct renderonly_scanout * +renderonly_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc, + struct renderonly *ro, + struct winsys_handle *out_handle); + +/** + * Import GPU resource into scanout hw. + */ +struct renderonly_scanout * +renderonly_create_gpu_import_for_resource(struct pipe_resource *rsc, + struct renderonly *ro, + struct winsys_handle *out_handle); + +#endif /* RENDERONLY_H_ */ |