From: Juan Zhao <juan.j.z...@linux.intel.com>

add set_fullscreen method for surface and upate the fullscreen rendering part
---
 compositor/compositor.c |   83 ++++++++++++++++++++++++++++++++++++++++-------
 compositor/compositor.h |    5 +++
 2 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/compositor/compositor.c b/compositor/compositor.c
index bef6867..23c1054 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -227,6 +227,7 @@ wlsc_surface_create(struct wlsc_compositor *compositor,
        surface->height = height;
        surface->alpha = 255;
 
+       surface->fs_support.fullscreen_output = NULL;
        surface->fs_support.fs_method = WLSC_SURFACE_FULLSCREEN_NONE;
        surface->buffer = NULL;
        surface->output = NULL;
@@ -316,6 +317,54 @@ wlsc_surface_center_on_output( struct wlsc_surface 
*surface,
        surface->y = output->y + (mode->height - surface->height) / 2;
 }
 
+int
+wlsc_surface_set_fullscreen( struct wlsc_output *output,
+                            struct wlsc_surface *surface)
+{
+       char mode[16];
+
+       switch(surface->fs_support.fs_method) {
+               case WLSC_SURFACE_FULLSCREEN_NONE:
+                       wlsc_surface_damage(surface);
+                       break;
+               case WLSC_SURFACE_FULLSCREEN_FORCE:
+                       if(output->current->width == surface->width &&
+                           output->current->height == surface->height)
+                               return 0;
+                       memset(mode, 0, sizeof(mode));
+                       sprintf(mode, "%dx%d",surface->width,surface->height);
+                       if (!output->set_mode) {
+                               fprintf(stderr,
+                                       "set_mode not implemented,   \
+                                        fallback to FILL method\n");
+                       } else if(output->set_mode(output, mode) == 0 ) {
+                               wlsc_surface_damage(surface);
+                               fprintf(stderr,
+                                       "mode setting error,       \
+                                        fallback to FILL method\n");
+                               break;
+                       } else {
+                               /*did not find the mode, fall back */
+                               sprintf(mode, "%dx%d",
+                                       output->current->width,
+                                       output->current->height);
+                               output->set_mode(output, mode);
+                               fprintf(stderr,
+                                       "failed to set mode,         \
+                                        fallback to FILL method\n");
+                       }
+               case WLSC_SURFACE_FULLSCREEN_FILL:
+                       /*make it on the center at first*/
+                       wlsc_surface_center_on_output(surface, output);
+                       wlsc_surface_damage(surface);
+                       break;
+               default:
+                       break;
+       }
+
+       return 0;
+}
+
 WL_EXPORT uint32_t
 wlsc_compositor_get_time(void)
 {
@@ -539,7 +588,7 @@ wlsc_surface_draw(struct wlsc_surface *es,
        pixman_region32_init_rect(&repaint,
                                  es->x, es->y, es->width, es->height);
        pixman_region32_intersect(&repaint, &repaint, clip);
-       if (!pixman_region32_not_empty(&repaint))
+       if (!pixman_region32_not_empty(&repaint) || !ec)
                return;
 
        switch (es->visual) {
@@ -763,8 +812,6 @@ wlsc_output_repaint(struct wlsc_output *output)
 
        output->prepare_render(output);
 
-       glViewport(0, 0, output->current->width, output->current->height);
-
        glUseProgram(ec->texture_shader.program);
        glUniformMatrix4fv(ec->texture_shader.proj_uniform,
                           1, GL_FALSE, output->matrix.d);
@@ -797,24 +844,36 @@ wlsc_output_repaint(struct wlsc_output *output)
                /* We're drawing nothing, just let the damage accumulate */
                return;
 
-       if (es->fs_support.fullscreen_output == output) {
-               if (es->width < output->current->width ||
-                   es->height < output->current->height)
-                       glClear(GL_COLOR_BUFFER_BIT);
+       if (es->fs_support.fullscreen_output == output ) {
+               if (es->width != output->current->width ||
+                    es->height != output->current->height) {
+                       wlsc_surface_set_fullscreen(output, es);
+                       output->prepare_render(output);
+                       glViewport( 0, 0, (GLint) output->current->width,
+                                   (GLint) output->current->height);
+                       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+               }
                wlsc_surface_draw(es, output, &total_damage);
        } else {
+               glViewport(0, 0,
+                          output->current->width,
+                          output->current->height);
                wl_list_for_each(es, &ec->surface_list, link) {
-                       pixman_region32_copy(&es->damage, &total_damage);
-                       pixman_region32_subtract(&total_damage, &total_damage, 
&es->opaque);
+                       pixman_region32_copy(&es->damage,
+                                            &total_damage);
+                       pixman_region32_subtract(&total_damage,
+                                                &total_damage,
+                                                &es->opaque);
                }
-
                wl_list_for_each_reverse(es, &ec->surface_list, link) {
                        pixman_region32_init(&repaint);
-                       pixman_region32_intersect(&repaint, &output->region,
+                       pixman_region32_intersect(&repaint,
+                                                 &output->region,
                                                  &es->damage);
                        wlsc_surface_draw(es, output, &repaint);
                        pixman_region32_subtract(&es->damage,
-                                                &es->damage, &output->region);
+                                                &es->damage,
+                                                &output->region);
                }
        }
 
diff --git a/compositor/compositor.h b/compositor/compositor.h
index 9ba107d..e7aca1a 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -98,6 +98,7 @@ struct wlsc_output {
        int (*set_hardware_cursor)(struct wlsc_output *output,
                                   struct wlsc_input_device *input);
        void (*destroy)(struct wlsc_output *output);
+       int (*set_mode)(struct wlsc_output *output_base, char *mode);
 };
 
 struct wlsc_input_device {
@@ -389,6 +390,10 @@ wlsc_surface_damage_rectangle(struct wlsc_surface *surface,
                              int32_t x, int32_t y,
                              int32_t width, int32_t height);
 
+int
+wlsc_surface_set_fullscreen(struct wlsc_output *output,
+                           struct wlsc_surface *surface);
+
 struct wlsc_surface *
 pick_surface(struct wl_input_device *device, int32_t *sx, int32_t *sy);
 
-- 
1.7.2.2

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to