Move weston_surface GL and EGL state into gles2-renderer.
This commit is contained in:
committed by
Kristian Høgsberg
parent
4068414a32
commit
75cc571839
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+48
-39
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user