Make wlr_renderer_scissor take normal coords instead of upside-down ones

This commit is contained in:
emersion 2018-04-12 19:38:33 -04:00
parent 8f4039d799
commit 1b802d9251
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
4 changed files with 17 additions and 9 deletions

View file

@ -38,6 +38,8 @@ struct wlr_gles2_renderer {
GLuint tex_rgbx; GLuint tex_rgbx;
GLuint tex_ext; GLuint tex_ext;
} shaders; } shaders;
uint32_t viewport_width, viewport_height;
}; };
enum wlr_gles2_texture_type { enum wlr_gles2_texture_type {

View file

@ -31,11 +31,14 @@ static struct wlr_gles2_renderer *gles2_get_renderer_in_context(
static void gles2_begin(struct wlr_renderer *wlr_renderer, uint32_t width, static void gles2_begin(struct wlr_renderer *wlr_renderer, uint32_t width,
uint32_t height) { uint32_t height) {
gles2_get_renderer_in_context(wlr_renderer); struct wlr_gles2_renderer *renderer =
gles2_get_renderer_in_context(wlr_renderer);
GLES2_DEBUG_PUSH; GLES2_DEBUG_PUSH;
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
renderer->viewport_width = width;
renderer->viewport_height = height;
// enable transparency // enable transparency
glEnable(GL_BLEND); glEnable(GL_BLEND);
@ -64,11 +67,16 @@ static void gles2_clear(struct wlr_renderer *wlr_renderer,
static void gles2_scissor(struct wlr_renderer *wlr_renderer, static void gles2_scissor(struct wlr_renderer *wlr_renderer,
struct wlr_box *box) { struct wlr_box *box) {
gles2_get_renderer_in_context(wlr_renderer); struct wlr_gles2_renderer *renderer =
gles2_get_renderer_in_context(wlr_renderer);
GLES2_DEBUG_PUSH; GLES2_DEBUG_PUSH;
if (box != NULL) { if (box != NULL) {
glScissor(box->x, box->y, box->width, box->height); struct wlr_box gl_box;
wlr_box_transform(box, WL_OUTPUT_TRANSFORM_FLIPPED_180,
renderer->viewport_width, renderer->viewport_height, &gl_box);
glScissor(gl_box.x, gl_box.y, gl_box.width, gl_box.height);
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
} else { } else {
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);

View file

@ -177,9 +177,8 @@ static void scissor_output(struct roots_output *output, pixman_box32_t *rect) {
wlr_output_transformed_resolution(output->wlr_output, &ow, &oh); wlr_output_transformed_resolution(output->wlr_output, &ow, &oh);
// Scissor is in renderer coordinates, ie. upside down // Scissor is in renderer coordinates, ie. upside down
enum wl_output_transform transform = wlr_output_transform_compose( enum wl_output_transform transform =
wlr_output_transform_invert(wlr_output->transform), wlr_output_transform_invert(wlr_output->transform);
WL_OUTPUT_TRANSFORM_FLIPPED_180);
wlr_box_transform(&box, transform, ow, oh, &box); wlr_box_transform(&box, transform, ow, oh, &box);
wlr_renderer_scissor(renderer, &box); wlr_renderer_scissor(renderer, &box);

View file

@ -339,9 +339,8 @@ static void output_scissor(struct wlr_output *output, pixman_box32_t *rect) {
wlr_output_transformed_resolution(output, &ow, &oh); wlr_output_transformed_resolution(output, &ow, &oh);
// Scissor is in renderer coordinates, ie. upside down // Scissor is in renderer coordinates, ie. upside down
enum wl_output_transform transform = wlr_output_transform_compose( enum wl_output_transform transform =
wlr_output_transform_invert(output->transform), wlr_output_transform_invert(output->transform);
WL_OUTPUT_TRANSFORM_FLIPPED_180);
wlr_box_transform(&box, transform, ow, oh, &box); wlr_box_transform(&box, transform, ow, oh, &box);
wlr_renderer_scissor(renderer, &box); wlr_renderer_scissor(renderer, &box);