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->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
|
||||||
|
|||||||
+6
-1
@@ -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.
|
||||||
|
|||||||
+46
-1
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user