|
|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
|