diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-03-17 16:39:03 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-03-18 22:59:44 +0300 |
commit | 16dd382f0648b1486a2a9d1c68ef3baa768ba7aa (patch) | |
tree | 8e95fb9defe7735442dfaf2cb7f5d4e93bb51683 /source/blender/gpu | |
parent | c509a12fd843c2bbd141807402cb38fd526240d9 (diff) |
GPUTexture: Add Cube view as 2D array
This is useful to read/write to the textures directly using compute
shaders and imageLoad/Store.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_texture.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_texture.cc | 12 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_texture_private.hh | 3 |
3 files changed, 14 insertions, 5 deletions
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index 4dbcd84672c..37edc2abeb2 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -230,6 +230,7 @@ GPUTexture *GPU_texture_create_error(int dimension, bool array); * Create an alias of the source texture data. * If \a src is freed, the texture view will continue to be valid. * If \a mip_start or \a mip_len is bigger than available mips they will be clamped. + * If \a cube_as_array is true, then the texture cube (array) becomes a 2D array texture. * TODO(@fclem): Target conversion is not implemented yet. */ GPUTexture *GPU_texture_create_view(const char *name, @@ -238,7 +239,8 @@ GPUTexture *GPU_texture_create_view(const char *name, int mip_start, int mip_len, int layer_start, - int layer_len); + int layer_len, + bool cube_as_array); void GPU_texture_update_mipmap(GPUTexture *tex, int miplvl, diff --git a/source/blender/gpu/intern/gpu_texture.cc b/source/blender/gpu/intern/gpu_texture.cc index 0d2ec43533f..b41193f12fa 100644 --- a/source/blender/gpu/intern/gpu_texture.cc +++ b/source/blender/gpu/intern/gpu_texture.cc @@ -136,7 +136,8 @@ bool Texture::init_view(const GPUTexture *src_, int mip_start, int mip_len, int layer_start, - int layer_len) + int layer_len, + bool cube_as_array) { const Texture *src = unwrap(src_); w_ = src->w_; @@ -165,6 +166,10 @@ bool Texture::init_view(const GPUTexture *src_, format_flag_ = to_format_flag(format); /* For now always copy the target. Target aliasing could be exposed later. */ type_ = src->type_; + if (cube_as_array) { + BLI_assert(type_ & GPU_TEXTURE_CUBE); + type_ = (type_ & ~GPU_TEXTURE_CUBE) | GPU_TEXTURE_2D_ARRAY; + } sampler_state = src->sampler_state; return this->init_internal(src_, mip_start, layer_start); } @@ -387,12 +392,13 @@ GPUTexture *GPU_texture_create_view(const char *name, int mip_start, int mip_len, int layer_start, - int layer_len) + int layer_len, + bool cube_as_array) { BLI_assert(mip_len > 0); BLI_assert(layer_len > 0); Texture *view = GPUBackend::get()->texture_alloc(name); - view->init_view(src, format, mip_start, mip_len, layer_start, layer_len); + view->init_view(src, format, mip_start, mip_len, layer_start, layer_len, cube_as_array); return wrap(view); } diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index 1e81980e95f..109e60e19a6 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -111,7 +111,8 @@ class Texture { int mip_start, int mip_len, int layer_start, - int layer_len); + int layer_len, + bool cube_as_array); virtual void generate_mipmap() = 0; virtual void copy_to(Texture *tex) = 0; |