Use transformed geometry for frame buffers

pull/20/head
Andri Yngvason 2020-03-05 21:57:46 +00:00
parent 9642e086d8
commit c32993d87d
2 changed files with 19 additions and 11 deletions

View File

@ -434,8 +434,8 @@ int init_nvnc(struct wayvnc* self, const char* addr, uint16_t port)
nvnc_set_name(self->nvnc, "WayVNC"); nvnc_set_name(self->nvnc, "WayVNC");
nvnc_set_dimensions(self->nvnc, nvnc_set_dimensions(self->nvnc,
self->selected_output->width, output_get_transformed_width(self->selected_output),
self->selected_output->height, output_get_transformed_height(self->selected_output),
format); format);
if (self->cfg.enable_auth) if (self->cfg.enable_auth)
@ -508,11 +508,14 @@ void wayvnc_process_frame(struct wayvnc* self)
uint32_t format = fourcc_from_gl_format(self->renderer.read_format); uint32_t format = fourcc_from_gl_format(self->renderer.read_format);
struct dmabuf_frame* frame = &self->dmabuf_backend.frame; struct dmabuf_frame* frame = &self->dmabuf_backend.frame;
struct nvnc_fb* fb = nvnc_fb_new(frame->width, frame->height, format); uint32_t fb_width = output_get_transformed_width(self->selected_output);
uint32_t fb_height =
output_get_transformed_height(self->selected_output);
struct nvnc_fb* fb = nvnc_fb_new(fb_width, fb_height, format);
void* addr = nvnc_fb_get_addr(fb); void* addr = nvnc_fb_get_addr(fb);
render_dmabuf_frame(&self->renderer, frame); render_dmabuf_frame(&self->renderer, frame);
render_copy_pixels(&self->renderer, addr, 0, frame->height); render_copy_pixels(&self->renderer, addr, 0, fb_height);
wayvnc_update_vnc(self, fb); wayvnc_update_vnc(self, fb);
} }
@ -529,12 +532,15 @@ void wayvnc_process_screen(struct wayvnc* self)
uint32_t stride = self->capture_backend->frame_info.stride; uint32_t stride = self->capture_backend->frame_info.stride;
uint32_t frame_format = self->capture_backend->frame_info.fourcc_format; uint32_t frame_format = self->capture_backend->frame_info.fourcc_format;
struct nvnc_fb* fb = nvnc_fb_new(width, height, renderer_format); uint32_t fb_width = output_get_transformed_width(self->selected_output);
uint32_t fb_height =
output_get_transformed_height(self->selected_output);
struct nvnc_fb* fb = nvnc_fb_new(fb_width, fb_height, renderer_format);
void* addr = nvnc_fb_get_addr(fb); void* addr = nvnc_fb_get_addr(fb);
render_framebuffer(&self->renderer, pixels, frame_format, width, height, render_framebuffer(&self->renderer, pixels, frame_format, width, height,
stride); stride);
render_copy_pixels(&self->renderer, addr, 0, height); render_copy_pixels(&self->renderer, addr, 0, fb_height);
wayvnc_update_vnc(self, fb); wayvnc_update_vnc(self, fb);
} }

View File

@ -414,8 +414,8 @@ int renderer_init(struct renderer* self, const struct output* output,
return -1; return -1;
EGLint surf_attr[] = { EGLint surf_attr[] = {
EGL_WIDTH, output->width, EGL_WIDTH, output_get_transformed_width(output),
EGL_HEIGHT, output->width, EGL_HEIGHT, output_get_transformed_height(output),
EGL_NONE EGL_NONE
}; };
@ -576,8 +576,10 @@ int render_framebuffer(struct renderer* self, const void* addr, uint32_t format,
void render_copy_pixels(struct renderer* self, void* dst, uint32_t y, void render_copy_pixels(struct renderer* self, void* dst, uint32_t y,
uint32_t height) uint32_t height)
{ {
assert(y + height <= self->output->height); assert(y + height <= output_get_transformed_height(self->output));
glReadPixels(0, y, self->output->width, height, self->read_format, uint32_t width = output_get_transformed_width(self->output);
self->read_type, dst);
glReadPixels(0, y, width, height, self->read_format, self->read_type,
dst);
} }