@@ -230,13 +230,13 @@ void InternalFlutterGpu_RenderPass_BindPipeline(
230230
231231template <typename TBuffer>
232232static void BindVertexBuffer (flutter::gpu::RenderPass* wrapper,
233- TBuffer* buffer,
233+ TBuffer buffer,
234234 int offset_in_bytes,
235235 int length_in_bytes,
236236 int vertex_count) {
237237 auto & vertex_buffer = wrapper->GetVertexBuffer ();
238238 vertex_buffer.vertex_buffer = impeller::BufferView{
239- .buffer = buffer-> GetBuffer () ,
239+ .buffer = buffer,
240240 .range = impeller::Range (offset_in_bytes, length_in_bytes),
241241 };
242242 // If the index type is set, then the `vertex_count` becomes the index
@@ -258,8 +258,8 @@ void InternalFlutterGpu_RenderPass_BindVertexBufferDevice(
258258 int offset_in_bytes,
259259 int length_in_bytes,
260260 int vertex_count) {
261- BindVertexBuffer (wrapper, device_buffer, offset_in_bytes, length_in_bytes ,
262- vertex_count);
261+ BindVertexBuffer (wrapper, device_buffer-> GetBuffer () , offset_in_bytes,
262+ length_in_bytes, vertex_count);
263263}
264264
265265void InternalFlutterGpu_RenderPass_BindVertexBufferHost (
@@ -268,20 +268,28 @@ void InternalFlutterGpu_RenderPass_BindVertexBufferHost(
268268 int offset_in_bytes,
269269 int length_in_bytes,
270270 int vertex_count) {
271- BindVertexBuffer (wrapper, host_buffer, offset_in_bytes, length_in_bytes,
272- vertex_count);
271+ std::optional<impeller::BufferView> view =
272+ host_buffer->GetBufferViewForOffset (offset_in_bytes);
273+ if (!view.has_value ()) {
274+ FML_LOG (ERROR)
275+ << " Failed to bind vertex buffer due to invalid HostBuffer offset: "
276+ << offset_in_bytes;
277+ return ;
278+ }
279+ BindVertexBuffer (wrapper, view->buffer , view->range .offset ,
280+ view->range .length , vertex_count);
273281}
274282
275283template <typename TBuffer>
276284static void BindIndexBuffer (flutter::gpu::RenderPass* wrapper,
277- TBuffer* buffer,
285+ TBuffer buffer,
278286 int offset_in_bytes,
279287 int length_in_bytes,
280288 int index_type,
281289 int index_count) {
282290 auto & vertex_buffer = wrapper->GetVertexBuffer ();
283291 vertex_buffer.index_buffer = impeller::BufferView{
284- .buffer = buffer-> GetBuffer () ,
292+ .buffer = buffer,
285293 .range = impeller::Range (offset_in_bytes, length_in_bytes),
286294 };
287295 vertex_buffer.index_type = flutter::gpu::ToImpellerIndexType (index_type);
@@ -295,8 +303,8 @@ void InternalFlutterGpu_RenderPass_BindIndexBufferDevice(
295303 int length_in_bytes,
296304 int index_type,
297305 int index_count) {
298- BindIndexBuffer (wrapper, device_buffer, offset_in_bytes, length_in_bytes ,
299- index_type, index_count);
306+ BindIndexBuffer (wrapper, device_buffer-> GetBuffer () , offset_in_bytes,
307+ length_in_bytes, index_type, index_count);
300308}
301309
302310void InternalFlutterGpu_RenderPass_BindIndexBufferHost (
@@ -306,15 +314,22 @@ void InternalFlutterGpu_RenderPass_BindIndexBufferHost(
306314 int length_in_bytes,
307315 int index_type,
308316 int index_count) {
309- BindIndexBuffer (wrapper, host_buffer, offset_in_bytes, length_in_bytes,
317+ auto view = host_buffer->GetBufferViewForOffset (offset_in_bytes);
318+ if (!view.has_value ()) {
319+ FML_LOG (ERROR)
320+ << " Failed to bind index buffer due to invalid HostBuffer offset: "
321+ << offset_in_bytes;
322+ return ;
323+ }
324+ BindIndexBuffer (wrapper, view->buffer , view->range .offset , view->range .length ,
310325 index_type, index_count);
311326}
312327
313328template <typename TBuffer>
314329static bool BindUniform (flutter::gpu::RenderPass* wrapper,
315330 flutter::gpu::Shader* shader,
316331 Dart_Handle uniform_name_handle,
317- TBuffer* buffer,
332+ TBuffer buffer,
318333 int offset_in_bytes,
319334 int length_in_bytes) {
320335 auto & command = wrapper->GetCommand ();
@@ -331,7 +346,7 @@ static bool BindUniform(flutter::gpu::RenderPass* wrapper,
331346 return command.BindResource (
332347 shader->GetShaderStage (), uniform_struct->slot , uniform_struct->metadata ,
333348 impeller::BufferView{
334- .buffer = buffer-> GetBuffer () ,
349+ .buffer = buffer,
335350 .range = impeller::Range (offset_in_bytes, length_in_bytes),
336351 });
337352}
@@ -343,8 +358,9 @@ bool InternalFlutterGpu_RenderPass_BindUniformDevice(
343358 flutter::gpu::DeviceBuffer* device_buffer,
344359 int offset_in_bytes,
345360 int length_in_bytes) {
346- return BindUniform (wrapper, shader, uniform_name_handle, device_buffer,
347- offset_in_bytes, length_in_bytes);
361+ return BindUniform (wrapper, shader, uniform_name_handle,
362+ device_buffer->GetBuffer (), offset_in_bytes,
363+ length_in_bytes);
348364}
349365
350366bool InternalFlutterGpu_RenderPass_BindUniformHost (
@@ -354,8 +370,15 @@ bool InternalFlutterGpu_RenderPass_BindUniformHost(
354370 flutter::gpu::HostBuffer* host_buffer,
355371 int offset_in_bytes,
356372 int length_in_bytes) {
357- return BindUniform (wrapper, shader, uniform_name_handle, host_buffer,
358- offset_in_bytes, length_in_bytes);
373+ auto view = host_buffer->GetBufferViewForOffset (offset_in_bytes);
374+ if (!view.has_value ()) {
375+ FML_LOG (ERROR)
376+ << " Failed to bind index buffer due to invalid HostBuffer offset: "
377+ << offset_in_bytes;
378+ return false ;
379+ }
380+ return BindUniform (wrapper, shader, uniform_name_handle, view->buffer ,
381+ view->range .offset , view->range .length );
359382}
360383
361384bool InternalFlutterGpu_RenderPass_BindTexture (
0 commit comments