parent
							
								
									e9d716fc0c
								
							
						
					
					
						commit
						e446a5300b
					
				| @ -0,0 +1,39 @@ | ||||
| #.rst: | ||||
| # FindGBM | ||||
| # ------- | ||||
| # | ||||
| # Find GBM library | ||||
| # | ||||
| # Try to find GBM library on UNIX systems. The following values are defined | ||||
| # | ||||
| # :: | ||||
| # | ||||
| #   GBM_FOUND         - True if gbm is available | ||||
| #   GBM_INCLUDE_DIRS  - Include directories for gbm | ||||
| #   GBM_LIBRARIES     - List of libraries for gbm | ||||
| #   GBM_DEFINITIONS   - List of definitions for gbm | ||||
| # | ||||
| #============================================================================= | ||||
| # Copyright (c) 2015 Jari Vetoniemi | ||||
| # | ||||
| # Distributed under the OSI-approved BSD License (the "License"); | ||||
| # | ||||
| # This software is distributed WITHOUT ANY WARRANTY; without even the | ||||
| # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
| # See the License for more information. | ||||
| #============================================================================= | ||||
| 
 | ||||
| set_package_properties(GBM PROPERTIES | ||||
|    URL "http://www.mesa3d.org/" | ||||
|    DESCRIPTION "Generic buffer manager") | ||||
| 
 | ||||
| find_package(PkgConfig) | ||||
| pkg_check_modules(PC_GBM QUIET gbm) | ||||
| find_library(GBM_LIBRARIES NAMES gbm HINTS ${PC_GBM_LIBRARY_DIRS}) | ||||
| find_path(GBM_INCLUDE_DIRS gbm.h HINTS ${PC_GBM_INCLUDE_DIRS}) | ||||
| 
 | ||||
| set(GBM_DEFINITIONS ${PC_GBM_CFLAGS_OTHER}) | ||||
| 
 | ||||
| include(FindPackageHandleStandardArgs) | ||||
| find_package_handle_standard_args(GBM DEFAULT_MSG GBM_INCLUDE_DIRS GBM_LIBRARIES) | ||||
| mark_as_advanced(GBM_INCLUDE_DIRS GBM_LIBRARIES GBM_DEFINITIONS) | ||||
| @ -0,0 +1,109 @@ | ||||
| #define _POSIX_C_SOURCE 199309L | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <time.h> | ||||
| #include <wayland-server.h> | ||||
| #include <GLES3/gl3.h> | ||||
| 
 | ||||
| #include <wlr/backend/drm.h> | ||||
| 
 | ||||
| struct state { | ||||
| 	float color[3]; | ||||
| 	int dec; | ||||
| 
 | ||||
| 	struct timespec last_frame; | ||||
| 
 | ||||
| 	struct wl_listener add; | ||||
| 	struct wl_listener rem; | ||||
| 	struct wl_listener render; | ||||
| }; | ||||
| 
 | ||||
| void display_add(struct wl_listener *listener, void *data) | ||||
| { | ||||
| 	struct wlr_drm_display *disp = data; | ||||
| 
 | ||||
| 	fprintf(stderr, "Display added\n"); | ||||
| 	wlr_drm_display_modeset(disp, "preferred"); | ||||
| } | ||||
| 
 | ||||
| void display_rem(struct wl_listener *listener, void *data) | ||||
| { | ||||
| 	fprintf(stderr, "Display removed\n"); | ||||
| } | ||||
| 
 | ||||
| void display_render(struct wl_listener *listener, void *data) | ||||
| { | ||||
| 	struct wlr_drm_display *disp = data; | ||||
| 	struct state *s = wl_container_of(listener, s, render); | ||||
| 
 | ||||
| 	struct timespec now; | ||||
| 	clock_gettime(CLOCK_MONOTONIC, &now); | ||||
| 
 | ||||
| 	long ms = (now.tv_sec - s->last_frame.tv_sec) * 1000 + | ||||
| 		(now.tv_nsec - s->last_frame.tv_nsec) / 1000000; | ||||
| 	int inc = (s->dec + 1) % 3; | ||||
| 
 | ||||
| 	s->color[inc] += ms / 2000.0f; | ||||
| 	s->color[s->dec] -= ms / 2000.0f; | ||||
| 
 | ||||
| 	if (s->color[s->dec] < 0.0f) { | ||||
| 		s->color[inc] = 1.0f; | ||||
| 		s->color[s->dec] = 0.0f; | ||||
| 
 | ||||
| 		s->dec = inc; | ||||
| 	} | ||||
| 
 | ||||
| 	s->last_frame = now; | ||||
| 
 | ||||
| 	wlr_drm_display_begin(disp); | ||||
| 
 | ||||
| 	glClearColor(s->color[0], s->color[1], s->color[2], 1.0); | ||||
| 	glClear(GL_COLOR_BUFFER_BIT); | ||||
| 
 | ||||
| 	wlr_drm_display_end(disp); | ||||
| } | ||||
| 
 | ||||
| int timer_done(void *data) | ||||
| { | ||||
| 	*(bool *)data = true; | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
| 	if (getenv("DISPLAY")) { | ||||
| 		fprintf(stderr, "Detected that X is running. Run this in its own virtual terminal.\n"); | ||||
| 		return 1; | ||||
| 	} else if (getenv("WAYLAND_DISPLAY")) { | ||||
| 		fprintf(stderr, "Detected that Wayland is running. Run this in its own virtual terminal.\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	struct state state = { | ||||
| 		.color = { 1.0, 0.0, 0.0 }, | ||||
| 		.dec = 0, | ||||
| 		.add = { .notify = display_add }, | ||||
| 		.rem = { .notify = display_rem }, | ||||
| 		.render = { .notify = display_render }, | ||||
| 	}; | ||||
| 
 | ||||
| 	wl_list_init(&state.add.link); | ||||
| 	wl_list_init(&state.rem.link); | ||||
| 	wl_list_init(&state.render.link); | ||||
| 	clock_gettime(CLOCK_MONOTONIC, &state.last_frame); | ||||
| 
 | ||||
| 	struct wlr_drm_backend *wlr = wlr_drm_backend_init(&state.add, &state.rem, &state.render); | ||||
| 
 | ||||
| 	bool done = false; | ||||
| 	struct wl_event_loop *event_loop = wlr_drm_backend_get_event_loop(wlr); | ||||
| 	struct wl_event_source *timer = wl_event_loop_add_timer(event_loop, | ||||
| 		timer_done, &done); | ||||
| 
 | ||||
| 	wl_event_source_timer_update(timer, 10000); | ||||
| 
 | ||||
| 	while (!done) | ||||
| 		wl_event_loop_dispatch(event_loop, 0); | ||||
| 
 | ||||
| 	wl_event_source_remove(timer); | ||||
| 	wlr_drm_backend_free(wlr); | ||||
| } | ||||
| @ -0,0 +1,20 @@ | ||||
| #ifndef WLR_BACKEND_DRM_H | ||||
| #define WLR_BACKEND_DRM_H | ||||
| 
 | ||||
| #include <wayland-server.h> | ||||
| 
 | ||||
| struct wlr_drm_backend; | ||||
| struct wlr_drm_display; | ||||
| 
 | ||||
| struct wlr_drm_backend *wlr_drm_backend_init(struct wl_listener *add, | ||||
| 		struct wl_listener *rem, | ||||
| 		struct wl_listener *render); | ||||
| void wlr_drm_backend_free(struct wlr_drm_backend *backend); | ||||
| 
 | ||||
| struct wl_event_loop *wlr_drm_backend_get_event_loop(struct wlr_drm_backend *backend); | ||||
| 
 | ||||
| bool wlr_drm_display_modeset(struct wlr_drm_display *disp, const char *str); | ||||
| void wlr_drm_display_begin(struct wlr_drm_display *disp); | ||||
| void wlr_drm_display_end(struct wlr_drm_display *disp); | ||||
| 
 | ||||
| #endif | ||||
					Loading…
					
					
				
		Reference in new issue