[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55778] trunk/blender/source/blender: Use GLSL display for compositor backdrop and sequencer preview

Sergey Sharybin sergey.vfx at gmail.com
Thu Apr 4 14:20:14 CEST 2013


Revision: 55778
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55778
Author:   nazgul
Date:     2013-04-04 12:20:13 +0000 (Thu, 04 Apr 2013)
Log Message:
-----------
Use GLSL display for compositor backdrop and sequencer preview

Now only background images remained to be ported. Plus implement
GLSL for dithering and RGB curves.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/BIF_glutil.h
    trunk/blender/source/blender/editors/screen/glutil.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/imbuf/IMB_colormanagement.h
    trunk/blender/source/blender/imbuf/intern/colormanagement.c

Modified: trunk/blender/source/blender/editors/include/BIF_glutil.h
===================================================================
--- trunk/blender/source/blender/editors/include/BIF_glutil.h	2013-04-04 12:12:33 UTC (rev 55777)
+++ trunk/blender/source/blender/editors/include/BIF_glutil.h	2013-04-04 12:20:13 UTC (rev 55778)
@@ -35,6 +35,8 @@
 
 struct ImBuf;
 struct bContext;
+struct ColorManagedViewSettings;
+struct ColorManagedDisplaySettings;
 
 void fdrawbezier(float vec[4][3]);
 void fdrawline(float x1, float y1, float x2, float y2);
@@ -213,6 +215,11 @@
 /* **** Color management helper functions for GLSL display/transform ***** */
 
 /* Draw imbuf on a screen, preferably using GLSL display transform */
+void glaDrawImBuf_glsl(struct ImBuf *ibuf, float x, float y, int zoomfilter,
+                       struct ColorManagedViewSettings *view_settings,
+                       struct ColorManagedDisplaySettings *display_settings);
+
+/* Draw imbuf on a screen, preferably using GLSL display transform */
 void glaDrawImBuf_glsl_ctx(const struct bContext *C, struct ImBuf *ibuf, float x, float y, int zoomfilter);
 
 /* Transform buffer from role to scene linear space using GLSL OCIO conversion */

Modified: trunk/blender/source/blender/editors/screen/glutil.c
===================================================================
--- trunk/blender/source/blender/editors/screen/glutil.c	2013-04-04 12:12:33 UTC (rev 55777)
+++ trunk/blender/source/blender/editors/screen/glutil.c	2013-04-04 12:20:13 UTC (rev 55778)
@@ -1028,7 +1028,9 @@
 /* **** Color management helper functions for GLSL display/transform ***** */
 
 /* Draw given image buffer on a screen using GLSL for display transform */
-void glaDrawImBuf_glsl_ctx(const bContext *C, ImBuf *ibuf, float x, float y, int zoomfilter)
+void glaDrawImBuf_glsl(ImBuf *ibuf, float x, float y, int zoomfilter,
+                       ColorManagedViewSettings *view_settings,
+                       ColorManagedDisplaySettings *display_settings)
 {
 	bool force_fallback = false;
 	bool need_fallback = true;
@@ -1080,10 +1082,19 @@
 	if (force_fallback == false) {
 		int ok;
 
-		if (ibuf->rect_float)
-			ok = IMB_colormanagement_setup_glsl_draw_ctx(C, TRUE);
-		else
-			ok = IMB_colormanagement_setup_glsl_draw_from_space_ctx(C, ibuf->rect_colorspace, FALSE);
+		if (ibuf->rect_float) {
+			if (ibuf->float_colorspace) {
+				ok = IMB_colormanagement_setup_glsl_draw_from_space(view_settings, display_settings,
+				                                                    ibuf->float_colorspace, TRUE);
+			}
+			else {
+				ok = IMB_colormanagement_setup_glsl_draw(view_settings, display_settings, TRUE);
+			}
+		}
+		else {
+			ok = IMB_colormanagement_setup_glsl_draw_from_space(view_settings, display_settings,
+			                                                    ibuf->rect_colorspace, FALSE);
+		}
 
 		if (ok) {
 			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
@@ -1121,7 +1132,7 @@
 		unsigned char *display_buffer;
 		void *cache_handle;
 
-		display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
+		display_buffer = IMB_display_buffer_acquire(ibuf, view_settings, display_settings, &cache_handle);
 
 		if (display_buffer)
 			glaDrawPixelsAuto(x, y, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE,
@@ -1131,6 +1142,16 @@
 	}
 }
 
+void glaDrawImBuf_glsl_ctx(const bContext *C, ImBuf *ibuf, float x, float y, int zoomfilter)
+{
+	ColorManagedViewSettings *view_settings;
+	ColorManagedDisplaySettings *display_settings;
+
+	IMB_colormanagement_display_settings_from_ctx(C, &view_settings, &display_settings);
+
+	glaDrawImBuf_glsl(ibuf, x, y, zoomfilter, view_settings, display_settings);
+}
+
 /* Transform buffer from role to scene linear space using GLSL OCIO conversion
  *
  * See IMB_colormanagement_setup_transform_from_role_glsl description for

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2013-04-04 12:12:33 UTC (rev 55777)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2013-04-04 12:20:13 UTC (rev 55778)
@@ -2948,8 +2948,6 @@
 		ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
 		if (ibuf) {
 			float x, y; 
-			unsigned char *display_buffer;
-			void *cache_handle;
 			
 			glMatrixMode(GL_PROJECTION);
 			glPushMatrix();
@@ -2967,14 +2965,16 @@
 			
 			x = (ar->winx - snode->zoom * ibuf->x) / 2 + snode->xof;
 			y = (ar->winy - snode->zoom * ibuf->y) / 2 + snode->yof;
-			
 
-			display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
+			if (ibuf->rect || ibuf->rect_float) {
+				unsigned char *display_buffer = NULL;
+				void *cache_handle = NULL;
 
-			if (display_buffer) {
 				if (snode->flag & (SNODE_SHOW_R | SNODE_SHOW_G | SNODE_SHOW_B)) {
 					int ofs;
 
+					display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
+
 #ifdef __BIG_ENDIAN__
 					if      (snode->flag & SNODE_SHOW_R) ofs = 2;
 					else if (snode->flag & SNODE_SHOW_G) ofs = 1;
@@ -2994,6 +2994,8 @@
 					glPixelZoom(1.0f, 1.0f);
 				}
 				else if (snode->flag & SNODE_SHOW_ALPHA) {
+					display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
+
 					glPixelZoom(snode->zoom, snode->zoom);
 					/* swap bytes, so alpha is most significant one, then just draw it as luminance int */
 #ifdef __BIG_ENDIAN__
@@ -3011,7 +3013,7 @@
 					glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 					glPixelZoom(snode->zoom, snode->zoom);
 					
-					glaDrawPixelsAuto(x, y, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, display_buffer);
+					glaDrawImBuf_glsl_ctx(C, ibuf, x, y, GL_NEAREST);
 					
 					glPixelZoom(1.0f, 1.0f);
 					glDisable(GL_BLEND);
@@ -3019,14 +3021,15 @@
 				else {
 					glPixelZoom(snode->zoom, snode->zoom);
 
-					glaDrawPixelsAuto(x, y, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, display_buffer);
+					glaDrawImBuf_glsl_ctx(C, ibuf, x, y, GL_NEAREST);
 					
 					glPixelZoom(1.0f, 1.0f);
 				}
+
+				if (cache_handle)
+					IMB_display_buffer_release(cache_handle);
 			}
 
-			IMB_display_buffer_release(cache_handle);
-
 			/** @note draw selected info on backdrop */
 			if (snode->edittree) {
 				bNode *node = snode->edittree->nodes.first;

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2013-04-04 12:12:33 UTC (rev 55777)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2013-04-04 12:20:13 UTC (rev 55778)
@@ -920,9 +920,11 @@
 	float col[3];
 	GLuint texid;
 	GLuint last_texid;
-	unsigned char *display_buffer;
+	void *display_buffer;
 	void *cache_handle = NULL;
 	const int is_imbuf = ED_space_sequencer_check_show_imbuf(sseq);
+	int format, type;
+	bool glsl_used = false;
 
 	if (G.is_rendering == FALSE && (scene->r.seq_flag & R_SEQ_GL_PREV) == 0) {
 		/* stop all running jobs, except screen one. currently previews frustrate Render
@@ -1040,9 +1042,46 @@
 		}
 
 		display_buffer = (unsigned char *)ibuf->rect;
+		format = GL_RGBA;
+		type = GL_UNSIGNED_BYTE;
 	}
 	else {
-		display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
+		if (ibuf->rect_float) {
+			display_buffer = ibuf->rect_float;
+
+			if (ibuf->channels == 4) {
+				format = GL_RGBA;
+			}
+			else if (ibuf->channels == 3) {
+				format = GL_RGB;
+			}
+			else {
+				BLI_assert(!"Incompatible number of channels for float buffer in sequencer");
+				format = GL_RGBA;
+				display_buffer = NULL;
+			}
+
+			type = GL_FLOAT;
+
+			if (ibuf->float_colorspace) {
+				glsl_used = IMB_colormanagement_setup_glsl_draw_from_space_ctx(C, ibuf->float_colorspace, TRUE);
+			}
+			else {
+				glsl_used = IMB_colormanagement_setup_glsl_draw_ctx(C, TRUE);
+			}
+		}
+		else if (ibuf->rect) {
+			display_buffer = ibuf->rect;
+			format = GL_RGBA;
+			type = GL_UNSIGNED_BYTE;
+
+			glsl_used = IMB_colormanagement_setup_glsl_draw_from_space_ctx(C, ibuf->rect_colorspace, FALSE);
+		}
+		else {
+			format = GL_RGBA;
+			type = GL_UNSIGNED_BYTE;
+			display_buffer = NULL;
+		}
 	}
 
 	/* setting up the view - actual drawing starts here */
@@ -1068,7 +1107,7 @@
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, display_buffer);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, format, type, display_buffer);
 
 	glBegin(GL_QUADS);
 
@@ -1105,6 +1144,9 @@
 		glDisable(GL_BLEND);
 	glDeleteTextures(1, &texid);
 
+	if (glsl_used)
+		IMB_colormanagement_finish_glsl_draw();
+
 	if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
 
 		float x1 = v2d->tot.xmin;

Modified: trunk/blender/source/blender/imbuf/IMB_colormanagement.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_colormanagement.h	2013-04-04 12:12:33 UTC (rev 55777)
+++ trunk/blender/source/blender/imbuf/IMB_colormanagement.h	2013-04-04 12:20:13 UTC (rev 55778)
@@ -95,6 +95,10 @@
 
 /* ** Public display buffers interfaces ** */
 
+void IMB_colormanagement_display_settings_from_ctx(const struct bContext *C,
+                                                   struct ColorManagedViewSettings **view_settings_r,
+                                                   struct ColorManagedDisplaySettings **display_settings_r);
+
 unsigned char *IMB_display_buffer_acquire(struct ImBuf *ibuf, const struct ColorManagedViewSettings *view_settings,
                                           const struct ColorManagedDisplaySettings *display_settings, void **cache_handle);
 unsigned char *IMB_display_buffer_acquire_ctx(const struct bContext *C, struct ImBuf *ibuf, void **cache_handle);

Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-04-04 12:12:33 UTC (rev 55777)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-04-04 12:20:13 UTC (rev 55778)
@@ -662,8 +662,9 @@
 	}
 }
 
-static void display_transform_get_from_ctx(const bContext *C, ColorManagedViewSettings **view_settings_r,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list