2 * Copyright (C) 2016 Christian Gmeiner <christian.gmeiner@gmail.com>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 * Christian Gmeiner <christian.gmeiner@gmail.com>
27 #include "renderonly/renderonly.h"
34 #include "frontend/drm_driver.h"
35 #include "pipe/p_screen.h"
36 #include "util/format/u_format.h"
37 #include "util/u_inlines.h"
38 #include "util/u_memory.h"
41 renderonly_dup(const struct renderonly
*ro
)
43 struct renderonly
*copy
;
45 copy
= CALLOC_STRUCT(renderonly
);
49 memcpy(copy
, ro
, sizeof(*ro
));
55 renderonly_scanout_destroy(struct renderonly_scanout
*scanout
,
56 struct renderonly
*ro
)
58 struct drm_mode_destroy_dumb destroy_dumb
= {0};
60 if (ro
->kms_fd
!= -1) {
61 destroy_dumb
.handle
= scanout
->handle
;
62 drmIoctl(ro
->kms_fd
, DRM_IOCTL_MODE_DESTROY_DUMB
, &destroy_dumb
);
67 struct renderonly_scanout
*
68 renderonly_create_kms_dumb_buffer_for_resource(struct pipe_resource
*rsc
,
69 struct renderonly
*ro
,
70 struct winsys_handle
*out_handle
)
72 struct renderonly_scanout
*scanout
;
74 struct drm_mode_create_dumb create_dumb
= {
76 .height
= rsc
->height0
,
77 .bpp
= util_format_get_blocksizebits(rsc
->format
),
79 struct drm_mode_destroy_dumb destroy_dumb
= {0};
81 scanout
= CALLOC_STRUCT(renderonly_scanout
);
85 /* create dumb buffer at scanout GPU */
86 err
= drmIoctl(ro
->kms_fd
, DRM_IOCTL_MODE_CREATE_DUMB
, &create_dumb
);
88 fprintf(stderr
, "DRM_IOCTL_MODE_CREATE_DUMB failed: %s\n",
93 scanout
->handle
= create_dumb
.handle
;
94 scanout
->stride
= create_dumb
.pitch
;
99 /* fill in winsys handle */
100 memset(out_handle
, 0, sizeof(*out_handle
));
101 out_handle
->type
= WINSYS_HANDLE_TYPE_FD
;
102 out_handle
->stride
= create_dumb
.pitch
;
104 err
= drmPrimeHandleToFD(ro
->kms_fd
, create_dumb
.handle
, O_CLOEXEC
,
105 (int *)&out_handle
->handle
);
107 fprintf(stderr
, "failed to export dumb buffer: %s\n", strerror(errno
));
114 destroy_dumb
.handle
= scanout
->handle
;
115 drmIoctl(ro
->kms_fd
, DRM_IOCTL_MODE_DESTROY_DUMB
, &destroy_dumb
);
123 struct renderonly_scanout
*
124 renderonly_create_gpu_import_for_resource(struct pipe_resource
*rsc
,
125 struct renderonly
*ro
,
126 struct winsys_handle
*out_handle
)
128 struct pipe_screen
*screen
= rsc
->screen
;
129 struct renderonly_scanout
*scanout
;
132 struct winsys_handle handle
= {
133 .type
= WINSYS_HANDLE_TYPE_FD
136 scanout
= CALLOC_STRUCT(renderonly_scanout
);
140 status
= screen
->resource_get_handle(screen
, NULL
, rsc
, &handle
,
141 PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE
);
145 scanout
->stride
= handle
.stride
;
148 err
= drmPrimeFDToHandle(ro
->kms_fd
, fd
, &scanout
->handle
);
152 fprintf(stderr
, "drmPrimeFDToHandle() failed: %s\n", strerror(errno
));