[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55733] trunk/blender/source/blender: More usage of GLSL for color managed image drawing

IRIE Shinsuke irieshinsuke at yahoo.co.jp
Wed Apr 3 09:50:20 CEST 2013


Hi Sergey,

This commit breaks the compositor.  The input from primary renderlayer
is replaced with another renderlayer that is currently selected in the
renderlayer panel, so the expected result cannot be obtained unless the
primary renderlayer is selected.

Thanks,

IRIE Shinsuke

13/04/03, Sergey Sharybin wrote:
> Revision: 55733
>            http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55733
> Author:   nazgul
> Date:     2013-04-02 17:28:37 +0000 (Tue, 02 Apr 2013)
> Log Message:
> -----------
> More usage of GLSL for color managed image drawing
>
> Uses GLSL for drawing image in Image Editor space.
>
> This requires change in image_buffer_rect_update, so
> original float buffer is being updated as well. This
> is unlikely be something bad, but will keep an eye
> on this change.
>
> Also no byte buffer allocation happens there, this
> is so because byte buffer used for display only
> and in case of GLSL display such allocation and
> partial update is just waste of time.
>
> Also switched OpenGL render from using CPU color
> space linearization to GLSL color space transform.
> Makes OpenGL rendering pretty much faster (but
> still slower than in 2.60).
>
> internal changes:
>
> - Added functions to setup GLSL shader for color
>    space conversion in colormanagement.c. Currently
>    conversion form a colorspace defined by a role to
>    linear space is implemented. Easy to extend to
>    other cases.
>
> - Added helper functions to glutil.c which does
>    smarter image buffer draw (calling all needed OCIO
>    stuff, editors now could draw image buffer with a
>    single function call -- all the checks are done in
>    glutil.c).
>
> - Also added helper function for buffer linearization
>    from a given role to glutil.c. Everyone now able to
>    linearize buffer with a single call.
>
>    This function will do nothing is GLSL routines fails
>    or not supported.
>
>    And one last this: this function uses offscreen
>    drawing, could potentially give issues on some
>    cards, also will keep an eye on this.
>
> Modified Paths:
> --------------
>      trunk/blender/source/blender/editors/include/BIF_glutil.h
>      trunk/blender/source/blender/editors/render/render_internal.c
>      trunk/blender/source/blender/editors/render/render_opengl.c
>      trunk/blender/source/blender/editors/screen/CMakeLists.txt
>      trunk/blender/source/blender/editors/screen/glutil.c
>      trunk/blender/source/blender/editors/space_clip/clip_draw.c
>      trunk/blender/source/blender/editors/space_image/image_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-02 17:28:29 UTC (rev 55732)
> +++ trunk/blender/source/blender/editors/include/BIF_glutil.h	2013-04-02 17:28:37 UTC (rev 55733)
> @@ -33,6 +33,9 @@
>   struct rcti;
>   struct rctf;
>
> +struct ImBuf;
> +struct bContext;
> +
>   void fdrawbezier(float vec[4][3]);
>   void fdrawline(float x1, float y1, float x2, float y2);
>   void fdrawbox(float x1, float y1, float x2, float y2);
> @@ -223,5 +226,13 @@
>   } bglMats;
>   void bgl_get_mats(bglMats *mats);
>
> +/* **** Color management helper functions for GLSL display/transform ***** */
> +
> +/* 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 */
> +int glaBufferTransformFromRole_glsl(float *buffer, int width, int height, int role);
> +
>   #endif /* __BIF_GLUTIL_H__ */
>
>
> Modified: trunk/blender/source/blender/editors/render/render_internal.c
> ===================================================================
> --- trunk/blender/source/blender/editors/render/render_internal.c	2013-04-02 17:28:29 UTC (rev 55732)
> +++ trunk/blender/source/blender/editors/render/render_internal.c	2013-04-02 17:28:37 UTC (rev 55733)
> @@ -140,15 +140,23 @@
>   		}
>   	}
>   	if (rectf == NULL) return;
> -
> -	if (ibuf->rect == NULL)
> -		imb_addrectImBuf(ibuf);
>   	
>   	rectf += 4 * (rr->rectx * ymin + xmin);
>
> -	IMB_partial_display_buffer_update(ibuf, rectf, NULL, rr->rectx, rxmin, rymin,
> -	                                  &scene->view_settings, &scene->display_settings,
> -	                                  rxmin, rymin, rxmin + xmax, rymin + ymax, TRUE);
> +	if (ibuf->rect) {
> +		IMB_partial_display_buffer_update(ibuf, rectf, NULL, rr->rectx, rxmin, rymin,
> +		                                  &scene->view_settings, &scene->display_settings,
> +		                                  rxmin, rymin, rxmin + xmax, rymin + ymax, TRUE);
> +	}
> +
> +	/* update float buffer as well, so fast GLSL display could use it
> +	 *
> +	 * TODO(sergey): not actually sure it is nice thing to modify something here
> +	 *               but ibuf->rect used to be modified here
> +	 */
> +	IMB_buffer_float_from_float(ibuf->rect_float + 4 * (ibuf->x * rymin + rxmin), rectf,
> +	                            4, IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, FALSE,
> +	                            xmax, ymax, ibuf->x, rr->rectx);
>   }
>
>   /* ****************************** render invoking ***************** */
>
> Modified: trunk/blender/source/blender/editors/render/render_opengl.c
> ===================================================================
> --- trunk/blender/source/blender/editors/render/render_opengl.c	2013-04-02 17:28:29 UTC (rev 55732)
> +++ trunk/blender/source/blender/editors/render/render_opengl.c	2013-04-02 17:28:37 UTC (rev 55733)
> @@ -69,6 +69,8 @@
>   #include "RNA_access.h"
>   #include "RNA_define.h"
>
> +#include "BIF_gl.h"
> +#include "BIF_glutil.h"
>
>   #include "GPU_extensions.h"
>
> @@ -261,11 +263,14 @@
>   	 */
>
>   	if (!oglrender->is_sequencer) {
> -		/* sequencer has got tricker ocnversion happened above */
> -
> -		IMB_buffer_float_from_float(rr->rectf, rr->rectf,
> -		                            4, IB_PROFILE_LINEAR_RGB, IB_PROFILE_SRGB, TRUE,
> -		                            oglrender->sizex, oglrender->sizey, oglrender->sizex, oglrender->sizex);
> +		/* sequencer has got trickier conversion happened above
> +		 * also assume opengl's space matches byte buffer color space
> +		 */
> +		if (!glaBufferTransformFromRole_glsl(rr->rectf, oglrender->sizex, oglrender->sizey, COLOR_ROLE_DEFAULT_BYTE)) {
> +			IMB_buffer_float_from_float(rr->rectf, rr->rectf,
> +			                            4, IB_PROFILE_LINEAR_RGB, IB_PROFILE_SRGB, TRUE,
> +			                            oglrender->sizex, oglrender->sizey, oglrender->sizex, oglrender->sizex);
> +		}
>   	}
>
>   	/* rr->rectf is now filled with image data */
>
> Modified: trunk/blender/source/blender/editors/screen/CMakeLists.txt
> ===================================================================
> --- trunk/blender/source/blender/editors/screen/CMakeLists.txt	2013-04-02 17:28:29 UTC (rev 55732)
> +++ trunk/blender/source/blender/editors/screen/CMakeLists.txt	2013-04-02 17:28:37 UTC (rev 55733)
> @@ -25,6 +25,7 @@
>   	../../blenlib
>   	../../blenloader
>   	../../bmesh
> +	../../gpu
>   	../../imbuf
>   	../../makesdna
>   	../../makesrna
>
> Modified: trunk/blender/source/blender/editors/screen/glutil.c
> ===================================================================
> --- trunk/blender/source/blender/editors/screen/glutil.c	2013-04-02 17:28:29 UTC (rev 55732)
> +++ trunk/blender/source/blender/editors/screen/glutil.c	2013-04-02 17:28:37 UTC (rev 55733)
> @@ -43,10 +43,16 @@
>
>   #include "BKE_blender.h"
>   #include "BKE_colortools.h"
> +#include "BKE_context.h"
>
>   #include "BIF_gl.h"
>   #include "BIF_glutil.h"
>
> +#include "GPU_extensions.h"
> +
> +#include "IMB_colormanagement.h"
> +#include "IMB_imbuf_types.h"
> +
>   #ifndef GL_CLAMP_TO_EDGE
>   #define GL_CLAMP_TO_EDGE                        0x812F
>   #endif
> @@ -983,3 +989,89 @@
>   #endif
>   }
>   #endif
> +
> +/* **** 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)
> +{
> +	bool need_fallback = true;
> +
> +	/* Bytes and dithering are not supported on GLSL yet */
> +	if (ibuf->rect_float && ibuf->dither == 0.0f) {
> +		if (IMB_colormanagement_setup_glsl_draw_from_ctx(C)) {
> +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
> +			glColor4f(1.0, 1.0, 1.0, 1.0);
> +
> +			glaDrawPixelsTex(x, y, ibuf->x, ibuf->y, GL_FLOAT, zoomfilter, ibuf->rect_float);
> +
> +			IMB_colormanagement_finish_glsl_draw();
> +
> +			need_fallback = false;
> +		}
> +	}
> +
> +	if (need_fallback) {
> +		unsigned char *display_buffer;
> +		void *cache_handle;
> +
> +		display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
> +
> +		if (display_buffer)
> +			glaDrawPixelsAuto(x, y, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, zoomfilter, display_buffer);
> +
> +		IMB_display_buffer_release(cache_handle);
> +	}
> +}
> +
> +/* Transform buffer from role to scene linear space using GLSL OCIO conversion
> + *
> + * See IMB_colormanagement_setup_transform_from_role_glsl description for
> + * some more details
> + */
> +int glaBufferTransformFromRole_glsl(float *buffer, int width, int height, int role)
> +{
> +	GPUOffScreen *ofs;
> +	char err_out[256];
> +	rcti display_rect;
> +
> +	ofs = GPU_offscreen_create(width, height, err_out);
> +
> +	if (!ofs)
> +		return FALSE;
> +
> +	GPU_offscreen_bind(ofs);
> +
> +	if (!IMB_colormanagement_setup_transform_from_role_glsl(role)) {
> +		GPU_offscreen_unbind(ofs);
> +		GPU_offscreen_free(ofs);
> +		return FALSE;
> +	}
> +
> +	BLI_rcti_init(&display_rect, 0, width, 0, height);
> +
> +	glMatrixMode(GL_PROJECTION);
> +	glPushMatrix();
> +	glMatrixMode(GL_MODELVIEW);
> +	glPushMatrix();
> +
> +	glaDefine2DArea(&display_rect);
> +	glLoadIdentity();
> +
> +	glaDrawPixelsTex(0, 0, width, height, GL_FLOAT, GL_NEAREST, buffer);
> +
> +	glMatrixMode(GL_PROJECTION);
> +	glPopMatrix();
> +	glMatrixMode(GL_MODELVIEW);
> +	glPopMatrix();
> +
> +	GPU_offscreen_read_pixels(ofs, GL_FLOAT, buffer);
> +
> +	IMB_colormanagement_finish_glsl_transform();
> +
> +	/* unbind */
> +	GPU_offscreen_unbind(ofs);
> +	GPU_offscreen_free(ofs);
> +
> +	return TRUE;
> +}
>
> Modified: trunk/blender/source/blender/editors/space_clip/clip_draw.c
> ===================================================================
> --- trunk/blender/source/blender/editors/space_clip/clip_draw.c	2013-04-02 17:28:29 UTC (rev 55732)
> +++ trunk/blender/source/blender/editors/space_clip/clip_draw.c	2013-04-02 17:28:37 UTC (rev 55733)
> @@ -248,53 +248,6 @@
>   		ED_region_info_draw(ar, str, block, 0.6f);
>   }
>
> -static void draw_movieclip_buffer_glsl(SpaceClip *sc, ImBuf *ibuf, int x, int y,
> -                                       float zoomx, float zoomy)
> -{
> -	MovieClip *clip = ED_space_clip_get_clip(sc);
> -	int filter = GL_LINEAR;
> -
> -	glPushMatrix();
> -	glTranslatef(x, y, 0.0f);
> -	glScalef(zoomx, zoomy, 1.0f);
> -
> -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
> -
> -	glColor4f(1.0, 1.0, 1.0, 1.0);
> -
> -	/* non-scaled proxy shouldn;t use diltering */
> -	if ((clip->flag & MCLIP_USE_PROXY) == 0 ||
> -	    ELEM(sc->user.render_size, MCLIP_PROXY_RENDER_SIZE_FULL, MCLIP_PROXY_RENDER_SIZE_100))
> -	{
> -		filter = GL_NEAREST;
> -	}
> -
> -	glaDrawPixelsTex(0, 0, ibuf->x, ibuf->y, GL_FLOAT, filter, ibuf->rect_float);
> -
> -	glPopMatrix();
> -}
> -
> -static void draw_movieclip_buffer_fallback(const bContext *C, ImBuf *ibuf, int x, int y,
> -                                           int width, int height, float zoomx, float zoomy)
> -{
> -	unsigned char *display_buffer;
> -	void *cache_handle;
> -
> -	display_buffer = IMB_display_buffer_acquire_ctx(C, ibuf, &cache_handle);
> -
> -	if (display_buffer) {
> -		/* set zoom */
> -		glPixelZoom(zoomx * width / ibuf->x, zoomy * height / ibuf->y);
> -
> -		glaDrawPixelsAuto(x, y, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, GL_NEAREST, display_buffer);
> -
> -		/* reset zoom */
> -		glPixelZoom(1.0f, 1.0f);
> -	}
> -
> -	IMB_display_buffer_release(cache_handle);
> -}
> -
>   static void draw_movieclip_buffer(const bContext *C, SpaceClip *sc, ARegion *ar, ImBuf *ibuf,
>                                     int width, int height, float zoomx, float zoomy)
>   {
> @@ -308,7 +261,8 @@
>   		glRectf(x, y, x + zoomx * width, y + zoomy * height);
>   	}
>   	else {
> -		bool need_fallback = true;
> +		MovieClip *clip = ED_space_clip_get_clip(sc);
> +		int filter = GL_LINEAR;
>
>   		/* checkerboard for case alpha */
>   		if (ibuf->planes == 32) {
> @@ -318,20 +272,15 @@
>   			fdrawcheckerboard(x, y, x + zoomx * ibuf->x, y + zoomy * ibuf->y);
>   		}
>
> -		/* GLSL display transform for byte buffers is not supported yet */
> -		if (ibuf->rect_float && IMB_coloemanagement_setup_glsl_draw_from_ctx(C)) {
> -			draw_movieclip_buffer_glsl(sc, ibuf, x, y, zoomx, zoomy);
> +		/* non-scaled proxy shouldn't use filtering */
> +		if ((clip->flag & MCLIP_USE_PROXY) == 0 ||
> +		    ELEM(sc->user.render_size, MCLIP_PROXY_RENDER_SIZE_FULL, MCLIP_PROXY_RENDER_SIZE_100))
> +			{
> +				filter = GL_NEAREST;
> +			}
>
> -			IMB_coloemanagement_finish_glsl_draw();
> +		glaDrawImBuf_glsl_ctx(C, ibuf, x, y, GL_NEAREST);
>
> -			need_fallback = false;
> -		}
> -
> -		/* if GLSL display failed, fallback to regular glaDrawPixelsAuto method */
> -		if (need_fallback) {
> -			draw_movieclip_buffer_fallback(C, ibuf, x, y, width, height, zoomx, zoomy);
> -		}
> -
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list