---
 src/compositor.c     | 11 ++++++-----
 src/compositor.h     |  7 ++++++-
 src/gles2-renderer.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 3597cf7..f017052 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -237,6 +237,11 @@ weston_surface_create(struct weston_compositor *compositor)
        surface->alpha = 1.0;
        surface->pitch = 1;
 
+       if (compositor->renderer->create_surface(surface) < 0) {
+               free(surface);
+               return NULL;
+       }
+
        surface->num_textures = 0;
        surface->num_images = 0;
 
@@ -275,11 +280,7 @@ WL_EXPORT void
 weston_surface_set_color(struct weston_surface *surface,
                 float red, float green, float blue, float alpha)
 {
-       surface->color[0] = red;
-       surface->color[1] = green;
-       surface->color[2] = blue;
-       surface->color[3] = alpha;
-       surface->shader = &surface->compositor->solid_shader;
+       surface->compositor->renderer->surface_set_color(surface, red, green, 
blue, alpha);
 }
 
 WL_EXPORT void
diff --git a/src/compositor.h b/src/compositor.h
index dfad011..f3dc829 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -283,6 +283,10 @@ struct weston_renderer {
                               pixman_region32_t *output_damage);
        void (*flush_damage)(struct weston_surface *surface);
        void (*attach)(struct weston_surface *es, struct wl_buffer *buffer);
+       int (*create_surface)(struct weston_surface *surface);
+       void (*surface_set_color)(struct weston_surface *surface,
+                              float red, float green,
+                              float blue, float alpha);
        void (*destroy_surface)(struct weston_surface *surface);
 };
 
@@ -416,10 +420,11 @@ struct weston_surface {
        struct wl_list link;
        struct wl_list layer_link;
        struct weston_shader *shader;
-       GLfloat color[4];
        float alpha;
        struct weston_plane *plane;
 
+       void *renderer_state;
+
        /* Surface geometry state, mutable.
         * If you change anything, set dirty = 1.
         * That includes the transformations referenced from the list.
diff --git a/src/gles2-renderer.c b/src/gles2-renderer.c
index 5451e60..0a05899 100644
--- a/src/gles2-renderer.c
+++ b/src/gles2-renderer.c
@@ -34,6 +34,10 @@ struct gles2_output_state {
        EGLSurface egl_surface;
 };
 
+struct gles2_surface_state {
+       GLfloat color[4];
+};
+
 struct gles2_renderer {
        struct weston_renderer base;
 
@@ -54,6 +58,12 @@ get_output_state(struct weston_output *output)
        return (struct gles2_output_state *)output->renderer_state;
 }
 
+static inline struct gles2_surface_state *
+get_surface_state(struct weston_surface *surface)
+{
+       return (struct gles2_surface_state *)surface->renderer_state;
+}
+
 static inline struct gles2_renderer *
 get_renderer(struct weston_compositor *ec)
 {
@@ -646,10 +656,11 @@ weston_shader_uniforms(struct weston_shader *shader,
                       struct weston_output *output)
 {
        int i;
+       struct gles2_surface_state *gs = get_surface_state(surface);
 
        glUniformMatrix4fv(shader->proj_uniform,
                           1, GL_FALSE, output->matrix.d);
-       glUniform4fv(shader->color_uniform, 1, surface->color);
+       glUniform4fv(shader->color_uniform, 1, gs->color);
        glUniform1f(shader->alpha_uniform, surface->alpha);
 
        for (i = 0; i < surface->num_textures; i++)
@@ -1105,8 +1116,38 @@ gles2_renderer_attach(struct weston_surface *es, struct 
wl_buffer *buffer)
 }
 
 static void
+gles2_renderer_surface_set_color(struct weston_surface *surface,
+                float red, float green, float blue, float alpha)
+{
+       struct gles2_surface_state *gs = get_surface_state(surface);
+
+       gs->color[0] = red;
+       gs->color[1] = green;
+       gs->color[2] = blue;
+       gs->color[3] = alpha;
+
+       surface->shader = &surface->compositor->solid_shader;
+}
+
+static int
+gles2_renderer_create_surface(struct weston_surface *surface)
+{
+       struct gles2_surface_state *gs;
+
+       gs = calloc(1, sizeof *gs);
+
+       if (!gs)
+               return -1;
+
+       surface->renderer_state = gs;
+
+       return 0;
+}
+
+static void
 gles2_renderer_destroy_surface(struct weston_surface *surface)
 {
+       struct gles2_surface_state *gs = get_surface_state(surface);
        struct weston_compositor *ec = surface->compositor;
        struct gles2_renderer *gr = get_renderer(ec);
        int i;
@@ -1115,6 +1156,8 @@ gles2_renderer_destroy_surface(struct weston_surface 
*surface)
 
        for (i = 0; i < surface->num_images; i++)
                ec->destroy_image(gr->egl_display, surface->images[i]);
+
+       free(gs);
 }
 
 static const char vertex_shader[] =
@@ -1495,6 +1538,8 @@ gles2_renderer_init(struct weston_compositor *ec, 
EGLNativeDisplayType display,
        gr->base.repaint_output = gles2_renderer_repaint_output;
        gr->base.flush_damage = gles2_renderer_flush_damage;
        gr->base.attach = gles2_renderer_attach;
+       gr->base.create_surface = gles2_renderer_create_surface;
+       gr->base.surface_set_color = gles2_renderer_surface_set_color;
        gr->base.destroy_surface = gles2_renderer_destroy_surface;
 
        gr->egl_display = eglGetDisplay(display);
-- 
1.7.12.4

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to