summaryrefslogtreecommitdiff
path: root/drivers/gles3
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2018-08-27 09:51:05 +0200
committerGitHub <noreply@github.com>2018-08-27 09:51:05 +0200
commit0ba84b3f23393fc562dbf2a41e7126bb9031ee10 (patch)
tree22f5356caa372a98bcb373e2b79998726a35c32b /drivers/gles3
parent2131f101b68dc61db8b4d9f9e2128bd0c9a6ef8c (diff)
parent30e20b6278b0a80e04fdee60637a9acd7bb0139d (diff)
Merge pull request #21467 from elasota/fix-3d-textures
Fix some 3D texture issues
Diffstat (limited to 'drivers/gles3')
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.cpp23
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.h8
2 files changed, 25 insertions, 6 deletions
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index 0bb0e12b8e..5ee6c28d83 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -667,7 +667,7 @@ 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);
+ glTexImage3D(texture->target, mipmaps, internal_format, width, height, depth, 0, format, type, NULL);
width = MAX(1, width / 2);
height = MAX(1, height / 2);
@@ -1029,7 +1029,11 @@ Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, int p_layer)
PoolVector<uint8_t> data;
- int data_size = Image::get_image_data_size(texture->alloc_width, texture->alloc_height, real_format, texture->mipmaps > 1 ? -1 : 0);
+ int alloc_depth = MAX(texture->alloc_depth, 1);
+
+ ERR_FAIL_COND_V(p_layer < 0 || p_layer >= alloc_depth, Ref<Image>());
+
+ int data_size = Image::get_image_data_size(texture->alloc_width, texture->alloc_height, real_format, texture->mipmaps > 1 ? -1 : 0) * alloc_depth;
data.resize(data_size * 2); //add some memory at the end, just in case for buggy drivers
PoolVector<uint8_t>::Write wb = data.write();
@@ -1085,9 +1089,13 @@ Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, int p_layer)
img_format = real_format;
}
- wb = PoolVector<uint8_t>::Write();
+ int slice_size = data_size / alloc_depth;
+
+ if (p_layer) {
+ memcpy(&wb[0], &wb[slice_size * p_layer], slice_size);
+ }
- data.resize(data_size);
+ data.resize(slice_size);
Image *img = memnew(Image(texture->alloc_width, texture->alloc_height, texture->mipmaps > 1 ? true : false, img_format, data));
@@ -1275,7 +1283,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);
}
@@ -1442,6 +1450,7 @@ RID RasterizerStorageGLES3::texture_create_radiance_cubemap(RID p_source, int p_
ctex->height = p_resolution;
ctex->alloc_width = p_resolution;
ctex->alloc_height = p_resolution;
+ ctex->alloc_depth = 0;
ctex->format = use_float ? Image::FORMAT_RGBAH : Image::FORMAT_RGBA8;
ctex->target = GL_TEXTURE_CUBE_MAP;
ctex->gl_format_cache = format;
@@ -6464,6 +6473,7 @@ void RasterizerStorageGLES3::_render_target_clear(RenderTarget *rt) {
Texture *tex = texture_owner.get(rt->texture);
tex->alloc_height = 0;
tex->alloc_width = 0;
+ tex->alloc_depth = 0;
tex->width = 0;
tex->height = 0;
tex->active = false;
@@ -6577,6 +6587,7 @@ void RasterizerStorageGLES3::_render_target_allocate(RenderTarget *rt) {
tex->height = rt->height;
tex->alloc_height = rt->height;
tex->active = true;
+ tex->alloc_depth = 0;
texture_set_flags(rt->texture, tex->flags);
}
@@ -6865,8 +6876,10 @@ RID RasterizerStorageGLES3::render_target_create() {
t->flags = 0;
t->width = 0;
t->height = 0;
+ t->depth = 0;
t->alloc_height = 0;
t->alloc_width = 0;
+ t->alloc_depth = 0;
t->format = Image::FORMAT_R8;
t->target = GL_TEXTURE_2D;
t->gl_format_cache = 0;
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index b74dd77e26..43b7d5fc99 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -294,7 +294,13 @@ public:
stored_cube_sides = 0;
ignore_mipmaps = false;
render_target = NULL;
- flags = width = height = 0;
+ flags = 0;
+ width = 0;
+ height = 0;
+ depth = 0;
+ alloc_width = 0;
+ alloc_height = 0;
+ alloc_depth = 0;
tex_id = 0;
data_size = 0;
format = Image::FORMAT_L8;