Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormano-wii <germano.costa@ig.com.br>2020-02-15 18:17:39 +0300
committermano-wii <germano.costa@ig.com.br>2020-02-15 18:18:52 +0300
commit738bb309f9490c4d6e056e7df8ff9a6e60ad45df (patch)
treea5254af24ea647f9c0f7d611d8b26ac0c466df0d /source/blender/gpu
parentde9ea94fc6f810b101742a4c2b839fb748e95be0 (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')
-rw-r--r--source/blender/gpu/GPU_texture.h1
-rw-r--r--source/blender/gpu/intern/gpu_texture.c26
2 files changed, 27 insertions, 0 deletions
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index 4e24a3172dc..e8800b75143 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -217,6 +217,7 @@ void GPU_texture_update_sub(GPUTexture *tex,
int depth);
void *GPU_texture_read(GPUTexture *tex, eGPUDataFormat gpu_data_format, int miplvl);
+void GPU_texture_clear(GPUTexture *tex, eGPUDataFormat gpu_data_format, const void *color);
void GPU_invalid_tex_init(void);
void GPU_invalid_tex_bind(int mode);
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);