Move weston_surface GL and EGL state into gles2-renderer.

dev
John Kåre Alsaker 13 years ago committed by Kristian Høgsberg
parent 4068414a32
commit 75cc571839
  1. 2
      src/compositor.c
  2. 6
      src/compositor.h
  3. 87
      src/gles2-renderer.c

@ -242,8 +242,6 @@ weston_surface_create(struct weston_compositor *compositor)
return NULL; return NULL;
} }
surface->num_textures = 0;
surface->num_images = 0;
pixman_region32_init(&surface->texture_damage); pixman_region32_init(&surface->texture_damage);
surface->buffer = NULL; surface->buffer = NULL;

@ -397,8 +397,6 @@ struct weston_region {
struct weston_surface { struct weston_surface {
struct wl_surface surface; struct wl_surface surface;
struct weston_compositor *compositor; struct weston_compositor *compositor;
GLuint textures[3];
int num_textures;
pixman_region32_t texture_damage; pixman_region32_t texture_damage;
pixman_region32_t clip; pixman_region32_t clip;
pixman_region32_t damage; pixman_region32_t damage;
@ -458,10 +456,6 @@ struct weston_surface {
struct wl_list frame_callback_list; struct wl_list frame_callback_list;
EGLImageKHR images[3];
GLenum target;
int num_images;
struct wl_buffer *buffer; struct wl_buffer *buffer;
struct wl_listener buffer_destroy_listener; struct wl_listener buffer_destroy_listener;

@ -47,6 +47,13 @@ struct gles2_output_state {
struct gles2_surface_state { struct gles2_surface_state {
GLfloat color[4]; GLfloat color[4];
struct gles2_shader *shader; struct gles2_shader *shader;
GLuint textures[3];
int num_textures;
EGLImageKHR images[3];
GLenum target;
int num_images;
}; };
struct gles2_renderer { struct gles2_renderer {
@ -686,7 +693,7 @@ shader_uniforms(struct gles2_shader *shader,
glUniform4fv(shader->color_uniform, 1, gs->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 < gs->num_textures; i++)
glUniform1i(shader->tex_uniforms[i], i); glUniform1i(shader->tex_uniforms[i], i);
} }
@ -731,11 +738,11 @@ draw_surface(struct weston_surface *es, struct weston_output *output,
else else
filter = GL_NEAREST; filter = GL_NEAREST;
for (i = 0; i < es->num_textures; i++) { for (i = 0; i < gs->num_textures; i++) {
glActiveTexture(GL_TEXTURE0 + i); glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(es->target, es->textures[i]); glBindTexture(gs->target, gs->textures[i]);
glTexParameteri(es->target, GL_TEXTURE_MIN_FILTER, filter); glTexParameteri(gs->target, GL_TEXTURE_MIN_FILTER, filter);
glTexParameteri(es->target, GL_TEXTURE_MAG_FILTER, filter); glTexParameteri(gs->target, GL_TEXTURE_MAG_FILTER, filter);
} }
/* blended region is whole surface minus opaque region: */ /* blended region is whole surface minus opaque region: */
@ -994,6 +1001,8 @@ gles2_renderer_read_pixels(struct weston_output *output,
static void static void
gles2_renderer_flush_damage(struct weston_surface *surface) gles2_renderer_flush_damage(struct weston_surface *surface)
{ {
struct gles2_surface_state *gs = get_surface_state(surface);
#ifdef GL_UNPACK_ROW_LENGTH #ifdef GL_UNPACK_ROW_LENGTH
pixman_box32_t *rectangles; pixman_box32_t *rectangles;
void *data; void *data;
@ -1012,7 +1021,7 @@ gles2_renderer_flush_damage(struct weston_surface *surface)
if (!pixman_region32_not_empty(&surface->texture_damage)) if (!pixman_region32_not_empty(&surface->texture_damage))
return; return;
glBindTexture(GL_TEXTURE_2D, surface->textures[0]); glBindTexture(GL_TEXTURE_2D, gs->textures[0]);
if (!surface->compositor->has_unpack_subimage) { if (!surface->compositor->has_unpack_subimage) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
@ -1045,23 +1054,23 @@ done:
} }
static void static void
ensure_textures(struct weston_surface *es, int num_textures) ensure_textures(struct gles2_surface_state *gs, int num_textures)
{ {
int i; int i;
if (num_textures <= es->num_textures) if (num_textures <= gs->num_textures)
return; return;
for (i = es->num_textures; i < num_textures; i++) { for (i = gs->num_textures; i < num_textures; i++) {
glGenTextures(1, &es->textures[i]); glGenTextures(1, &gs->textures[i]);
glBindTexture(es->target, es->textures[i]); glBindTexture(gs->target, gs->textures[i]);
glTexParameteri(es->target, glTexParameteri(gs->target,
GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(es->target, glTexParameteri(gs->target,
GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
} }
es->num_textures = num_textures; gs->num_textures = num_textures;
glBindTexture(es->target, 0); glBindTexture(gs->target, 0);
} }
static void static void
@ -1074,22 +1083,22 @@ gles2_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
int i, num_planes; int i, num_planes;
if (!buffer) { if (!buffer) {
for (i = 0; i < es->num_images; i++) { for (i = 0; i < gs->num_images; i++) {
ec->destroy_image(gr->egl_display, es->images[i]); ec->destroy_image(gr->egl_display, gs->images[i]);
es->images[i] = NULL; gs->images[i] = NULL;
} }
es->num_images = 0; gs->num_images = 0;
glDeleteTextures(es->num_textures, es->textures); glDeleteTextures(gs->num_textures, gs->textures);
es->num_textures = 0; gs->num_textures = 0;
return; return;
} }
if (wl_buffer_is_shm(buffer)) { if (wl_buffer_is_shm(buffer)) {
es->pitch = wl_shm_buffer_get_stride(buffer) / 4; es->pitch = wl_shm_buffer_get_stride(buffer) / 4;
es->target = GL_TEXTURE_2D; gs->target = GL_TEXTURE_2D;
ensure_textures(es, 1); ensure_textures(gs, 1);
glBindTexture(GL_TEXTURE_2D, es->textures[0]); glBindTexture(GL_TEXTURE_2D, gs->textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
es->pitch, buffer->height, 0, es->pitch, buffer->height, 0,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL); GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
@ -1099,10 +1108,10 @@ gles2_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
gs->shader = &gr->texture_shader_rgba; gs->shader = &gr->texture_shader_rgba;
} else if (ec->query_buffer(gr->egl_display, buffer, } else if (ec->query_buffer(gr->egl_display, buffer,
EGL_TEXTURE_FORMAT, &format)) { EGL_TEXTURE_FORMAT, &format)) {
for (i = 0; i < es->num_images; i++) for (i = 0; i < gs->num_images; i++)
ec->destroy_image(gr->egl_display, es->images[i]); ec->destroy_image(gr->egl_display, gs->images[i]);
es->num_images = 0; gs->num_images = 0;
es->target = GL_TEXTURE_2D; gs->target = GL_TEXTURE_2D;
switch (format) { switch (format) {
case EGL_TEXTURE_RGB: case EGL_TEXTURE_RGB:
case EGL_TEXTURE_RGBA: case EGL_TEXTURE_RGBA:
@ -1112,7 +1121,7 @@ gles2_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
break; break;
case EGL_TEXTURE_EXTERNAL_WL: case EGL_TEXTURE_EXTERNAL_WL:
num_planes = 1; num_planes = 1;
es->target = GL_TEXTURE_EXTERNAL_OES; gs->target = GL_TEXTURE_EXTERNAL_OES;
gs->shader = &gr->texture_shader_egl_external; gs->shader = &gr->texture_shader_egl_external;
break; break;
case EGL_TEXTURE_Y_UV_WL: case EGL_TEXTURE_Y_UV_WL:
@ -1129,25 +1138,25 @@ gles2_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
break; break;
} }
ensure_textures(es, num_planes); ensure_textures(gs, num_planes);
for (i = 0; i < num_planes; i++) { for (i = 0; i < num_planes; i++) {
attribs[0] = EGL_WAYLAND_PLANE_WL; attribs[0] = EGL_WAYLAND_PLANE_WL;
attribs[1] = i; attribs[1] = i;
attribs[2] = EGL_NONE; attribs[2] = EGL_NONE;
es->images[i] = ec->create_image(gr->egl_display, gs->images[i] = ec->create_image(gr->egl_display,
NULL, NULL,
EGL_WAYLAND_BUFFER_WL, EGL_WAYLAND_BUFFER_WL,
buffer, attribs); buffer, attribs);
if (!es->images[i]) { if (!gs->images[i]) {
weston_log("failed to create img for plane %d\n", i); weston_log("failed to create img for plane %d\n", i);
continue; continue;
} }
es->num_images++; gs->num_images++;
glActiveTexture(GL_TEXTURE0 + i); glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(es->target, es->textures[i]); glBindTexture(gs->target, gs->textures[i]);
ec->image_target_texture_2d(es->target, ec->image_target_texture_2d(gs->target,
es->images[i]); gs->images[i]);
} }
es->pitch = buffer->width; es->pitch = buffer->width;
@ -1194,10 +1203,10 @@ gles2_renderer_destroy_surface(struct weston_surface *surface)
struct gles2_renderer *gr = get_renderer(ec); struct gles2_renderer *gr = get_renderer(ec);
int i; int i;
glDeleteTextures(surface->num_textures, surface->textures); glDeleteTextures(gs->num_textures, gs->textures);
for (i = 0; i < surface->num_images; i++) for (i = 0; i < gs->num_images; i++)
ec->destroy_image(gr->egl_display, surface->images[i]); ec->destroy_image(gr->egl_display, gs->images[i]);
free(gs); free(gs);
} }

Loading…
Cancel
Save