diff options
author | mano-wii <germano.costa@ig.com.br> | 2020-02-15 18:17:39 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2020-02-15 18:18:52 +0300 |
commit | 738bb309f9490c4d6e056e7df8ff9a6e60ad45df (patch) | |
tree | a5254af24ea647f9c0f7d611d8b26ac0c466df0d /source/blender/gpu/intern | |
parent | de9ea94fc6f810b101742a4c2b839fb748e95be0 (diff) |
GPU: Add GPU support to fill a texture image with a constant value
This solution is optimized for GL version 4.4 or greater.
Diffstat (limited to 'source/blender/gpu/intern')
-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); |