@@ -947,10 +947,7 @@ WAVSource::WAVSource(obs_source_t *source)
947947
948948 obs_enter_graphics ();
949949
950- // create shader
951- auto filename = obs_module_file (" gradient.effect" );
952- m_shader = gs_effect_create_from_file (filename, nullptr );
953- bfree (filename);
950+ create_shader ();
954951
955952 obs_leave_graphics ();
956953}
@@ -960,8 +957,8 @@ WAVSource::~WAVSource()
960957 std::lock_guard lock (m_mtx);
961958 obs_enter_graphics ();
962959
963- gs_vertexbuffer_destroy (m_vbuf );
964- gs_effect_destroy (m_shader );
960+ free_vbuf ( );
961+ free_shader ( );
965962
966963 obs_leave_graphics ();
967964
@@ -1018,38 +1015,78 @@ void WAVSource::create_vbuf() {
10181015 num_verts += m_cap_tris * ((m_channel_spacing > 0 ) ? 12 : 6 ) * m_num_bars; // 2 caps per bar (middle omitted when 0 spacing)
10191016 }
10201017
1021- obs_enter_graphics ();
1018+ constexpr auto signbit = (size_t )1 << ((sizeof (num_verts) * 8 ) - 1 );
1019+ assert (num_verts > 0 );
1020+ assert ((num_verts & signbit) == 0 ); // if MSB is set something has gone very wrong
1021+ assert ((num_verts * sizeof (vec3)) < (1u << 30 )); // abnormally large allocation
10221022
1023- gs_vertexbuffer_destroy (m_vbuf );
1023+ obs_enter_graphics ( );
10241024
1025- auto vbdata = gs_vbdata_create ();
1026- vbdata->num = num_verts;
1027- vbdata->points = (vec3*)bmalloc (num_verts * sizeof (vec3));
1028- vbdata->num_tex = 1 ;
1029- vbdata->tvarray = (gs_tvertarray*)bzalloc (sizeof (gs_tvertarray));
1030- vbdata->tvarray ->width = 2 ;
1031- vbdata->tvarray ->array = bmalloc (2 * num_verts * sizeof (float ));
1032- m_vbuf = gs_vertexbuffer_create (vbdata, GS_DYNAMIC);
1025+ free_vbuf ();
10331026
1034- if (curve) {
1035- if (m_render_mode == RenderMode::LINE)
1036- {
1037- for (auto i = 0u ; i < m_width; ++i)
1038- vec3_set (&vbdata->points [i], (float )i, 0 , 0 );
1039- }
1040- else
1041- {
1042- for (auto i = 0u ; i < m_width; ++i)
1027+ // FIXME: temporary workaround
1028+ if ((num_verts > 0 ) && ((num_verts * sizeof (vec3)) < (1u << 30 )))
1029+ {
1030+ auto vbdata = gs_vbdata_create ();
1031+ vbdata->num = num_verts;
1032+ vbdata->points = (vec3*)bmalloc (num_verts * sizeof (vec3));
1033+ vbdata->num_tex = 1 ;
1034+ vbdata->tvarray = (gs_tvertarray*)bzalloc (sizeof (gs_tvertarray));
1035+ vbdata->tvarray ->width = 2 ;
1036+ vbdata->tvarray ->array = bmalloc (2 * num_verts * sizeof (float ));
1037+ m_vbuf = gs_vertexbuffer_create (vbdata, GS_DYNAMIC);
1038+
1039+ if (curve) {
1040+ if (m_render_mode == RenderMode::LINE)
1041+ {
1042+ for (auto i = 0u ; i < m_width; ++i)
1043+ vec3_set (&vbdata->points [i], (float )i, 0 , 0 );
1044+ }
1045+ else
10431046 {
1044- vec3_set (&vbdata->points [i * 2 ], (float )i, 0 , 0 );
1045- vec3_set (&vbdata->points [(i * 2 ) + 1 ], (float )i, 0 , 0 );
1047+ for (auto i = 0u ; i < m_width; ++i)
1048+ {
1049+ vec3_set (&vbdata->points [i * 2 ], (float )i, 0 , 0 );
1050+ vec3_set (&vbdata->points [(i * 2 ) + 1 ], (float )i, 0 , 0 );
1051+ }
10461052 }
10471053 }
10481054 }
1055+ else
1056+ {
1057+ LogError << " Tried to allocate vbuf of size: " << (num_verts * sizeof (vec3));
1058+ }
10491059
10501060 obs_leave_graphics ();
10511061}
10521062
1063+ void WAVSource::free_vbuf ()
1064+ {
1065+ if (m_vbuf != nullptr )
1066+ {
1067+ gs_vertexbuffer_destroy (m_vbuf);
1068+ m_vbuf = nullptr ;
1069+ }
1070+ }
1071+
1072+ void WAVSource::create_shader ()
1073+ {
1074+ free_shader ();
1075+
1076+ auto filename = obs_module_file (" gradient.effect" );
1077+ m_shader = gs_effect_create_from_file (filename, nullptr );
1078+ bfree (filename);
1079+ }
1080+
1081+ void WAVSource::free_shader ()
1082+ {
1083+ if (m_shader != nullptr )
1084+ {
1085+ gs_effect_destroy (m_shader);
1086+ m_shader = nullptr ;
1087+ }
1088+ }
1089+
10531090void WAVSource::update (obs_data_t *settings)
10541091{
10551092 std::lock_guard lock (m_mtx);
@@ -1324,6 +1361,8 @@ void WAVSource::render([[maybe_unused]] gs_effect_t *effect)
13241361 std::lock_guard lock (m_mtx);
13251362 if (m_last_silent && m_hide_on_silent)
13261363 return ;
1364+ if (m_vbuf == nullptr )
1365+ return ;
13271366
13281367 if ((m_display_mode == DisplayMode::CURVE) || (m_display_mode == DisplayMode::WAVEFORM))
13291368 render_curve (effect);
0 commit comments