@ -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 ,