[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59677] trunk/blender: RenderEngine API: add viewport draw utility functions to bind a GLSL fragment

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Aug 31 01:49:35 CEST 2013


Revision: 59677
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59677
Author:   blendix
Date:     2013-08-30 23:49:35 +0000 (Fri, 30 Aug 2013)
Log Message:
-----------
RenderEngine API: add viewport draw utility functions to bind a GLSL fragment
shader for converting colors from linear to display space, based on the scene
color management settings.

if engine.support_display_space_shader(scene): # test graphics card support
	engine.bind_display_space_shader(scene)
	# draw pixels ..
	engine.unbind_display_space_shader()

Modified Paths:
--------------
    trunk/blender/intern/opencolorio/fallback_impl.cc
    trunk/blender/intern/opencolorio/ocio_capi.cc
    trunk/blender/intern/opencolorio/ocio_capi.h
    trunk/blender/intern/opencolorio/ocio_impl.h
    trunk/blender/intern/opencolorio/ocio_impl_glsl.cc
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/screen/glutil.c
    trunk/blender/source/blender/imbuf/IMB_colormanagement.h
    trunk/blender/source/blender/imbuf/intern/colormanagement.c
    trunk/blender/source/blender/makesrna/intern/rna_color.c
    trunk/blender/source/blender/makesrna/intern/rna_render.c

Modified: trunk/blender/intern/opencolorio/fallback_impl.cc
===================================================================
--- trunk/blender/intern/opencolorio/fallback_impl.cc	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/intern/opencolorio/fallback_impl.cc	2013-08-30 23:49:35 UTC (rev 59677)
@@ -381,6 +381,11 @@
 {
 }
 
+bool FallbackImpl::supportGLSLDraw(void)
+{
+	return false;
+}
+
 bool FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor, bool predivide)
 {
 	return false;

Modified: trunk/blender/intern/opencolorio/ocio_capi.cc
===================================================================
--- trunk/blender/intern/opencolorio/ocio_capi.cc	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/intern/opencolorio/ocio_capi.cc	2013-08-30 23:49:35 UTC (rev 59677)
@@ -283,6 +283,11 @@
 	impl->matrixTransformScale(m44, offset4, scale4f);
 }
 
+int OCIO_supportGLSLDraw(void)
+{
+	return (int) impl->supportGLSLDraw();
+}
+
 int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor, int predivide)
 {
 	return (int) impl->setupGLSLDraw(state_r, processor, (bool) predivide);

Modified: trunk/blender/intern/opencolorio/ocio_capi.h
===================================================================
--- trunk/blender/intern/opencolorio/ocio_capi.h	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/intern/opencolorio/ocio_capi.h	2013-08-30 23:49:35 UTC (rev 59677)
@@ -121,6 +121,7 @@
 
 void OCIO_matrixTransformScale(float * m44, float * offset4, const float * scale4);
 
+int OCIO_supportGLSLDraw(void);
 int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor, int predivide);
 void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state);
 void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state);

Modified: trunk/blender/intern/opencolorio/ocio_impl.h
===================================================================
--- trunk/blender/intern/opencolorio/ocio_impl.h	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/intern/opencolorio/ocio_impl.h	2013-08-30 23:49:35 UTC (rev 59677)
@@ -96,6 +96,7 @@
 
 	virtual void matrixTransformScale(float * m44, float * offset4, const float * scale4) = 0;
 
+	virtual bool supportGLSLDraw(void) = 0;
 	virtual bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor, bool predivide) = 0;
 	virtual void finishGLSLDraw(struct OCIO_GLSLDrawState *state) = 0;
 	virtual void freeGLState(struct OCIO_GLSLDrawState *state_r) = 0;
@@ -169,6 +170,7 @@
 
 	void matrixTransformScale(float * m44, float * offset4, const float * scale4);
 
+	bool supportGLSLDraw(void);
 	bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor, bool predivide);
 	void finishGLSLDraw(struct OCIO_GLSLDrawState *state);
 	void freeGLState(struct OCIO_GLSLDrawState *state_r);
@@ -243,6 +245,7 @@
 
 	void matrixTransformScale(float * m44, float * offset4, const float * scale4);
 
+	bool supportGLSLDraw(void);
 	bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor, bool predivide);
 	void finishGLSLDraw(struct OCIO_GLSLDrawState *state);
 	void freeGLState(struct OCIO_GLSLDrawState *state_r);

Modified: trunk/blender/intern/opencolorio/ocio_impl_glsl.cc
===================================================================
--- trunk/blender/intern/opencolorio/ocio_impl_glsl.cc	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/intern/opencolorio/ocio_impl_glsl.cc	2013-08-30 23:49:35 UTC (rev 59677)
@@ -36,12 +36,7 @@
 #include <sstream>
 #include <string.h>
 
-#ifdef __APPLE__
-#include <OpenGL/gl.h>
-#include <OpenGL/glu.h>
-#else
 #include <GL/glew.h>
-#endif
 
 #include <OpenColorIO/OpenColorIO.h>
 
@@ -202,6 +197,13 @@
 	return state->lut3d_texture_valid;
 }
 
+/* Detect if we can support GLSL drawing */
+bool OCIOImpl::supportGLSLDraw()
+{
+	/* GLSL and GL_RGB16F_ARB */
+	return GLEW_VERSION_2_0 && (GLEW_VERSION_3_0 || GLEW_ARB_texture_float);
+}
+
 /**
  * Setup OpenGL contexts for a transform defined by processor using GLSL
  * All LUT allocating baking and shader compilation happens here.

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2013-08-30 23:49:35 UTC (rev 59677)
@@ -1125,7 +1125,7 @@
 
 		/* Try using GLSL display transform. */
 		if (force_fallback == false) {
-			if (IMB_colormanagement_setup_glsl_draw(NULL, &scene->display_settings, TRUE)) {
+			if (IMB_colormanagement_setup_glsl_draw(NULL, &scene->display_settings, TRUE, FALSE)) {
 				glEnable(GL_BLEND);
 				glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
 				glaDrawPixelsTex(rres.xof, rres.yof, rres.rectx, rres.recty, GL_RGBA, GL_FLOAT,

Modified: trunk/blender/source/blender/editors/screen/glutil.c
===================================================================
--- trunk/blender/source/blender/editors/screen/glutil.c	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/source/blender/editors/screen/glutil.c	2013-08-30 23:49:35 UTC (rev 59677)
@@ -1091,15 +1091,18 @@
 		if (ibuf->rect_float) {
 			if (ibuf->float_colorspace) {
 				ok = IMB_colormanagement_setup_glsl_draw_from_space(view_settings, display_settings,
-				                                                    ibuf->float_colorspace, TRUE);
+				                                                    ibuf->float_colorspace,
+				                                                    TRUE, FALSE);
 			}
 			else {
-				ok = IMB_colormanagement_setup_glsl_draw(view_settings, display_settings, TRUE);
+				ok = IMB_colormanagement_setup_glsl_draw(view_settings, display_settings,
+				                                         TRUE, FALSE);
 			}
 		}
 		else {
 			ok = IMB_colormanagement_setup_glsl_draw_from_space(view_settings, display_settings,
-			                                                    ibuf->rect_colorspace, FALSE);
+			                                                    ibuf->rect_colorspace,
+			                                                    FALSE, FALSE);
 		}
 
 		if (ok) {

Modified: trunk/blender/source/blender/imbuf/IMB_colormanagement.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_colormanagement.h	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/source/blender/imbuf/IMB_colormanagement.h	2013-08-30 23:49:35 UTC (rev 59677)
@@ -159,15 +159,20 @@
 
 /* ** OpenGL drawing routines using GLSL for color space transform ** */
 
+/* Test if GLSL drawing is supported for combination of graphics card and this configuration */
+int IMB_colormanagement_support_glsl_draw(const struct ColorManagedViewSettings *view_settings,
+                                          int skip_curves);
 /* Configures GLSL shader for conversion from scene linear to display space */
 int IMB_colormanagement_setup_glsl_draw(const struct ColorManagedViewSettings *view_settings,
                                         const struct ColorManagedDisplaySettings *display_settings,
-                                        int predivide);
+                                        int predivide,
+                                        int skip_curves);
 /* Same as above, but display space conversion happens from a specified space */
 int IMB_colormanagement_setup_glsl_draw_from_space(const struct ColorManagedViewSettings *view_settings,
                                                    const struct ColorManagedDisplaySettings *display_settings,
                                                    struct ColorSpace *colorspace,
-                                                   int predivide);
+                                                   int predivide,
+                                                   int skip_curves);
 /* Same as setup_glsl_draw, but color management settings are guessing from a given context */
 int IMB_colormanagement_setup_glsl_draw_ctx(const struct bContext *C, int predivide);
 /* Same as setup_glsl_draw_from_space, but color management settings are guessing from a given context */

Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-08-30 23:09:22 UTC (rev 59676)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-08-30 23:49:35 UTC (rev 59677)
@@ -2807,6 +2807,17 @@
 	}
 }
 
+int IMB_colormanagement_support_glsl_draw(const ColorManagedViewSettings *view_settings,
+                                          int skip_curves)
+{
+	/* curves not supported yet */
+	if (!skip_curves)
+		if (view_settings && (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES))
+			return 0;
+
+	return OCIO_supportGLSLDraw();
+}
+
 /**
  * Configures GLSL shader for conversion from specified to
  * display color space
@@ -2822,7 +2833,8 @@
  */
 int IMB_colormanagement_setup_glsl_draw_from_space(const ColorManagedViewSettings *view_settings,
                                                    const ColorManagedDisplaySettings *display_settings,
-                                                   struct ColorSpace *from_colorspace, int predivide)
+                                                   struct ColorSpace *from_colorspace, int predivide,
+                                                   int skip_curves)
 {
 	ColorManagedViewSettings default_view_settings;
 	const ColorManagedViewSettings *applied_view_settings;
@@ -2840,8 +2852,9 @@
 	}
 
 	/* RGB curves mapping is not supported on GPU yet. */
-	if (applied_view_settings->flag & COLORMANAGE_VIEW_USE_CURVES)
-		return FALSE;
+	if (!skip_curves)
+		if (applied_view_settings->flag & COLORMANAGE_VIEW_USE_CURVES)
+			return FALSE;
 
 	/* Make sure OCIO processor is up-to-date. */
 	update_glsl_display_processor(applied_view_settings, display_settings,
@@ -2853,10 +2866,10 @@
 /* Configures GLSL shader for conversion from scene linear to display space */
 int IMB_colormanagement_setup_glsl_draw(const ColorManagedViewSettings *view_settings,
                                         const ColorManagedDisplaySettings *display_settings,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list