compositor: Move surface color state to gles2-renderer.

This moves the surface color state into gles2-renderer. To do this it
adds two new weston_renderer functions. create_surface to be able to
create per-surface renderer state, and surface_set_color to set the
color of a surface and changes it to a color surface.
dev
John Kåre Alsaker 12 years ago committed by Kristian Høgsberg
parent f9e710b57c
commit 878f44969d
  1. 11
      src/compositor.c
  2. 7
      src/compositor.h
  3. 47
      src/gles2-renderer.c
  4. 14
      src/noop-renderer.c

@ -237,6 +237,11 @@ weston_surface_create(struct weston_compositor *compositor)
surface->alpha = 1.0; surface->alpha = 1.0;
surface->pitch = 1; surface->pitch = 1;
if (compositor->renderer->create_surface(surface) < 0) {
free(surface);
return NULL;
}
surface->num_textures = 0; surface->num_textures = 0;
surface->num_images = 0; surface->num_images = 0;
pixman_region32_init(&surface->texture_damage); pixman_region32_init(&surface->texture_damage);
@ -276,11 +281,7 @@ WL_EXPORT void
weston_surface_set_color(struct weston_surface *surface, weston_surface_set_color(struct weston_surface *surface,
float red, float green, float blue, float alpha) float red, float green, float blue, float alpha)
{ {
surface->color[0] = red; surface->compositor->renderer->surface_set_color(surface, red, green, blue, alpha);
surface->color[1] = green;
surface->color[2] = blue;
surface->color[3] = alpha;
surface->shader = &surface->compositor->solid_shader;
} }
WL_EXPORT void WL_EXPORT void

@ -284,6 +284,10 @@ struct weston_renderer {
pixman_region32_t *output_damage); pixman_region32_t *output_damage);
void (*flush_damage)(struct weston_surface *surface); void (*flush_damage)(struct weston_surface *surface);
void (*attach)(struct weston_surface *es, struct wl_buffer *buffer); 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); void (*destroy_surface)(struct weston_surface *surface);
}; };
@ -421,10 +425,11 @@ struct weston_surface {
struct wl_list link; struct wl_list link;
struct wl_list layer_link; struct wl_list layer_link;
struct weston_shader *shader; struct weston_shader *shader;
GLfloat color[4];
float alpha; float alpha;
struct weston_plane *plane; struct weston_plane *plane;
void *renderer_state;
/* Surface geometry state, mutable. /* Surface geometry state, mutable.
* If you change anything, set dirty = 1. * If you change anything, set dirty = 1.
* That includes the transformations referenced from the list. * That includes the transformations referenced from the list.

@ -35,6 +35,10 @@ struct gles2_output_state {
EGLSurface egl_surface; EGLSurface egl_surface;
}; };
struct gles2_surface_state {
GLfloat color[4];
};
struct gles2_renderer { struct gles2_renderer {
struct weston_renderer base; struct weston_renderer base;
int fragment_shader_debug; int fragment_shader_debug;
@ -56,6 +60,12 @@ get_output_state(struct weston_output *output)
return (struct gles2_output_state *)output->renderer_state; 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 * static inline struct gles2_renderer *
get_renderer(struct weston_compositor *ec) get_renderer(struct weston_compositor *ec)
{ {
@ -648,10 +658,11 @@ weston_shader_uniforms(struct weston_shader *shader,
struct weston_output *output) struct weston_output *output)
{ {
int i; int i;
struct gles2_surface_state *gs = get_surface_state(surface);
glUniformMatrix4fv(shader->proj_uniform, glUniformMatrix4fv(shader->proj_uniform,
1, GL_FALSE, output->matrix.d); 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); glUniform1f(shader->alpha_uniform, surface->alpha);
for (i = 0; i < surface->num_textures; i++) for (i = 0; i < surface->num_textures; i++)
@ -1122,9 +1133,39 @@ 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 static void
gles2_renderer_destroy_surface(struct weston_surface *surface) gles2_renderer_destroy_surface(struct weston_surface *surface)
{ {
struct gles2_surface_state *gs = get_surface_state(surface);
struct weston_compositor *ec = surface->compositor; struct weston_compositor *ec = surface->compositor;
struct gles2_renderer *gr = get_renderer(ec); struct gles2_renderer *gr = get_renderer(ec);
int i; int i;
@ -1133,6 +1174,8 @@ gles2_renderer_destroy_surface(struct weston_surface *surface)
for (i = 0; i < surface->num_images; i++) for (i = 0; i < surface->num_images; i++)
ec->destroy_image(gr->egl_display, surface->images[i]); ec->destroy_image(gr->egl_display, surface->images[i]);
free(gs);
} }
static const char vertex_shader[] = static const char vertex_shader[] =
@ -1600,6 +1643,8 @@ gles2_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display
gr->base.repaint_output = gles2_renderer_repaint_output; gr->base.repaint_output = gles2_renderer_repaint_output;
gr->base.flush_damage = gles2_renderer_flush_damage; gr->base.flush_damage = gles2_renderer_flush_damage;
gr->base.attach = gles2_renderer_attach; 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->base.destroy_surface = gles2_renderer_destroy_surface;
gr->egl_display = eglGetDisplay(display); gr->egl_display = eglGetDisplay(display);

@ -51,6 +51,18 @@ noop_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
{ {
} }
static int
noop_renderer_create_surface(struct weston_surface *surface)
{
return 0;
}
static void
noop_renderer_surface_set_color(struct weston_surface *surface,
float red, float green, float blue, float alpha)
{
}
static void static void
noop_renderer_destroy_surface(struct weston_surface *surface) noop_renderer_destroy_surface(struct weston_surface *surface)
{ {
@ -77,6 +89,8 @@ noop_renderer_init(struct weston_compositor *ec)
renderer->repaint_output = noop_renderer_repaint_output; renderer->repaint_output = noop_renderer_repaint_output;
renderer->flush_damage = noop_renderer_flush_damage; renderer->flush_damage = noop_renderer_flush_damage;
renderer->attach = noop_renderer_attach; renderer->attach = noop_renderer_attach;
renderer->create_surface = noop_renderer_create_surface;
renderer->surface_set_color = noop_renderer_surface_set_color;
renderer->destroy_surface = noop_renderer_destroy_surface; renderer->destroy_surface = noop_renderer_destroy_surface;
ec->renderer = renderer; ec->renderer = renderer;

Loading…
Cancel
Save