diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-04-02 21:28:37 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-04-02 21:28:37 +0400 |
commit | 752ad1bc375663f4bab649dd558f7334cbe03a1c (patch) | |
tree | 9f528055a06ee2d6a6e1c3cf2c6f4e02fd2dff23 /source/blender/imbuf | |
parent | f871d9a82f06e70fb26cbe0bfbd4db18d481059c (diff) |
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.
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r-- | source/blender/imbuf/IMB_colormanagement.h | 15 | ||||
-rw-r--r-- | source/blender/imbuf/intern/colormanagement.c | 60 |
2 files changed, 67 insertions, 8 deletions
diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h index 473bd7d0c7a..a758cfa04f0 100644 --- a/source/blender/imbuf/IMB_colormanagement.h +++ b/source/blender/imbuf/IMB_colormanagement.h @@ -150,11 +150,18 @@ void IMB_colormanagement_processor_free(struct ColormanageProcessor *cm_processo /* ** OpenGL drawing routines using GLSL for color space transform ** */ -int IMB_coloemanagement_setup_glsl_draw(const struct ColorManagedViewSettings *view_settings, +/* 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 IMB_coloemanagement_setup_glsl_draw_from_ctx(const struct bContext *C); -void IMB_coloemanagement_finish_glsl_draw(void); +/* Same as above, but color management settings are guessing from a given context */ +int IMB_colormanagement_setup_glsl_draw_from_ctx(const struct bContext *C); +/* Finish GLSL-based display space conversion */ +void IMB_colormanagement_finish_glsl_draw(void); + +/* Configures GLSL shader for conversion from space defined by role to scene linear space */ +int IMB_colormanagement_setup_transform_from_role_glsl(int role); +/* Finish GLSL-based color space conversion */ +void IMB_colormanagement_finish_glsl_transform(void); /* Roles */ enum { diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index e9447d255cb..1aa8c5af342 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -113,6 +113,7 @@ static struct global_glsl_state { /* Container for GLSL state needed for OCIO module. */ struct OCIO_GLSLDrawState *ocio_glsl_state; + struct OCIO_GLSLDrawState *transform_ocio_glsl_state; } global_glsl_state; /*********************** Color managed cache *************************/ @@ -626,6 +627,9 @@ void colormanagement_exit(void) if (global_glsl_state.ocio_glsl_state) OCIO_freeOGLState(global_glsl_state.ocio_glsl_state); + if (global_glsl_state.transform_ocio_glsl_state) + OCIO_freeOGLState(global_glsl_state.transform_ocio_glsl_state); + colormanage_free_config(); } @@ -2750,7 +2754,20 @@ static void update_glsl_display_processor(const ColorManagedViewSettings *view_s } } -int IMB_coloemanagement_setup_glsl_draw(const ColorManagedViewSettings *view_settings, +/** + * Configures GLSL shader for conversion from scene linear + * to display space + * + * Will create appropriate OCIO processor and setup GLSL shader, + * so further 2D texture usage will use this conversion. + * + * When there's no need to apply transform on 2D textures, use + * IMB_colormanagement_finish_glsl_draw(). + * + * This is low-level function, use glaDrawImBuf_glsl_ctx if you + * only need to display given image buffer + */ +int IMB_colormanagement_setup_glsl_draw(const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings) { ColorManagedViewSettings default_view_settings; @@ -2778,17 +2795,52 @@ int IMB_coloemanagement_setup_glsl_draw(const ColorManagedViewSettings *view_set return OCIO_setupGLSLDraw(&global_glsl_state.ocio_glsl_state, global_glsl_state.processor); } -int IMB_coloemanagement_setup_glsl_draw_from_ctx(const bContext *C) +/* Same as above, but color management settings are guessing from a given context */ +int IMB_colormanagement_setup_glsl_draw_from_ctx(const bContext *C) { ColorManagedViewSettings *view_settings; ColorManagedDisplaySettings *display_settings; display_transform_get_from_ctx(C, &view_settings, &display_settings); - return IMB_coloemanagement_setup_glsl_draw(view_settings, display_settings); + return IMB_colormanagement_setup_glsl_draw(view_settings, display_settings); } -void IMB_coloemanagement_finish_glsl_draw(void) +/* Finish GLSL-based display space conversion */ +void IMB_colormanagement_finish_glsl_draw(void) { OCIO_finishGLSLDraw(global_glsl_state.ocio_glsl_state); } + +/* ** Color space conversion using GLSL shader ** */ + +/** + * Configures GLSL shader for conversion from space defined by role + * to scene linear space + * + * Will create appropriate OCIO processor and setup GLSL shader, + * so further 2D texture usage will use this conversion. + * + * Role is an pseudonym for a color space, see bottom of file + * IMB_colormanagement.h for list of available roles. + * + * When there's no need to apply transform on 2D textures, use + * IMB_colormanagement_finish_glsl_transform(). + */ +int IMB_colormanagement_setup_transform_from_role_glsl(int role) +{ + OCIO_ConstProcessorRcPtr *processor; + ColorSpace *colorspace; + + colorspace = colormanage_colorspace_get_roled(role); + + processor = colorspace_to_scene_linear_processor(colorspace); + + return OCIO_setupGLSLDraw(&global_glsl_state.transform_ocio_glsl_state, processor); +} + +/* Finish GLSL-based color space conversion */ +void IMB_colormanagement_finish_glsl_transform(void) +{ + OCIO_finishGLSLDraw(global_glsl_state.transform_ocio_glsl_state); +} |