diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_texture.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_texture.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c index ccafc785526..9ef42592b55 100644 --- a/source/blender/gpu/intern/gpu_texture.c +++ b/source/blender/gpu/intern/gpu_texture.c @@ -21,6 +21,8 @@ * \ingroup gpu */ +#include <string.h> + #include "MEM_guardedalloc.h" #include "DNA_image_types.h" @@ -1435,6 +1437,30 @@ void *GPU_texture_read(GPUTexture *tex, eGPUDataFormat gpu_data_format, int mipl return buf; } +void GPU_texture_clear(GPUTexture *tex, eGPUDataFormat gpu_data_format, const void *color) +{ + if (GLEW_ARB_clear_texture) { + GLenum data_format = gpu_get_gl_dataformat(tex->format, &tex->format_flag); + GLenum data_type = gpu_get_gl_datatype(gpu_data_format); + glClearTexImage(tex->bindcode, 0, data_format, data_type, color); + } + else { + size_t buffer_len = gpu_texture_memory_footprint_compute(tex); + unsigned char *pixels = MEM_mallocN(buffer_len, __func__); + if (color) { + size_t bytesize = tex->bytesize; + for (size_t byte = 0; byte < buffer_len; byte += bytesize) { + memcpy(&pixels[byte], color, bytesize); + } + } + else { + memset(pixels, 0, buffer_len); + } + GPU_texture_update(tex, gpu_data_format, pixels); + MEM_freeN(pixels); + } +} + void GPU_texture_update(GPUTexture *tex, eGPUDataFormat data_format, const void *pixels) { GPU_texture_update_sub(tex, data_format, pixels, 0, 0, 0, tex->w, tex->h, tex->d); |