Commit: d85fd8feeb1b493b891158fd4cc5ed8bd44c7990
Author: Jeroen Bakker
Date:   Fri May 4 16:26:31 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd85fd8feeb1b493b891158fd4cc5ed8bd44c7990

T54953: Use OCIO for display color management

===================================================================

M       source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M       source/blender/draw/engines/workbench/workbench_materials.c
M       source/blender/draw/engines/workbench/workbench_private.h

===================================================================

diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index 5fcadc21a2c..e9d9b8c02e8 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -33,20 +33,3 @@ vec2 normal_encode(vec3 n)
        float p = sqrt(n.z * 8.0 + 8.0);
        return vec2(n.xy / p + 0.5);
 }
-
-/* Linear to srgb conversion */
-const float SRGB_ALPHA = 0.055;
-float linear_to_srgb(float channel) {
-       if(channel <= 0.0031308) {
-               return 12.92 * channel;
-       } else {
-               return (1.0 + SRGB_ALPHA) * pow(channel, 1.0/2.4) - SRGB_ALPHA;
-       }
-}
-vec3 linearrgb_to_srgb(vec3 rgb) {
-       return vec3(
-               linear_to_srgb(rgb.r),
-               linear_to_srgb(rgb.g),
-               linear_to_srgb(rgb.b)
-       );
-}
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index b032bb6a7b5..f93debc8d66 100644
--- 
a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -13,7 +13,6 @@ layout(std140) uniform world_block {
        WorldData world_data;
 };
 
-
 void main()
 {
        ivec2 texel = ivec2(gl_FragCoord.xy);
@@ -22,7 +21,7 @@ void main()
 
 #ifndef V3D_DRAWOPTION_OBJECT_OVERLAP
        if (depth == 1.0) {
-               fragColor = vec4(linearrgb_to_srgb(background_color(world_data, 
uv_viewport.y)), 0.0);
+               fragColor = vec4(background_color(world_data, uv_viewport.y), 
0.0);
                return;
        }
 #else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
@@ -32,9 +31,9 @@ void main()
        if (object_id == NO_OBJECT_ID) {
                vec3 background = background_color(world_data, uv_viewport.y);
                if (object_overlap == 0.0) {
-                       fragColor = vec4(linearrgb_to_srgb(background), 0.0);
+                       fragColor = vec4(background, 0.0);
                } else {
-                       fragColor = 
vec4(linearrgb_to_srgb(mix(objectOverlapColor, background, object_overlap)), 
1.0-object_overlap);
+                       fragColor = vec4(mix(objectOverlapColor, background, 
object_overlap), 1.0-object_overlap);
                }
                return;
        }
@@ -64,5 +63,5 @@ void main()
        shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
 #endif /* V3D_DRAWOPTION_OBJECT_OVERLAP */
 
-       fragColor = vec4(linearrgb_to_srgb(shaded_color), 1.0);
+       fragColor = vec4(shaded_color, 1.0);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c 
b/source/blender/draw/engines/workbench/workbench_materials.c
index 052ea75a7ff..a7f21223c22 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -50,6 +50,7 @@ static struct {
        struct GPUTexture *object_id_tx; /* ref only, not alloced */
        struct GPUTexture *color_buffer_tx; /* ref only, not alloced */
        struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
+       struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
 
        float light_direction[3]; /* world light direction for shadows */
        int next_object_id;
@@ -137,7 +138,9 @@ static char *workbench_build_prepass_frag(void)
 static int get_shader_index(WORKBENCH_PrivateData *wpd)
 {
        const int DRAWOPTIONS_MASK = V3D_DRAWOPTION_OBJECT_OVERLAP;
-       return ((wpd->drawtype_options & DRAWOPTIONS_MASK) << 2) + 
wpd->drawtype_lighting;
+       int index = (wpd->drawtype_options & DRAWOPTIONS_MASK);
+       index = (index << 2) + wpd->drawtype_lighting;
+       return index;
 }
 
 static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
@@ -237,6 +240,7 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata)
                const int size[2] = {(int)viewport_size[0], 
(int)viewport_size[1]};
                e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], 
size[1], GPU_R32UI, &draw_engine_workbench_solid);
                e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], 
size[1], GPU_RGBA8, &draw_engine_workbench_solid);
+               e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], 
size[1], GPU_RGBA16F, &draw_engine_workbench_solid);
 #ifdef WORKBENCH_ENCODE_NORMALS
                e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], 
size[1], GPU_RG8, &draw_engine_workbench_solid);
 #else
@@ -249,6 +253,10 @@ void workbench_materials_engine_init(WORKBENCH_Data 
*vedata)
                        GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
                        GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
                });
+               GPU_framebuffer_ensure_config(&fbl->composite_fb, {
+                       GPU_ATTACHMENT_TEXTURE(dtxl->depth),
+                       GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx),
+               });
        }
 
        /* Prepass */
@@ -524,16 +532,19 @@ void workbench_materials_draw_scene(WORKBENCH_Data 
*vedata)
 #else
                GPU_framebuffer_bind(dfbl->depth_only_fb);
                DRW_draw_pass(psl->shadow_pass);
-               GPU_framebuffer_bind(dfbl->default_fb);
+               GPU_framebuffer_bind(fbl->composite_fb);
                DRW_draw_pass(psl->composite_pass);
                DRW_draw_pass(psl->composite_shadow_pass);
 #endif
        }
        else {
-               GPU_framebuffer_bind(dfbl->default_fb);
+               GPU_framebuffer_bind(fbl->composite_fb);
                DRW_draw_pass(psl->composite_pass);
        }
 
+       GPU_framebuffer_bind(dfbl->color_only_fb);
+       DRW_transform_to_display(e_data.composite_buffer_tx);
+
        BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN);
        DRW_UBO_FREE_SAFE(wpd->world_ubo);
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.h 
b/source/blender/draw/engines/workbench/workbench_private.h
index 6b8acaebc82..6f1d833a551 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -36,6 +36,7 @@
 
 typedef struct WORKBENCH_FramebufferList {
        struct GPUFrameBuffer *prepass_fb;
+       struct GPUFrameBuffer *composite_fb;
 } WORKBENCH_FramebufferList;
 
 typedef struct WORKBENCH_StorageList {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to