GPU: Add GPU support to fill a texture image with a constant value

This solution is optimized for GL version 4.4 or greater.
This commit is contained in:
Germano Cavalcante 2020-02-15 12:17:39 -03:00
parent de9ea94fc6
commit 738bb309f9
2 changed files with 27 additions and 0 deletions

View File

@ -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);

View File

@ -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);