| /* |
| * Copyright 2016 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef __BS_DRM_H__ |
| #define __BS_DRM_H__ |
| |
| #define _GNU_SOURCE |
| #include <EGL/egl.h> |
| #include <EGL/eglext.h> |
| #include <GLES2/gl2.h> |
| #include <GLES2/gl2ext.h> |
| #include <assert.h> |
| #include <drm_fourcc.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <gbm.h> |
| #include <stdarg.h> |
| #include <stdbool.h> |
| #include <stddef.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/mman.h> |
| #include <sys/types.h> |
| #include <time.h> |
| #include <unistd.h> |
| #include <xf86drm.h> |
| #include <xf86drmMode.h> |
| |
| #define bs_rank_skip UINT32_MAX |
| |
| #define BS_ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0])) |
| |
| #define BS_ALIGN(a, alignment) ((a + (alignment - 1)) & ~(alignment - 1)) |
| |
| // debug.c |
| __attribute__((format(printf, 5, 6))) void bs_debug_print(const char *prefix, const char *func, |
| const char *file, int line, |
| const char *format, ...); |
| #define bs_debug_error(...) \ |
| do { \ |
| bs_debug_print("ERROR", __func__, __FILE__, __LINE__, __VA_ARGS__); \ |
| } while (0) |
| |
| #define bs_debug_warning(...) \ |
| do { \ |
| bs_debug_print("WARN", __func__, __FILE__, __LINE__, __VA_ARGS__); \ |
| } while (0) |
| |
| int64_t bs_debug_gettime_ns(); |
| |
| // pipe.c |
| typedef bool (*bs_make_pipe_piece)(void *context, void *out); |
| |
| bool bs_pipe_make(void *context, bs_make_pipe_piece *pieces, size_t piece_count, void *out_pipe, |
| size_t pipe_size); |
| |
| // open.c |
| |
| // A return value of true causes enumeration to end immediately. fd is always |
| // closed after the callback. |
| typedef bool (*bs_open_enumerate_func)(void *user, int fd); |
| |
| // A return value of true causes the filter to return the given fd. |
| typedef bool (*bs_open_filter_func)(int fd); |
| |
| // The fd with the lowest (magnitude) rank is returned. A fd with rank UINT32_MAX is skipped. A fd |
| // with rank 0 ends the enumeration early and is returned. On a tie, the fd returned will be |
| // arbitrarily chosen from the set of lowest rank fds. |
| typedef uint32_t (*bs_open_rank_func)(int fd); |
| |
| void bs_open_enumerate(const char *format, unsigned start, unsigned end, |
| bs_open_enumerate_func body, void *user); |
| int bs_open_filtered(const char *format, unsigned start, unsigned end, bs_open_filter_func filter); |
| int bs_open_ranked(const char *format, unsigned start, unsigned end, bs_open_rank_func rank); |
| |
| // drm_connectors.c |
| #define bs_drm_connectors_any UINT32_MAX |
| |
| // Interleaved arrays in the layout { DRM_MODE_CONNECTOR_*, rank, DRM_MODE_CONNECTOR_*, rank, ... }, |
| // terminated by { ... 0, 0 }. bs_drm_connectors_any can be used in place of DRM_MODE_CONNECTOR_* to |
| // match any connector. bs_rank_skip can be used in place of a rank to indicate that that connector |
| // should be skipped. |
| |
| // Use internal connectors and fallback to any connector |
| extern const uint32_t bs_drm_connectors_main_rank[]; |
| // Use only internal connectors |
| extern const uint32_t bs_drm_connectors_internal_rank[]; |
| // Use only external connectors |
| extern const uint32_t bs_drm_connectors_external_rank[]; |
| |
| uint32_t bs_drm_connectors_rank(const uint32_t *ranks, uint32_t connector_type); |
| |
| // drm_pipe.c |
| struct bs_drm_pipe { |
| int fd; // Always owned by the user of this library |
| uint32_t connector_id; |
| uint32_t encoder_id; |
| uint32_t crtc_id; |
| }; |
| struct bs_drm_pipe_plumber; |
| |
| // A class that makes pipes with certain constraints. |
| struct bs_drm_pipe_plumber *bs_drm_pipe_plumber_new(); |
| void bs_drm_pipe_plumber_destroy(struct bs_drm_pipe_plumber **); |
| // Takes ranks in the rank array format from drm_connectors.c. Lifetime of connector_ranks must |
| // exceed the plumber |
| void bs_drm_pipe_plumber_connector_ranks(struct bs_drm_pipe_plumber *, |
| const uint32_t *connector_ranks); |
| // crtc_mask is in the same format as drmModeEncoder.possible_crtcs |
| void bs_drm_pipe_plumber_crtc_mask(struct bs_drm_pipe_plumber *, uint32_t crtc_mask); |
| // Sets which card fd the plumber should use. The fd remains owned by the caller. If left unset, |
| // bs_drm_pipe_plumber_make will try all available cards. |
| void bs_drm_pipe_plumber_fd(struct bs_drm_pipe_plumber *, int card_fd); |
| // Sets a pointer to store the chosen connector in after a succesful call to |
| // bs_drm_pipe_plumber_make. It's optional, but calling drmModeGetConnector yourself can be slow. |
| void bs_drm_pipe_plumber_connector_ptr(struct bs_drm_pipe_plumber *, drmModeConnector **ptr); |
| // Makes the pipe based on the constraints of the plumber. Returns false if no pipe worked. |
| bool bs_drm_pipe_plumber_make(struct bs_drm_pipe_plumber *, struct bs_drm_pipe *pipe); |
| |
| // Makes any pipe that will work for the given card fd. Returns false if no pipe worked. |
| bool bs_drm_pipe_make(int fd, struct bs_drm_pipe *pipe); |
| |
| // drm_fb.c |
| struct bs_drm_fb_builder; |
| |
| // A builder class used to collect drm framebuffer parameters and then build it. |
| struct bs_drm_fb_builder *bs_drm_fb_builder_new(); |
| void bs_drm_fb_builder_destroy(struct bs_drm_fb_builder **); |
| // Copies all available framebuffer parameters from the given buffer object. |
| void bs_drm_fb_builder_gbm_bo(struct bs_drm_fb_builder *, struct gbm_bo *bo); |
| // Sets the drm format parameter of the resulting framebuffer. |
| void bs_drm_fb_builder_format(struct bs_drm_fb_builder *, uint32_t format); |
| // Creates the framebuffer ID from the previously set parameters and returns it or 0 if there was a |
| // failure. |
| uint32_t bs_drm_fb_builder_create_fb(struct bs_drm_fb_builder *); |
| |
| // Creates a drm framebuffer from the given buffer object and returns the framebuffer's ID on |
| // success or 0 on failure. |
| uint32_t bs_drm_fb_create_gbm(struct gbm_bo *bo); |
| |
| // drm_open.c |
| // Opens an arbitrary display's card. |
| int bs_drm_open_for_display(); |
| // Opens the main display's card. This falls back to bs_drm_open_for_display(). |
| int bs_drm_open_main_display(); |
| int bs_drm_open_vgem(); |
| |
| // egl.c |
| struct bs_egl; |
| struct bs_egl_fb; |
| |
| struct bs_egl *bs_egl_new(); |
| void bs_egl_destroy(struct bs_egl **egl); |
| // initialize opengl. |
| // use null platform when render_driver is null. |
| // render_driver is drm driver name for GL driver to use |
| bool bs_egl_setup(struct bs_egl *self, const char *render_driver); |
| bool bs_egl_make_current(struct bs_egl *self); |
| |
| EGLImageKHR bs_egl_image_create_gbm(struct bs_egl *self, struct gbm_bo *bo); |
| void bs_egl_image_destroy(struct bs_egl *self, EGLImageKHR *image); |
| bool bs_egl_image_flush_external(struct bs_egl *self, EGLImageKHR image); |
| |
| EGLSyncKHR bs_egl_create_sync(struct bs_egl *self, EGLenum type, const EGLint *attrib_list); |
| EGLint bs_egl_wait_sync(struct bs_egl *self, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); |
| EGLBoolean bs_egl_destroy_sync(struct bs_egl *self, EGLSyncKHR sync); |
| |
| struct bs_egl_fb *bs_egl_fb_new(struct bs_egl *self, EGLImageKHR image); |
| bool bs_egl_target_texture2D(struct bs_egl *self, EGLImageKHR image); |
| bool bs_egl_has_extension(const char *extension, const char *extensions); |
| void bs_egl_fb_destroy(struct bs_egl_fb **fb); |
| GLuint bs_egl_fb_name(struct bs_egl_fb *self); |
| |
| // gl.c |
| // The entry after the last valid binding should have name == NULL. The binding array is terminated |
| // by a NULL name. |
| struct bs_gl_program_create_binding { |
| // These parameters are passed to glBindAttribLocation |
| GLuint index; |
| const GLchar *name; |
| }; |
| |
| GLuint bs_gl_shader_create(GLenum type, const GLchar *src); |
| // bindings can be NULL. |
| GLuint bs_gl_program_create_vert_frag_bind(const GLchar *vert_src, const GLchar *frag_src, |
| struct bs_gl_program_create_binding *bindings); |
| |
| // app.c |
| struct bs_app; |
| |
| struct bs_app *bs_app_new(); |
| void bs_app_destroy(struct bs_app **app); |
| int bs_app_fd(struct bs_app *self); |
| size_t bs_app_fb_count(struct bs_app *self); |
| void bs_app_set_fb_count(struct bs_app *self, size_t fb_count); |
| struct gbm_bo *bs_app_fb_bo(struct bs_app *self, size_t index); |
| uint32_t bs_app_fb_id(struct bs_app *self, size_t index); |
| bool bs_app_setup(struct bs_app *self); |
| int bs_app_display_fb(struct bs_app *self, size_t index); |
| |
| // mmap.c |
| struct bs_mapper; |
| struct bs_mapper *bs_mapper_dma_buf_new(); |
| struct bs_mapper *bs_mapper_gem_new(); |
| struct bs_mapper *bs_mapper_dumb_new(int device_fd); |
| void bs_mapper_destroy(struct bs_mapper *mapper); |
| void *bs_mapper_map(struct bs_mapper *mapper, struct gbm_bo *bo, size_t plane, void **map_data, |
| uint32_t *stride); |
| void bs_mapper_unmap(struct bs_mapper *mapper, struct gbm_bo *bo, void *map_data); |
| |
| // draw.c |
| |
| struct bs_draw_format; |
| |
| bool bs_draw_stripe(struct bs_mapper *mapper, struct gbm_bo *bo, |
| const struct bs_draw_format *format); |
| bool bs_draw_transparent_hole(struct bs_mapper *mapper, struct gbm_bo *bo, |
| const struct bs_draw_format *format); |
| |
| bool bs_draw_ellipse(struct bs_mapper *mapper, struct gbm_bo *bo, |
| const struct bs_draw_format *format, float progress); |
| bool bs_draw_cursor(struct bs_mapper *mapper, struct gbm_bo *bo, |
| const struct bs_draw_format *format); |
| bool bs_draw_lines(struct bs_mapper *mapper, struct gbm_bo *bo, |
| const struct bs_draw_format *format); |
| const struct bs_draw_format *bs_get_draw_format(uint32_t pixel_format); |
| const struct bs_draw_format *bs_get_draw_format_from_name(const char *str); |
| uint32_t bs_get_pixel_format(const struct bs_draw_format *format); |
| const char *bs_get_format_name(const struct bs_draw_format *format); |
| bool bs_parse_draw_format(const char *str, const struct bs_draw_format **format); |
| |
| // kms.c |
| void bs_print_supported_modifiers(int fd); |
| bool bs_are_modifier_supported(int fd, int drm_plane_type); |
| uint64_t bs_string_to_modifier(char *modifier_str); |
| uint32_t bs_drm_find_property_id(int fd, uint32_t object_id, uint32_t object_type, |
| const char *property_name); |
| unsigned int bs_get_crtc_bitmask(int fd, uint32_t crtc_id); |
| uint32_t bs_get_plane_id(int fd, uint32_t crtc_id); |
| |
| #endif |