@@ -259,9 +259,9 @@ vk::BufferHelper &CLBufferVk::getBuffer()
259259 return mBuffer ;
260260}
261261
262- angle::Result CLBufferVk::syncHost (CLBufferVk::SyncHostDirection direction,
263- size_t offset,
264- size_t size )
262+ // For UHP buffers, the buffer contents and hostptr have to be in sync at appropriate times. Ensure
263+ // that if zero copy is not supported.
264+ angle::Result CLBufferVk::syncHost (CLBufferVk::SyncHostDirection direction )
265265{
266266 switch (direction)
267267 {
@@ -276,7 +276,7 @@ angle::Result CLBufferVk::syncHost(CLBufferVk::SyncHostDirection direction,
276276 case CLBufferVk::SyncHostDirection::ToHost:
277277 if (getFlags ().intersects (CL_MEM_USE_HOST_PTR) && !supportsZeroCopy ())
278278 {
279- ANGLE_TRY (copyTo (getHostPtr (), offset, size ));
279+ ANGLE_TRY (copyTo (getHostPtr (), 0 , getSize () ));
280280 }
281281 break ;
282282 default :
@@ -286,22 +286,22 @@ angle::Result CLBufferVk::syncHost(CLBufferVk::SyncHostDirection direction,
286286 return angle::Result::Continue;
287287}
288288
289- angle::Result CLBufferVk::syncHost (CLBufferVk::SyncHostDirection direction,
290- cl::BufferRect bufferRect,
291- cl::BufferRect hostRect)
289+ // This is to sync only a rectangular region between hostptr and buffer contents. Intended to be
290+ // used for READ/WRITE_RECT.
291+ angle::Result CLBufferVk::syncHost (CLBufferVk::SyncHostDirection direction, cl::BufferRect hostRect)
292292{
293293 switch (direction)
294294 {
295295 case CLBufferVk::SyncHostDirection::FromHost:
296296 if (getFlags ().intersects (CL_MEM_USE_HOST_PTR) && !supportsZeroCopy ())
297297 {
298- ANGLE_TRY (setRect (getHostPtr (), bufferRect , hostRect));
298+ ANGLE_TRY (setRect (getHostPtr (), hostRect , hostRect));
299299 }
300300 break ;
301301 case CLBufferVk::SyncHostDirection::ToHost:
302302 if (getFlags ().intersects (CL_MEM_USE_HOST_PTR) && !supportsZeroCopy ())
303303 {
304- ANGLE_TRY (getRect (bufferRect , hostRect, getHostPtr ()));
304+ ANGLE_TRY (getRect (hostRect , hostRect, getHostPtr ()));
305305 }
306306 break ;
307307 default :
@@ -342,7 +342,7 @@ angle::Result CLBufferVk::create(void *hostPtr)
342342 ANGLE_CL_IMPL_TRY_ERROR (setDataImpl (static_cast <uint8_t *>(hostPtr), getSize (), 0 ),
343343 CL_OUT_OF_RESOURCES);
344344 }
345- ANGLE_TRY (syncHost (CLBufferVk::SyncHostDirection::FromHost, 0 , getSize () ));
345+ ANGLE_TRY (syncHost (CLBufferVk::SyncHostDirection::FromHost));
346346 }
347347 return angle::Result::Continue;
348348}
@@ -455,56 +455,64 @@ void CLBufferVk::unmapBufferHelper()
455455 mMappedMemory = nullptr ;
456456}
457457
458- angle::Result CLBufferVk::setRect (const void *data,
459- const cl::BufferRect &srcRect,
460- const cl::BufferRect &rect)
458+ angle::Result CLBufferVk::updateRect (UpdateRectOperation op,
459+ void *data,
460+ const cl::BufferRect &dataRect,
461+ const cl::BufferRect &bufferRect)
461462{
462- ASSERT (srcRect .valid () && rect .valid ());
463- ASSERT (srcRect .mSize == rect .mSize );
463+ ASSERT (dataRect .valid () && bufferRect .valid ());
464+ ASSERT (dataRect .mSize == bufferRect .mSize && dataRect. mElementSize == bufferRect. mElementSize );
464465
465- uint8_t *mapPtr = nullptr ;
466- ANGLE_TRY (mapBufferHelper (mapPtr ));
466+ uint8_t *bufferPtr = nullptr ;
467+ ANGLE_TRY (mapBufferHelper (bufferPtr ));
467468 cl::Defer deferUnmap ([this ]() { unmapBufferHelper (); });
468469
469- const uint8_t *srcData = reinterpret_cast <const uint8_t *>(data);
470- for (size_t slice = 0 ; slice < rect .mSize .depth ; slice++)
470+ uint8_t *dataUint8Ptr = reinterpret_cast <uint8_t *>(data);
471+ for (size_t slice = 0 ; slice < bufferRect .mSize .depth ; slice++)
471472 {
472- for (size_t row = 0 ; row < rect .mSize .height ; row++)
473+ for (size_t row = 0 ; row < bufferRect .mSize .height ; row++)
473474 {
474- const uint8_t *src = srcData + srcRect.getRowOffset (slice, row);
475- uint8_t *dst = mapPtr + rect.getRowOffset (slice, row);
475+ uint8_t *offsetDataPtr = dataUint8Ptr + dataRect.getRowOffset (slice, row);
476+ uint8_t *offsetBufferPtr = bufferPtr + bufferRect.getRowOffset (slice, row);
477+ size_t updateSize = dataRect.mSize .width * dataRect.mElementSize ;
476478
477- memcpy (dst, src, srcRect.mSize .width * srcRect.mElementSize );
479+ switch (op)
480+ {
481+ case UpdateRectOperation::Read:
482+ {
483+ // Read from this buffer
484+ memcpy (offsetDataPtr, offsetBufferPtr, updateSize);
485+ break ;
486+ }
487+ case UpdateRectOperation::Write:
488+ {
489+ // Write to this buffer
490+ memcpy (offsetBufferPtr, offsetDataPtr, updateSize);
491+ break ;
492+ }
493+ default :
494+ {
495+ UNREACHABLE ();
496+ break ;
497+ }
498+ }
478499 }
479500 }
480-
481501 return angle::Result::Continue;
482502}
483503
484- angle::Result CLBufferVk::getRect (const cl::BufferRect &srcRect ,
485- const cl::BufferRect &outRect ,
486- void *outData )
504+ angle::Result CLBufferVk::setRect (const void *data ,
505+ const cl::BufferRect &dataRect ,
506+ const cl::BufferRect &bufferRect )
487507{
488- ASSERT (srcRect.valid () && outRect.valid ());
489- ASSERT (srcRect.mSize == outRect.mSize );
490-
491- uint8_t *mapPtr = nullptr ;
492- ANGLE_TRY (mapBufferHelper (mapPtr));
493- cl::Defer deferUnmap ([this ]() { unmapBufferHelper (); });
494-
495- uint8_t *dstData = reinterpret_cast <uint8_t *>(outData);
496- for (size_t slice = 0 ; slice < srcRect.mSize .depth ; slice++)
497- {
498- for (size_t row = 0 ; row < srcRect.mSize .height ; row++)
499- {
500- const uint8_t *src = mapPtr + srcRect.getRowOffset (slice, row);
501- uint8_t *dst = dstData + outRect.getRowOffset (slice, row);
502-
503- memcpy (dst, src, srcRect.mSize .width * srcRect.mElementSize );
504- }
505- }
508+ return updateRect (UpdateRectOperation::Write, const_cast <void *>(data), dataRect, bufferRect);
509+ }
506510
507- return angle::Result::Continue;
511+ angle::Result CLBufferVk::getRect (const cl::BufferRect &bufferRect,
512+ const cl::BufferRect &dataRect,
513+ void *outData)
514+ {
515+ return updateRect (UpdateRectOperation::Read, outData, dataRect, bufferRect);
508516}
509517
510518// offset is for mapped pointer
0 commit comments