1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef skgpu_MtlBlitCommandEncoder_DEFINED 9cb93a386Sopenharmony_ci#define skgpu_MtlBlitCommandEncoder_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 13cb93a386Sopenharmony_ci#include "include/ports/SkCFObject.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#import <Metal/Metal.h> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cinamespace skgpu::mtl { 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci/** 20cb93a386Sopenharmony_ci * Wraps a MTLBlitCommandEncoder object 21cb93a386Sopenharmony_ci */ 22cb93a386Sopenharmony_ciclass BlitCommandEncoder : public SkRefCnt { 23cb93a386Sopenharmony_cipublic: 24cb93a386Sopenharmony_ci static sk_sp<BlitCommandEncoder> Make(id<MTLCommandBuffer> commandBuffer) { 25cb93a386Sopenharmony_ci // Adding a retain here to keep our own ref separate from the autorelease pool 26cb93a386Sopenharmony_ci sk_cfp<id<MTLBlitCommandEncoder>> encoder = 27cb93a386Sopenharmony_ci sk_ret_cfp<id<MTLBlitCommandEncoder>>([commandBuffer blitCommandEncoder]); 28cb93a386Sopenharmony_ci return sk_sp<BlitCommandEncoder>(new BlitCommandEncoder(std::move(encoder))); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci void pushDebugGroup(NSString* string) { 32cb93a386Sopenharmony_ci [(*fCommandEncoder) pushDebugGroup:string]; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci void popDebugGroup() { 35cb93a386Sopenharmony_ci [(*fCommandEncoder) popDebugGroup]; 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC 38cb93a386Sopenharmony_ci void synchronizeResource(id<MTLBuffer> buffer) { 39cb93a386Sopenharmony_ci [(*fCommandEncoder) synchronizeResource: buffer]; 40cb93a386Sopenharmony_ci } 41cb93a386Sopenharmony_ci#endif 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci void copyFromTexture(id<MTLTexture> texture, 44cb93a386Sopenharmony_ci SkIRect srcRect, 45cb93a386Sopenharmony_ci id<MTLBuffer> buffer, 46cb93a386Sopenharmony_ci size_t bufferOffset, 47cb93a386Sopenharmony_ci size_t bufferRowBytes) { 48cb93a386Sopenharmony_ci [(*fCommandEncoder) copyFromTexture: texture 49cb93a386Sopenharmony_ci sourceSlice: 0 50cb93a386Sopenharmony_ci sourceLevel: 0 51cb93a386Sopenharmony_ci sourceOrigin: MTLOriginMake(srcRect.left(), srcRect.top(), 0) 52cb93a386Sopenharmony_ci sourceSize: MTLSizeMake(srcRect.width(), srcRect.height(), 1) 53cb93a386Sopenharmony_ci toBuffer: buffer 54cb93a386Sopenharmony_ci destinationOffset: bufferOffset 55cb93a386Sopenharmony_ci destinationBytesPerRow: bufferRowBytes 56cb93a386Sopenharmony_ci destinationBytesPerImage: bufferRowBytes * srcRect.height()]; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci void endEncoding() { 60cb93a386Sopenharmony_ci [(*fCommandEncoder) endEncoding]; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ciprivate: 64cb93a386Sopenharmony_ci BlitCommandEncoder(sk_cfp<id<MTLBlitCommandEncoder>> encoder) 65cb93a386Sopenharmony_ci : fCommandEncoder(std::move(encoder)) {} 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci sk_cfp<id<MTLBlitCommandEncoder>> fCommandEncoder; 68cb93a386Sopenharmony_ci}; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci} // namespace skgpu::mtl 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci#endif // skgpu_MtlBlitCommandEncoder_DEFINED 73