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.
This commit is contained in:
committed by
Kristian Høgsberg
parent
f9e710b57c
commit
878f44969d
+6
-5
@@ -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;
|
||||
pixman_region32_init(&surface->texture_damage);
|
||||
@@ -276,11 +281,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
|
||||
|
||||
+6
-1
@@ -284,6 +284,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);
|
||||
};
|
||||
|
||||
@@ -421,10 +425,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.
|
||||
|
||||
+46
-1
@@ -35,6 +35,10 @@ struct gles2_output_state {
|
||||
EGLSurface egl_surface;
|
||||
};
|
||||
|
||||
struct gles2_surface_state {
|
||||
GLfloat color[4];
|
||||
};
|
||||
|
||||
struct gles2_renderer {
|
||||
struct weston_renderer base;
|
||||
int fragment_shader_debug;
|
||||
@@ -56,6 +60,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)
|
||||
{
|
||||
@@ -648,10 +658,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++)
|
||||
@@ -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
|
||||
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;
|
||||
@@ -1133,6 +1174,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[] =
|
||||
@@ -1600,6 +1643,8 @@ gles2_renderer_create(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);
|
||||
|
||||
@@ -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
|
||||
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->flush_damage = noop_renderer_flush_damage;
|
||||
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;
|
||||
ec->renderer = renderer;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user