diff options
Diffstat (limited to 'render')
| -rw-r--r-- | render/gles2/surface.c | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/render/gles2/surface.c b/render/gles2/surface.c index f730a499..300e1e46 100644 --- a/render/gles2/surface.c +++ b/render/gles2/surface.c @@ -34,6 +34,35 @@ static bool gles2_surface_attach_pixels(struct wlr_surface_state *surface,  	return true;  } +static bool gles2_surface_attach_shm(struct wlr_surface_state *surface, +		uint32_t format, struct wl_shm_buffer *buffer) { +	const struct pixel_format *fmt = gl_format_for_wl_format(format); +	if (!fmt || !fmt->gl_format) { +		wlr_log(L_ERROR, "No supported pixel format for this surface"); +		return false; +	} +	wl_shm_buffer_begin_access(buffer); +	uint8_t *pixels = wl_shm_buffer_get_data(buffer); +	int width = wl_shm_buffer_get_width(buffer); +	int height = wl_shm_buffer_get_height(buffer); +	int pitch = wl_shm_buffer_get_stride(buffer) / (fmt->bpp / 8); +	surface->wlr_surface->width = width; +	surface->wlr_surface->height = height; +	surface->wlr_surface->format = format; +	surface->pixel_format = fmt; + +	GL_CALL(glActiveTexture(GL_TEXTURE0)); +	GL_CALL(glGenTextures(1, &surface->tex_id)); +	GL_CALL(glBindTexture(GL_TEXTURE_2D, surface->tex_id)); +	GL_CALL(glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, pitch)); +	GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, fmt->gl_format, width, height, 0, +				fmt->gl_format, fmt->gl_type, pixels)); + +	surface->wlr_surface->valid = true; +	wl_shm_buffer_end_access(buffer); +	return true; +} +  static void gles2_surface_get_matrix(struct wlr_surface_state *surface,  		float (*matrix)[16], const float (*projection)[16], int x, int y) {  	struct wlr_surface *_surface = surface->wlr_surface; @@ -61,7 +90,7 @@ static void gles2_surface_destroy(struct wlr_surface_state *surface) {  static struct wlr_surface_impl wlr_surface_impl = {  	.attach_pixels = gles2_surface_attach_pixels, -	// .attach_shm = TODO +	.attach_shm = gles2_surface_attach_shm,  	.get_matrix = gles2_surface_get_matrix,  	.bind = gles2_surface_bind,  	.destroy = gles2_surface_destroy,  | 
