- unsigned int shader_id = 0;
- if(config.do_value)
- {
- if(BC_CModels::is_yuv(top_frame->get_color_model()))
- shader_id = VFrame::make_shader(0,
- diffkey_head,
- yuv_value,
- diffkey_tail,
- 0);
- else
- shader_id = VFrame::make_shader(0,
- diffkey_head,
- rgb_value,
- diffkey_tail,
- 0);
- }
- else
- {
- shader_id = VFrame::make_shader(0,
- diffkey_head,
- colorcube,
- diffkey_tail,
- 0);
- }
-
-
-
+ const char *shader_stack[16];
+ memset(shader_stack,0, sizeof(shader_stack));
+ int current_shader = 0;
+
+ int need_rgb_to_y = 0;
+ const char *shader_frag = !config.do_value ? colorcube :
+ BC_CModels::is_yuv(top_frame->get_color_model()) ?
+ yuv_value : (need_rgb_to_y = 1, rgb_value);
+ if( need_rgb_to_y )
+ shader_stack[current_shader++] = bc_gl_rgb_to_y;
+ shader_stack[current_shader++] = diffkey_head;
+ shader_stack[current_shader++] = shader_frag;
+ shader_stack[current_shader++] = diffkey_tail;
+
+ shader_stack[current_shader] = 0;
+ unsigned int shader = VFrame::make_shader(shader_stack);