@ -702,14 +702,18 @@ void RasterizerStorageGLES3::texture_allocate(RID p_texture, int p_width, int p_
int mipmaps = 0 ;
while ( width ! = 1 & & height ! = 1 ) {
glTexImage3D ( texture - > target , 0 , internal_format , width , height , depth , 0 , format , type , NULL ) ;
while ( width > 0 | | height > 0 | | ( p_type = = VS : : TEXTURE_TYPE_3D & & depth > 0 ) ) {
width = MAX ( 1 , width ) ;
height = MAX ( 1 , height ) ;
depth = MAX ( 1 , depth ) ;
width = MAX ( 1 , width / 2 ) ;
height = MAX ( 1 , height / 2 ) ;
glTexImage3D ( texture - > target , mipmaps , internal_format , width , height , depth , 0 , format , type , NULL ) ;
width / = 2 ;
height / = 2 ;
if ( p_type = = VS : : TEXTURE_TYPE_3D ) {
depth = MAX ( 1 , depth / 2 ) ;
depth /= 2 ;
}
mipmaps + + ;
@ -926,6 +930,9 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Ref<Image> &p
h = MAX ( 1 , h > > 1 ) ;
}
// Handle array and 3D textures, as those set their data per layer.
tsize * = MAX ( texture - > alloc_depth , 1 ) ;
info . texture_mem - = texture - > total_data_size ;
texture - > total_data_size = tsize ;
info . texture_mem + = texture - > total_data_size ;
@ -1496,7 +1503,7 @@ void RasterizerStorageGLES3::texture_debug_usage(List<VS::TextureInfo> *r_info)
tinfo . format = t - > format ;
tinfo . width = t - > alloc_width ;
tinfo . height = t - > alloc_height ;
tinfo . depth = 0 ;
tinfo . depth = t - > alloc_depth ;
tinfo . bytes = t - > total_data_size ;
r_info - > push_back ( tinfo ) ;
}