[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
Sergey Sharybin
sergey.vfx at gmail.com
Wed Apr 3 10:13:27 CEST 2013
This commit does nothing to do with compositor.
Please report a bug to the tracker and attach .blend file which
demonstrates the issue.
On Wed, Apr 3, 2013 at 1:50 PM, IRIE Shinsuke <irieshinsuke at yahoo.co.jp>wrote:
> 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
> >
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>
--
With best regards, Sergey Sharybin
More information about the Bf-committers
mailing list