@@ -616,6 +616,7 @@ namespace Flux {
616616 bool guidance_embed = true ;
617617 bool flash_attn = true ;
618618 bool is_chroma = false ;
619+ SDVersion version = VERSION_FLUX ;
619620 };
620621
621622 struct Flux : public GGMLBlock {
@@ -850,14 +851,36 @@ namespace Flux {
850851 auto img = process_img (ctx, x);
851852 uint64_t img_tokens = img->ne [1 ];
852853
853- if (c_concat != NULL ) {
854+ if (params.version == VERSION_FLUX_FILL ) {
855+ GGML_ASSERT (c_concat != NULL );
854856 ggml_tensor* masked = ggml_view_4d (ctx, c_concat, c_concat->ne [0 ], c_concat->ne [1 ], C, 1 , c_concat->nb [1 ], c_concat->nb [2 ], c_concat->nb [3 ], 0 );
855857 ggml_tensor* mask = ggml_view_4d (ctx, c_concat, c_concat->ne [0 ], c_concat->ne [1 ], 8 * 8 , 1 , c_concat->nb [1 ], c_concat->nb [2 ], c_concat->nb [3 ], c_concat->nb [2 ] * C);
856858
857859 masked = process_img (ctx, masked);
858860 mask = process_img (ctx, mask);
859861
860862 img = ggml_concat (ctx, img, ggml_concat (ctx, masked, mask, 0 ), 0 );
863+ } else if (params.version == VERSION_FLEX_2 ) {
864+ GGML_ASSERT (c_concat != NULL );
865+ ggml_tensor* masked = ggml_view_4d (ctx, c_concat, c_concat->ne [0 ], c_concat->ne [1 ], C, 1 , c_concat->nb [1 ], c_concat->nb [2 ], c_concat->nb [3 ], 0 );
866+ ggml_tensor* mask = ggml_view_4d (ctx, c_concat, c_concat->ne [0 ], c_concat->ne [1 ], 1 , 1 , c_concat->nb [1 ], c_concat->nb [2 ], c_concat->nb [3 ], c_concat->nb [2 ] * C);
867+ ggml_tensor* control = ggml_view_4d (ctx, c_concat, c_concat->ne [0 ], c_concat->ne [1 ], C, 1 , c_concat->nb [1 ], c_concat->nb [2 ], c_concat->nb [3 ], c_concat->nb [2 ] * (C + 1 ));
868+
869+ masked = ggml_pad (ctx, masked, pad_w, pad_h, 0 , 0 );
870+ mask = ggml_pad (ctx, mask, pad_w, pad_h, 0 , 0 );
871+ control = ggml_pad (ctx, control, pad_w, pad_h, 0 , 0 );
872+
873+ masked = patchify (ctx, masked, patch_size);
874+ mask = patchify (ctx, mask, patch_size);
875+ control = patchify (ctx, control, patch_size);
876+
877+ img = ggml_concat (ctx, img, ggml_concat (ctx, ggml_concat (ctx, masked, mask, 0 ), control, 0 ), 0 );
878+ } else if (params.version == VERSION_FLUX_CONTROLS ) {
879+ GGML_ASSERT (c_concat != NULL );
880+
881+ ggml_tensor* control = ggml_pad (ctx, c_concat, pad_w, pad_h, 0 , 0 );
882+ control = patchify (ctx, control, patch_size);
883+ img = ggml_concat (ctx, img, control, 0 );
861884 }
862885
863886 if (ref_latents.size () > 0 ) {
@@ -868,6 +891,7 @@ namespace Flux {
868891 }
869892
870893 auto out = forward_orig (ctx, backend, img, context, timestep, y, guidance, pe, mod_index_arange, skip_layers); // [N, num_tokens, C * patch_size * patch_size]
894+
871895 if (out->ne [1 ] > img_tokens) {
872896 out = ggml_cont (ctx, ggml_permute (ctx, out, 0 , 2 , 1 , 3 )); // [num_tokens, N, C * patch_size * patch_size]
873897 out = ggml_view_3d (ctx, out, out->ne [0 ], out->ne [1 ], img_tokens, out->nb [1 ], out->nb [2 ], 0 );
@@ -897,13 +921,18 @@ namespace Flux {
897921 SDVersion version = VERSION_FLUX ,
898922 bool flash_attn = false ,
899923 bool use_mask = false )
900- : GGMLRunner(backend, offload_params_to_cpu), use_mask(use_mask) {
924+ : GGMLRunner(backend, offload_params_to_cpu), version(version), use_mask(use_mask) {
925+ flux_params.version = version;
901926 flux_params.flash_attn = flash_attn;
902927 flux_params.guidance_embed = false ;
903928 flux_params.depth = 0 ;
904929 flux_params.depth_single_blocks = 0 ;
905930 if (version == VERSION_FLUX_FILL ) {
906931 flux_params.in_channels = 384 ;
932+ } else if (version == VERSION_FLUX_CONTROLS ) {
933+ flux_params.in_channels = 128 ;
934+ } else if (version == VERSION_FLEX_2 ) {
935+ flux_params.in_channels = 196 ;
907936 }
908937 for (auto pair : tensor_types) {
909938 std::string tensor_name = pair.first ;
0 commit comments