Let backend track transform state
This will be necessary to provide it to clients via wl_output.
This commit is contained in:
		
							parent
							
								
									e240fb0518
								
							
						
					
					
						commit
						6f5c70ac69
					
				|  | @ -178,6 +178,28 @@ static int find_id(const void *item, const void *cmp_to) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void wlr_drm_output_enable(struct wlr_output_state *output, bool enable) { | ||||||
|  | 	struct wlr_backend_state *state = | ||||||
|  | 		wl_container_of(output->renderer, state, renderer); | ||||||
|  | 	if (output->state != DRM_OUTPUT_CONNECTED) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (enable) { | ||||||
|  | 		drmModeConnectorSetProperty(state->fd, output->connector, output->props.dpms, | ||||||
|  | 			DRM_MODE_DPMS_ON); | ||||||
|  | 
 | ||||||
|  | 		// Start rendering loop again by drawing a black frame
 | ||||||
|  | 		wlr_drm_output_begin(output); | ||||||
|  | 		glClearColor(0.0, 0.0, 0.0, 1.0); | ||||||
|  | 		glClear(GL_COLOR_BUFFER_BIT); | ||||||
|  | 		wlr_drm_output_end(output); | ||||||
|  | 	} else { | ||||||
|  | 		drmModeConnectorSetProperty(state->fd, output->connector, output->props.dpms, | ||||||
|  | 			DRM_MODE_DPMS_STANDBY); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool wlr_drm_output_set_mode(struct wlr_output_state *output, | static bool wlr_drm_output_set_mode(struct wlr_output_state *output, | ||||||
| 		struct wlr_output_mode *mode) { | 		struct wlr_output_mode *mode) { | ||||||
| 	struct wlr_backend_state *state = | 	struct wlr_backend_state *state = | ||||||
|  | @ -251,26 +273,9 @@ error: | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void wlr_drm_output_enable(struct wlr_output_state *output, bool enable) { | static void wlr_drm_output_transform(struct wlr_output_state *output, | ||||||
| 	struct wlr_backend_state *state = | 		enum wl_output_transform transform) { | ||||||
| 		wl_container_of(output->renderer, state, renderer); | 	output->wlr_output->transform = transform; | ||||||
| 	if (output->state != DRM_OUTPUT_CONNECTED) { |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (enable) { |  | ||||||
| 		drmModeConnectorSetProperty(state->fd, output->connector, output->props.dpms, |  | ||||||
| 			DRM_MODE_DPMS_ON); |  | ||||||
| 
 |  | ||||||
| 		// Start rendering loop again by drawing a black frame
 |  | ||||||
| 		wlr_drm_output_begin(output); |  | ||||||
| 		glClearColor(0.0, 0.0, 0.0, 1.0); |  | ||||||
| 		glClear(GL_COLOR_BUFFER_BIT); |  | ||||||
| 		wlr_drm_output_end(output); |  | ||||||
| 	} else { |  | ||||||
| 		drmModeConnectorSetProperty(state->fd, output->connector, output->props.dpms, |  | ||||||
| 			DRM_MODE_DPMS_STANDBY); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void wlr_drm_output_destroy(struct wlr_output_state *output) { | static void wlr_drm_output_destroy(struct wlr_output_state *output) { | ||||||
|  | @ -279,8 +284,9 @@ static void wlr_drm_output_destroy(struct wlr_output_state *output) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct wlr_output_impl output_impl = { | static struct wlr_output_impl output_impl = { | ||||||
| 	.set_mode = wlr_drm_output_set_mode, |  | ||||||
| 	.enable = wlr_drm_output_enable, | 	.enable = wlr_drm_output_enable, | ||||||
|  | 	.set_mode = wlr_drm_output_set_mode, | ||||||
|  | 	.transform = wlr_drm_output_transform, | ||||||
| 	.destroy = wlr_drm_output_destroy, | 	.destroy = wlr_drm_output_destroy, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| #define _POSIX_C_SOURCE 199309L | #define _POSIX_C_SOURCE 199309L | ||||||
|  | #define _XOPEN_SOURCE 500 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <time.h> | #include <time.h> | ||||||
|  | @ -10,7 +11,7 @@ | ||||||
| #include <wlr/backend.h> | #include <wlr/backend.h> | ||||||
| #include <wlr/session.h> | #include <wlr/session.h> | ||||||
| #include <wlr/types.h> | #include <wlr/types.h> | ||||||
| #include <tgmath.h> | #include <math.h> | ||||||
| 
 | 
 | ||||||
| static const GLchar vert_src[] = | static const GLchar vert_src[] = | ||||||
| "#version 310 es\n" | "#version 310 es\n" | ||||||
|  | @ -92,7 +93,6 @@ struct output_state { | ||||||
| 	struct wlr_output *output; | 	struct wlr_output *output; | ||||||
| 	struct state *state; | 	struct state *state; | ||||||
| 	struct wl_listener frame; | 	struct wl_listener frame; | ||||||
| 	enum wl_output_transform transform; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct output_config { | struct output_config { | ||||||
|  | @ -177,7 +177,7 @@ static void output_frame(struct wl_listener *listener, void *data) { | ||||||
| 	glViewport(0, 0, width, height); | 	glViewport(0, 0, width, height); | ||||||
| 
 | 
 | ||||||
| 	// All of the odd numbered transformations involve a 90 or 270 degree rotation
 | 	// All of the odd numbered transformations involve a 90 or 270 degree rotation
 | ||||||
| 	if (ostate->transform % 2 == 1) { | 	if (ostate->output->transform % 2 == 1) { | ||||||
| 		float tmp = width; | 		float tmp = width; | ||||||
| 		width = height; | 		width = height; | ||||||
| 		height = tmp; | 		height = tmp; | ||||||
|  | @ -199,7 +199,7 @@ static void output_frame(struct wl_listener *listener, void *data) { | ||||||
| 	glBindBuffer(GL_ARRAY_BUFFER, s->gl.vbo); | 	glBindBuffer(GL_ARRAY_BUFFER, s->gl.vbo); | ||||||
| 	glBufferData(GL_ARRAY_BUFFER, sizeof(vert_data), vert_data, GL_STATIC_DRAW); | 	glBufferData(GL_ARRAY_BUFFER, sizeof(vert_data), vert_data, GL_STATIC_DRAW); | ||||||
| 
 | 
 | ||||||
| 	glUniformMatrix2fv(0, 1, GL_FALSE, transforms[ostate->transform]); | 	glUniformMatrix2fv(0, 1, GL_FALSE, transforms[ostate->output->transform]); | ||||||
| 
 | 
 | ||||||
| 	glClearColor(0.0, 0.0, 0.0, 1.0); | 	glClearColor(0.0, 0.0, 0.0, 1.0); | ||||||
| 	glClear(GL_COLOR_BUFFER_BIT); | 	glClear(GL_COLOR_BUFFER_BIT); | ||||||
|  | @ -214,7 +214,7 @@ static void output_frame(struct wl_listener *listener, void *data) { | ||||||
| 
 | 
 | ||||||
| 	s->last_frame = now; | 	s->last_frame = now; | ||||||
| 	s->angle += ms / 200.0f; | 	s->angle += ms / 200.0f; | ||||||
| 	if (s->angle > 6.28318530718f) { // 2 pi
 | 	if (s->angle > 2 * M_PI) { | ||||||
| 		s->angle = 0.0f; | 		s->angle = 0.0f; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -231,12 +231,11 @@ static void output_add(struct wl_listener *listener, void *data) { | ||||||
| 	ostate->output = output; | 	ostate->output = output; | ||||||
| 	ostate->state = state; | 	ostate->state = state; | ||||||
| 	ostate->frame.notify = output_frame; | 	ostate->frame.notify = output_frame; | ||||||
| 	ostate->transform = WL_OUTPUT_TRANSFORM_NORMAL; |  | ||||||
| 
 | 
 | ||||||
| 	struct output_config *conf; | 	struct output_config *conf; | ||||||
| 	wl_list_for_each(conf, &state->config, link) { | 	wl_list_for_each(conf, &state->config, link) { | ||||||
| 		if (strcmp(conf->name, output->name) == 0) { | 		if (strcmp(conf->name, output->name) == 0) { | ||||||
| 			ostate->transform = conf->transform; | 			wlr_output_transform(ostate->output, conf->transform); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -6,8 +6,11 @@ | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| 
 | 
 | ||||||
| struct wlr_output_impl { | struct wlr_output_impl { | ||||||
| 	bool (*set_mode)(struct wlr_output_state *state, struct wlr_output_mode *mode); |  | ||||||
| 	void (*enable)(struct wlr_output_state *state, bool enable); | 	void (*enable)(struct wlr_output_state *state, bool enable); | ||||||
|  | 	bool (*set_mode)(struct wlr_output_state *state, | ||||||
|  | 			struct wlr_output_mode *mode); | ||||||
|  | 	void (*transform)(struct wlr_output_state *state, | ||||||
|  | 			enum wl_output_transform transform); | ||||||
| 	void (*destroy)(struct wlr_output_state *state); | 	void (*destroy)(struct wlr_output_state *state); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -40,8 +40,11 @@ struct wlr_output { | ||||||
| 	} events; | 	} events; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| bool wlr_output_set_mode(struct wlr_output *output, struct wlr_output_mode *mode); |  | ||||||
| void wlr_output_enable(struct wlr_output *output, bool enable); | void wlr_output_enable(struct wlr_output *output, bool enable); | ||||||
|  | bool wlr_output_set_mode(struct wlr_output *output, | ||||||
|  | 		struct wlr_output_mode *mode); | ||||||
|  | void wlr_output_transform(struct wlr_output *output, | ||||||
|  | 		enum wl_output_transform transform); | ||||||
| void wlr_output_destroy(struct wlr_output *output); | void wlr_output_destroy(struct wlr_output *output); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -10,10 +10,24 @@ struct wlr_output *wlr_output_create(struct wlr_output_impl *impl, | ||||||
| 	output->impl = impl; | 	output->impl = impl; | ||||||
| 	output->state = state; | 	output->state = state; | ||||||
| 	output->modes = list_create(); | 	output->modes = list_create(); | ||||||
|  | 	output->transform = WL_OUTPUT_TRANSFORM_NORMAL; | ||||||
| 	wl_signal_init(&output->events.frame); | 	wl_signal_init(&output->events.frame); | ||||||
| 	return output; | 	return output; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void wlr_output_enable(struct wlr_output *output, bool enable) { | ||||||
|  | 	output->impl->enable(output->state, enable); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool wlr_output_set_mode(struct wlr_output *output, struct wlr_output_mode *mode) { | ||||||
|  | 	return output->impl->set_mode(output->state, mode); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void wlr_output_transform(struct wlr_output *output, | ||||||
|  | 		enum wl_output_transform transform) { | ||||||
|  | 	output->impl->transform(output->state, transform); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void wlr_output_destroy(struct wlr_output *output) { | void wlr_output_destroy(struct wlr_output *output) { | ||||||
| 	if (!output) return; | 	if (!output) return; | ||||||
| 	output->impl->destroy(output->state); | 	output->impl->destroy(output->state); | ||||||
|  | @ -25,11 +39,3 @@ void wlr_output_destroy(struct wlr_output *output) { | ||||||
| 	list_free(output->modes); | 	list_free(output->modes); | ||||||
| 	free(output); | 	free(output); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| bool wlr_output_set_mode(struct wlr_output *output, struct wlr_output_mode *mode) { |  | ||||||
| 	return output->impl->set_mode(output->state, mode); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void wlr_output_enable(struct wlr_output *output, bool enable) { |  | ||||||
| 	output->impl->enable(output->state, enable); |  | ||||||
| } |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue