@@ -252,15 +252,15 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrGpuBufferTransferTest, reporter, ctxInfo) {
252252
253253 auto pm = GrPixmap::Allocate (sdc->imageInfo ().makeColorType (GrColorType::kRGBA_F32 ));
254254
255- for (bool byteAtATime : {false , true }) {
255+ for (bool minSizedTransfers : {false , true }) {
256256 for (int srcBaseVertex : {0 , 5 }) {
257257 auto src = create_cpu_to_gpu_buffer (srcBaseVertex);
258258 if (!src) {
259259 ERRORF (reporter, " Could not create src buffer" );
260260 return ;
261261 }
262262 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 );
264264 if (!vb) {
265265 ERRORF (reporter, " Could not create vertex buffer" );
266266 return ;
@@ -289,11 +289,69 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrGpuBufferTransferTest, reporter, ctxInfo) {
289289
290290 REPORTER_ASSERT (reporter, *color == kGreen , " src base vertex: %d, "
291291 " vb base vertex: %d, "
292- " byteAtATime : %d" ,
292+ " minSizedTransfers : %d" ,
293293 srcBaseVertex,
294294 vbBaseVertex,
295- byteAtATime );
295+ minSizedTransfers );
296296 }
297297 }
298298 }
299299}
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