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>2019-03-22 18:52:38 +0300
committermano-wii <germano.costa@ig.com.br>2019-03-22 19:08:02 +0300
commite061cb44378efaf159a30fb1c5834db48ffb2bb3 (patch)
tree387f6cccb660a600e04a3f873a78b91a2303d579 /source/blender/gpu
parenta96ccf20b6c30a44873cca817b8fa23de5e44a05 (diff)
GPU: Create and use new GPU_texture_read_rect utility.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/GPU_texture.h3
-rw-r--r--source/blender/gpu/intern/gpu_texture.c29
2 files changed, 32 insertions, 0 deletions
diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h
index e596fe9256e..18cf3dc4ced 100644
--- a/source/blender/gpu/GPU_texture.h
+++ b/source/blender/gpu/GPU_texture.h
@@ -185,6 +185,9 @@ void GPU_texture_update_sub(
int offset_x, int offset_y, int offset_z, int width, int height, int depth);
void *GPU_texture_read(GPUTexture *tex, eGPUDataFormat gpu_data_format, int miplvl);
+void GPU_texture_read_rect(
+ GPUTexture *tex, eGPUDataFormat gpu_data_format,
+ const struct rcti *rect, void *r_buf);
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 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);