diff options
author | mano-wii <germano.costa@ig.com.br> | 2019-03-22 18:52:38 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2019-03-22 19:08:02 +0300 |
commit | e061cb44378efaf159a30fb1c5834db48ffb2bb3 (patch) | |
tree | 387f6cccb660a600e04a3f873a78b91a2303d579 /source/blender/gpu/intern/gpu_texture.c | |
parent | a96ccf20b6c30a44873cca817b8fa23de5e44a05 (diff) |
GPU: Create and use new GPU_texture_read_rect utility.
Diffstat (limited to 'source/blender/gpu/intern/gpu_texture.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_texture.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c index ebb7b4bc0f0..e2aa26c3b33 100644 --- a/source/blender/gpu/intern/gpu_texture.c +++ b/source/blender/gpu/intern/gpu_texture.c @@ -1266,6 +1266,35 @@ void *GPU_texture_read(GPUTexture *tex, eGPUDataFormat gpu_data_format, int mipl return buf; } +void GPU_texture_read_rect( + GPUTexture *tex, eGPUDataFormat gpu_data_format, + const rcti *rect, void *r_buf) +{ + gpu_validate_data_format(tex->format, gpu_data_format); + + GPUFrameBuffer *cur_fb = GPU_framebuffer_active_get(); + GPUFrameBuffer *tmp_fb = GPU_framebuffer_create(); + GPU_framebuffer_texture_attach(tmp_fb, tex, 0, 0); + + GPU_framebuffer_bind(tmp_fb); + glReadBuffer(GL_COLOR_ATTACHMENT0); + + GLenum data_format = gpu_get_gl_dataformat(tex->format, &tex->format_flag); + GLenum data_type = gpu_get_gl_datatype(gpu_data_format); + + glReadPixels(rect->xmin, rect->ymin, + BLI_rcti_size_x(rect), BLI_rcti_size_y(rect), + data_format, data_type, r_buf); + + if (cur_fb) { + GPU_framebuffer_bind(cur_fb); + } + else { + GPU_framebuffer_restore(); + } + GPU_framebuffer_free(tmp_fb); +} + 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); |