[Bf-blender-cvs] [e061cb44378] master: GPU: Create and use new GPU_texture_read_rect utility.

mano-wii noreply at git.blender.org
Fri Mar 22 17:08:19 CET 2019


Commit: e061cb44378efaf159a30fb1c5834db48ffb2bb3
Author: mano-wii
Date:   Fri Mar 22 12:52:38 2019 -0300
Branches: master
https://developer.blender.org/rBe061cb44378efaf159a30fb1c5834db48ffb2bb3

GPU: Create and use new GPU_texture_read_rect utility.

===================================================================

M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.c

===================================================================

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index bfc48f839da..f3e8ba9cbea 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2509,16 +2509,8 @@ void DRW_framebuffer_select_id_release(ARegion *ar)
 /* Read a block of pixels from the select frame buffer. */
 void DRW_framebuffer_select_id_read(const rcti *rect, uint *r_buf)
 {
-	DRW_opengl_context_enable();
-	GPU_framebuffer_bind(g_select_buffer.framebuffer_select_id);
-	glReadBuffer(GL_COLOR_ATTACHMENT0);
-
-	glReadPixels(rect->xmin, rect->ymin,
-	             BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
-	             GL_RED_INTEGER, GL_UNSIGNED_INT, r_buf);
-
-	GPU_framebuffer_restore();
-	DRW_opengl_context_disable();
+	GPU_texture_read_rect(
+	        g_select_buffer.texture_u32, GPU_DATA_UNSIGNED_INT, rect, r_buf);
 }
 
 /** \} */
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);



More information about the Bf-blender-cvs mailing list