3333#include " runtime/helpers/aligned_memory.h"
3434#include " runtime/helpers/array_count.h"
3535#include " runtime/helpers/get_info.h"
36+ #include " runtime/helpers/mipmap.h"
3637#include " runtime/helpers/options.h"
3738#include " runtime/helpers/ptr_math.h"
3839#include " runtime/mem_obj/buffer.h"
@@ -463,8 +464,12 @@ cl_int CommandQueue::enqueueWriteMemObjForUnmap(MemObj *memObj, void *mappedPtr,
463464 retVal = enqueueWriteBuffer (buffer, CL_TRUE, unmapInfo.offset [0 ], unmapInfo.size [0 ], mappedPtr,
464465 eventsRequest.numEventsInWaitList , eventsRequest.eventWaitList , eventsRequest.outEvent );
465466 } else {
466- auto image = castToObject<Image>(memObj);
467- retVal = enqueueWriteImage (image, CL_FALSE, &unmapInfo.offset [0 ], &unmapInfo.size [0 ],
467+ auto image = castToObjectOrAbort<Image>(memObj);
468+ size_t writeOrigin[4 ] = {unmapInfo.offset [0 ], unmapInfo.offset [1 ], unmapInfo.offset [2 ], 0 };
469+ auto mipIdx = getMipLevelOriginIdx (image->peekClMemObjType ());
470+ UNRECOVERABLE_IF (mipIdx >= 4 );
471+ writeOrigin[mipIdx] = unmapInfo.mipLevel ;
472+ retVal = enqueueWriteImage (image, CL_FALSE, writeOrigin, &unmapInfo.size [0 ],
468473 image->getHostPtrRowPitch (), image->getHostPtrSlicePitch (), mappedPtr,
469474 eventsRequest.numEventsInWaitList , eventsRequest.eventWaitList , eventsRequest.outEvent );
470475 bool mustCallFinish = true ;
@@ -493,10 +498,10 @@ cl_int CommandQueue::enqueueWriteMemObjForUnmap(MemObj *memObj, void *mappedPtr,
493498
494499void *CommandQueue::enqueueReadMemObjForMap (TransferProperties &transferProperties, EventsRequest &eventsRequest, cl_int &errcodeRet) {
495500 void *returnPtr = ptrOffset (transferProperties.memObj ->getBasePtrForMap (),
496- transferProperties.memObj ->calculateOffsetForMapping (transferProperties.offset ));
501+ transferProperties.memObj ->calculateOffsetForMapping (transferProperties.offset ) + transferProperties. mipPtrOffset );
497502
498503 if (!transferProperties.memObj ->addMappedPtr (returnPtr, transferProperties.memObj ->calculateMappedPtrLength (transferProperties.size ),
499- transferProperties.mapFlags , transferProperties.size , transferProperties.offset )) {
504+ transferProperties.mapFlags , transferProperties.size , transferProperties.offset , transferProperties. mipLevel )) {
500505 errcodeRet = CL_INVALID_OPERATION;
501506 return nullptr ;
502507 }
@@ -506,8 +511,12 @@ void *CommandQueue::enqueueReadMemObjForMap(TransferProperties &transferProperti
506511 errcodeRet = enqueueReadBuffer (buffer, transferProperties.blocking , transferProperties.offset [0 ], transferProperties.size [0 ], returnPtr,
507512 eventsRequest.numEventsInWaitList , eventsRequest.eventWaitList , eventsRequest.outEvent );
508513 } else {
509- auto image = castToObject<Image>(transferProperties.memObj );
510- errcodeRet = enqueueReadImage (image, transferProperties.blocking , &transferProperties.offset [0 ], &transferProperties.size [0 ],
514+ auto image = castToObjectOrAbort<Image>(transferProperties.memObj );
515+ size_t readOrigin[4 ] = {transferProperties.offset [0 ], transferProperties.offset [1 ], transferProperties.offset [2 ], 0 };
516+ auto mipIdx = getMipLevelOriginIdx (image->peekClMemObjType ());
517+ UNRECOVERABLE_IF (mipIdx >= 4 );
518+ readOrigin[mipIdx] = transferProperties.mipLevel ;
519+ errcodeRet = enqueueReadImage (image, transferProperties.blocking , readOrigin, &transferProperties.size [0 ],
511520 image->getHostPtrRowPitch (), image->getHostPtrSlicePitch (), returnPtr, eventsRequest.numEventsInWaitList ,
512521 eventsRequest.eventWaitList , eventsRequest.outEvent );
513522 }
@@ -560,7 +569,6 @@ void *CommandQueue::enqueueMapImage(Image *image, cl_bool blockingMap,
560569 cl_uint numEventsInWaitList,
561570 const cl_event *eventWaitList, cl_event *event,
562571 cl_int &errcodeRet) {
563-
564572 TransferProperties transferProperties (image, CL_COMMAND_MAP_IMAGE, mapFlags, blockingMap != CL_FALSE,
565573 const_cast <size_t *>(origin), const_cast <size_t *>(region), nullptr );
566574 EventsRequest eventsRequest (numEventsInWaitList, eventWaitList, event);
@@ -572,7 +580,9 @@ void *CommandQueue::enqueueMapImage(Image *image, cl_bool blockingMap,
572580 GetInfoHelper::set (imageSlicePitch, image->getHostPtrSlicePitch ());
573581 GetInfoHelper::set (imageRowPitch, image->getHostPtrRowPitch ());
574582 }
575-
583+ if (Image::hasSlices (image->peekClMemObjType ()) == false ) {
584+ GetInfoHelper::set (imageSlicePitch, static_cast <size_t >(0 ));
585+ }
576586 return enqueueMapMemObject (transferProperties, eventsRequest, errcodeRet);
577587}
578588
0 commit comments