@@ -252,15 +252,15 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrGpuBufferTransferTest, reporter, ctxInfo) {
252
252
253
253
auto pm = GrPixmap::Allocate (sdc->imageInfo ().makeColorType (GrColorType::kRGBA_F32 ));
254
254
255
- for (bool byteAtATime : {false , true }) {
255
+ for (bool minSizedTransfers : {false , true }) {
256
256
for (int srcBaseVertex : {0 , 5 }) {
257
257
auto src = create_cpu_to_gpu_buffer (srcBaseVertex);
258
258
if (!src) {
259
259
ERRORF (reporter, " Could not create src buffer" );
260
260
return ;
261
261
}
262
262
for (int vbBaseVertex : {0 , 2 }) {
263
- auto vb = create_vertex_buffer (src, srcBaseVertex, vbBaseVertex, byteAtATime );
263
+ auto vb = create_vertex_buffer (src, srcBaseVertex, vbBaseVertex, minSizedTransfers );
264
264
if (!vb) {
265
265
ERRORF (reporter, " Could not create vertex buffer" );
266
266
return ;
@@ -289,11 +289,69 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrGpuBufferTransferTest, reporter, ctxInfo) {
289
289
290
290
REPORTER_ASSERT (reporter, *color == kGreen , " src base vertex: %d, "
291
291
" vb base vertex: %d, "
292
- " byteAtATime : %d" ,
292
+ " minSizedTransfers : %d" ,
293
293
srcBaseVertex,
294
294
vbBaseVertex,
295
- byteAtATime );
295
+ minSizedTransfers );
296
296
}
297
297
}
298
298
}
299
299
}
300
+
301
+ DEF_GPUTEST_FOR_RENDERING_CONTEXTS (GrGpuBufferUpdateDataTest, reporter, ctxInfo) {
302
+ GrDirectContext* dc = ctxInfo.directContext ();
303
+
304
+ GrGpu* gpu = ctxInfo.directContext ()->priv ().getGpu ();
305
+
306
+ static constexpr SkPoint kUnitQuad [] {{0 , 0 }, {0 , 1 }, {1 , 0 },
307
+ {1 , 0 }, {0 , 1 }, {1 , 1 }};
308
+
309
+ auto sdc = skgpu::v1::SurfaceDrawContext::Make (dc,
310
+ GrColorType::kRGBA_8888 ,
311
+ nullptr ,
312
+ SkBackingFit::kExact ,
313
+ {1 , 1 },
314
+ SkSurfaceProps{},
315
+ std::string_view{});
316
+ if (!sdc) {
317
+ ERRORF (reporter, " Could not create draw context" );
318
+ return ;
319
+ }
320
+
321
+ for (bool oversizedBuffer : {false , true }) {
322
+ auto pm = GrPixmap::Allocate (sdc->imageInfo ().makeColorType (GrColorType::kRGBA_F32 ));
323
+
324
+ // Go direct to GrGpu to avoid caching/size adjustments at GrResourceProvider level.
325
+ auto vb = gpu->createBuffer (sizeof (kUnitQuad ) + (oversizedBuffer ? 7 : 0 ),
326
+ GrGpuBufferType::kVertex ,
327
+ kDynamic_GrAccessPattern );
328
+ if (!vb) {
329
+ ERRORF (reporter, " Could not create vertex buffer" );
330
+ return ;
331
+ }
332
+
333
+ if (!vb->updateData (kUnitQuad , sizeof (kUnitQuad ))) {
334
+ ERRORF (reporter, " GrGpuBuffer::updateData returned false." );
335
+ return ;
336
+ }
337
+
338
+ static constexpr SkColor4f kRed {1 , 0 , 0 , 1 };
339
+
340
+ static constexpr SkRect kBounds {0 , 0 , 1 , 1 };
341
+
342
+ sdc->clear (kRed );
343
+
344
+ sdc->addDrawOp (nullptr , TestVertexOp::Make (dc, vb, 0 , std::size (kUnitQuad ), kBounds ));
345
+
346
+ auto color = static_cast <SkPMColor4f*>(pm.addr ());
347
+ *color = kRed .premul ();
348
+ if (!sdc->readPixels (dc, pm, {0 , 0 })) {
349
+ ERRORF (reporter, " Read back failed." );
350
+ return ;
351
+ }
352
+
353
+ static constexpr SkPMColor4f kGreen {0 , 1 , 0 , 1 };
354
+
355
+ REPORTER_ASSERT (reporter, *color == kGreen );
356
+ }
357
+ }
0 commit comments