DRW Manager: create and use new DRW_framebuffer_depth_read utility.
authormano-wii <germano.costa@ig.com.br>
Fri, 22 Mar 2019 15:53:50 +0000 (12:53 -0300)
committermano-wii <germano.costa@ig.com.br>
Fri, 22 Mar 2019 16:08:03 +0000 (13:08 -0300)
source/blender/draw/DRW_engine.h
source/blender/draw/intern/draw_manager.c
source/blender/editors/space_view3d/view3d_draw_legacy.c

index 68d4ef0..94d1bc6 100644 (file)
@@ -126,6 +126,7 @@ void DRW_draw_depth_loop(
 void DRW_framebuffer_select_id_setup(struct ARegion *ar, const bool clear);
 void DRW_framebuffer_select_id_release(struct ARegion *ar);
 void DRW_framebuffer_select_id_read(const struct rcti *rect, uint *r_buf);
+void DRW_framebuffer_depth_read(const struct rcti *rect, float *r_buf);
 
 /* grease pencil render */
 bool DRW_render_check_grease_pencil(struct Depsgraph *depsgraph);
index f3e8ba9..bb4e114 100644 (file)
@@ -2513,6 +2513,14 @@ void DRW_framebuffer_select_id_read(const rcti *rect, uint *r_buf)
                g_select_buffer.texture_u32, GPU_DATA_UNSIGNED_INT, rect, r_buf);
 }
 
+
+/* Read a block of pixels from the depth frame buffer. */
+void DRW_framebuffer_depth_read(const rcti *rect, float *r_buf)
+{
+       GPU_texture_read_rect(
+               g_select_buffer.texture_depth, GPU_DATA_FLOAT, rect, r_buf);
+}
+
 /** \} */
 
 
index 89053b2..21e48c2 100644 (file)
@@ -223,12 +223,6 @@ void view3d_opengl_read_pixels(ARegion *ar, int x, int y, int w, int h, int form
        glReadPixels(ar->winrct.xmin + x, ar->winrct.ymin + y, w, h, format, type, data);
 }
 
-/* XXX depth reading exception, for code not using gpu offscreen */
-static void view3d_opengl_read_Z_pixels(ARegion *ar, int x, int y, int w, int h, int format, int type, void *data)
-{
-       glReadPixels(ar->winrct.xmin + x, ar->winrct.ymin + y, w, h, format, type, data);
-}
-
 void ED_view3d_select_id_validate_with_select_mode(ViewContext *vc, short select_mode)
 {
        /* TODO: Create a flag in `DRW_manager` because the drawing is no longer
@@ -726,7 +720,6 @@ void ED_view3d_draw_bgpic_test(
 
 /* *********************** */
 
-/* XXX warning, not using gpu offscreen here */
 void view3d_update_depths_rect(ARegion *ar, ViewDepths *d, rcti *rect)
 {
        /* clamp rect by region */
@@ -775,14 +768,14 @@ void view3d_update_depths_rect(ARegion *ar, ViewDepths *d, rcti *rect)
        }
 
        if (d->damaged) {
-               /* XXX using special function here, it doesn't use the gpu offscreen system */
-               view3d_opengl_read_Z_pixels(ar, d->x, d->y, d->w, d->h, GL_DEPTH_COMPONENT, GL_FLOAT, d->depths);
+               DRW_framebuffer_depth_read(rect, d->depths);
                glGetDoublev(GL_DEPTH_RANGE, d->depth_range);
                d->damaged = false;
        }
 }
 
-/* note, with nouveau drivers the glReadPixels() is very slow. [#24339] */
+/* note, with nouveau drivers the glReadPixels() is very slow. [#24339]
+ * XXX warning, not using gpu offscreen here */
 void ED_view3d_depth_update(ARegion *ar)
 {
        RegionView3D *rv3d = ar->regiondata;