[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 10:36:20 CEST 2013
Submitted a bug report in the tracker:
http://projects.blender.org/tracker/index.php?func=detail&aid=34854&group_id=9&atid=498
IRIE Shinsuke
13/04/03, Sergey Sharybin wrote:
> 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
>>
>
>
>
More information about the Bf-committers
mailing list