Lines Matching +full:use +full:- +full:base +full:- +full:image
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
44 #define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1))
56 struct overlay base; member
57 struct kms_image image; member
73 static int kms_create_fb(int fd, struct kms_image *image) in kms_create_fb() argument
77 handles[0] = image->handle; in kms_create_fb()
78 pitches[0] = image->stride; in kms_create_fb()
82 image->width, image->height, image->format, in kms_create_fb()
84 &image->name, 0) == 0; in kms_create_fb()
87 static int attach_to_crtc(int fd, int crtc, int x, int y, struct kms_image *image) in attach_to_crtc() argument
92 s.fb_id = image->name; in attach_to_crtc()
96 s.crtc_w = image->width; in attach_to_crtc()
97 s.crtc_h = image->height; in attach_to_crtc()
100 s.src_w = image->width << 16; in attach_to_crtc()
101 s.src_h = image->height << 16; in attach_to_crtc()
119 memcpy(priv->image.map, priv->mem, priv->size); in kms_overlay_show()
121 if (!priv->visible) { in kms_overlay_show()
122 attach_to_crtc(priv->fd, priv->crtc, priv->x, priv->y, &priv->image); in kms_overlay_show()
123 priv->visible = true; in kms_overlay_show()
131 if (priv->visible) { in kms_overlay_hide()
132 detach_from_crtc(priv->fd, priv->crtc); in kms_overlay_hide()
133 priv->visible = false; in kms_overlay_hide()
140 drmIoctl(priv->fd, DRM_IOCTL_MODE_RMFB, &priv->image.name); in kms_overlay_destroy()
141 munmap(priv->image.map, priv->image.size); in kms_overlay_destroy()
142 free(priv->mem); in kms_overlay_destroy()
143 close(priv->fd); in kms_overlay_destroy()
194 if (fd == -1) in i915_open()
204 return -1; in i915_open()
231 priv->fd = i915_open(); in kms_overlay_create()
232 if (priv->fd == -1) in kms_overlay_create()
235 kmode = drmModeGetResources(priv->fd); in kms_overlay_create()
240 priv->crtc = 0; in kms_overlay_create()
242 for (i = 0; i < kmode->count_crtcs; i++) { in kms_overlay_create()
246 get_pipe.crtc_id = kmode->crtcs[i]; in kms_overlay_create()
247 if (drmIoctl(priv->fd, in kms_overlay_create()
256 priv->crtc = get_pipe.crtc_id; in kms_overlay_create()
259 if (priv->crtc == 0) in kms_overlay_create()
262 priv->image.format = DRM_FORMAT_XRGB8888; in kms_overlay_create()
263 priv->image.width = ALIGN(*width, 4); in kms_overlay_create()
264 priv->image.height = ALIGN(*height, 2); in kms_overlay_create()
265 priv->image.stride = ALIGN(4*priv->image.width, 64); in kms_overlay_create()
266 priv->image.size = ALIGN(priv->image.stride * priv->image.height, 4096); in kms_overlay_create()
269 create.size = ALIGN(priv->image.size, 4096); in kms_overlay_create()
270 drmIoctl(priv->fd, DRM_IOCTL_I915_GEM_CREATE, &create); in kms_overlay_create()
274 priv->image.handle = create.handle; in kms_overlay_create()
276 if (!kms_create_fb(priv->fd, &priv->image)) in kms_overlay_create()
281 if (!attach_to_crtc(priv->fd, priv->crtc, 0, 0, &priv->image)) in kms_overlay_create()
283 detach_from_crtc(priv->fd, priv->crtc); in kms_overlay_create()
286 if (drmIoctl(priv->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &map)) in kms_overlay_create()
289 priv->image.map = mmap(0, create.size, PROT_READ | PROT_WRITE, MAP_SHARED, priv->fd, map.offset); in kms_overlay_create()
290 if (priv->image.map == (void *)-1) in kms_overlay_create()
293 priv->mem = malloc(create.size); in kms_overlay_create()
294 if (priv->mem == NULL) in kms_overlay_create()
297 priv->base.surface = in kms_overlay_create()
298 cairo_image_surface_create_for_data(priv->mem, in kms_overlay_create()
300 priv->image.width, in kms_overlay_create()
301 priv->image.height, in kms_overlay_create()
302 priv->image.stride); in kms_overlay_create()
303 if (cairo_surface_status(priv->base.surface)) in kms_overlay_create()
306 priv->base.show = kms_overlay_show; in kms_overlay_create()
307 priv->base.hide = kms_overlay_hide; in kms_overlay_create()
309 priv->visible = false; in kms_overlay_create()
310 priv->x = 0; in kms_overlay_create()
311 priv->y = 0; in kms_overlay_create()
313 cairo_surface_set_user_data(priv->base.surface, &overlay_key, priv, kms_overlay_destroy); in kms_overlay_create()
315 *width = priv->image.width; in kms_overlay_create()
316 *height = priv->image.height; in kms_overlay_create()
318 drmIoctl(priv->fd, DRM_IOCTL_GEM_CLOSE, &create.handle); in kms_overlay_create()
319 return priv->base.surface; in kms_overlay_create()
322 free(priv->mem); in kms_overlay_create()
324 munmap(priv->image.map, create.size); in kms_overlay_create()
326 drmIoctl(priv->fd, DRM_IOCTL_MODE_RMFB, &priv->image.name); in kms_overlay_create()
328 drmIoctl(priv->fd, DRM_IOCTL_GEM_CLOSE, &create.handle); in kms_overlay_create()
330 close(priv->fd); in kms_overlay_create()