xref: /aosp_15_r20/external/skia/src/gpu/graphite/mtl/MtlBlitCommandEncoder.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2021 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef skgpu_graphite_MtlBlitCommandEncoder_DEFINED
9 #define skgpu_graphite_MtlBlitCommandEncoder_DEFINED
10 
11 #include "include/core/SkRect.h"
12 #include "include/core/SkRefCnt.h"
13 #include "include/ports/SkCFObject.h"
14 #include "src/gpu/graphite/Resource.h"
15 
16 #import <Metal/Metal.h>
17 
18 namespace skgpu::graphite {
19 
20 /**
21  * Wraps a MTLMtlBlitCommandEncoder object
22  */
23 class MtlBlitCommandEncoder : public Resource {
24 public:
Make(const SharedContext * sharedContext,id<MTLCommandBuffer> commandBuffer)25     static sk_sp<MtlBlitCommandEncoder> Make(const SharedContext* sharedContext,
26                                              id<MTLCommandBuffer> commandBuffer) {
27         @autoreleasepool {
28             // Adding a retain here to keep our own ref separate from the autorelease pool
29             sk_cfp<id<MTLBlitCommandEncoder>> encoder =
30                     sk_ret_cfp<id<MTLBlitCommandEncoder>>([commandBuffer blitCommandEncoder]);
31             return sk_sp<MtlBlitCommandEncoder>(new MtlBlitCommandEncoder(sharedContext,
32                                                                           std::move(encoder)));
33         }
34     }
35 
getResourceType()36     const char* getResourceType() const override { return "Metal Blit Command Encoder"; }
37 
pushDebugGroup(NSString * string)38     void pushDebugGroup(NSString* string) {
39         [(*fCommandEncoder) pushDebugGroup:string];
40     }
popDebugGroup()41     void popDebugGroup() {
42         [(*fCommandEncoder) popDebugGroup];
43     }
44 #ifdef SK_BUILD_FOR_MAC
synchronizeResource(id<MTLBuffer> buffer)45     void synchronizeResource(id<MTLBuffer> buffer) {
46         [(*fCommandEncoder) synchronizeResource: buffer];
47     }
48 #endif
49 
fillBuffer(id<MTLBuffer> buffer,size_t bufferOffset,size_t bytes,uint8_t value)50     void fillBuffer(id<MTLBuffer> buffer, size_t bufferOffset, size_t bytes, uint8_t value) {
51         [(*fCommandEncoder) fillBuffer:buffer
52                                  range:NSMakeRange(bufferOffset, bytes)
53                                  value:value];
54     }
55 
copyFromTexture(id<MTLTexture> texture,SkIRect srcRect,id<MTLBuffer> buffer,size_t bufferOffset,size_t bufferRowBytes)56     void copyFromTexture(id<MTLTexture> texture,
57                          SkIRect srcRect,
58                          id<MTLBuffer> buffer,
59                          size_t bufferOffset,
60                          size_t bufferRowBytes) {
61         [(*fCommandEncoder) copyFromTexture: texture
62                                 sourceSlice: 0
63                                 sourceLevel: 0
64                                sourceOrigin: MTLOriginMake(srcRect.left(), srcRect.top(), 0)
65                                  sourceSize: MTLSizeMake(srcRect.width(), srcRect.height(), 1)
66                                    toBuffer: buffer
67                           destinationOffset: bufferOffset
68                      destinationBytesPerRow: bufferRowBytes
69                    destinationBytesPerImage: bufferRowBytes * srcRect.height()];
70     }
71 
copyFromBuffer(id<MTLBuffer> buffer,size_t bufferOffset,size_t bufferRowBytes,id<MTLTexture> texture,SkIRect dstRect,unsigned int dstLevel)72     void copyFromBuffer(id<MTLBuffer> buffer,
73                         size_t bufferOffset,
74                         size_t bufferRowBytes,
75                         id<MTLTexture> texture,
76                         SkIRect dstRect,
77                         unsigned int dstLevel) {
78         [(*fCommandEncoder) copyFromBuffer: buffer
79                               sourceOffset: bufferOffset
80                          sourceBytesPerRow: bufferRowBytes
81                        sourceBytesPerImage: bufferRowBytes * dstRect.height()
82                                 sourceSize: MTLSizeMake(dstRect.width(), dstRect.height(), 1)
83                                  toTexture: texture
84                           destinationSlice: 0
85                           destinationLevel: dstLevel
86                          destinationOrigin: MTLOriginMake(dstRect.left(), dstRect.top(), 0)];
87     }
88 
copyTextureToTexture(id<MTLTexture> srcTexture,SkIRect srcRect,id<MTLTexture> dstTexture,SkIPoint dstPoint,int mipLevel)89     void copyTextureToTexture(id<MTLTexture> srcTexture,
90                               SkIRect srcRect,
91                               id<MTLTexture> dstTexture,
92                               SkIPoint dstPoint,
93                               int mipLevel) {
94         [(*fCommandEncoder) copyFromTexture: srcTexture
95                                 sourceSlice: 0
96                                 sourceLevel: 0
97                                sourceOrigin: MTLOriginMake(srcRect.x(), srcRect.y(), 0)
98                                  sourceSize: MTLSizeMake(srcRect.width(), srcRect.height(), 1)
99                                   toTexture: dstTexture
100                            destinationSlice: 0
101                            destinationLevel: mipLevel
102                           destinationOrigin: MTLOriginMake(dstPoint.fX, dstPoint.fY, 0)];
103     }
104 
copyBufferToBuffer(id<MTLBuffer> srcBuffer,size_t srcOffset,id<MTLBuffer> dstBuffer,size_t dstOffset,size_t size)105     void copyBufferToBuffer(id<MTLBuffer> srcBuffer,
106                             size_t srcOffset,
107                             id<MTLBuffer> dstBuffer,
108                             size_t dstOffset,
109                             size_t size) {
110         [(*fCommandEncoder) copyFromBuffer: srcBuffer
111                               sourceOffset: srcOffset
112                                   toBuffer: dstBuffer
113                          destinationOffset: dstOffset
114                                       size: size];
115     }
116 
endEncoding()117     void endEncoding() {
118         [(*fCommandEncoder) endEncoding];
119     }
120 
121 private:
MtlBlitCommandEncoder(const SharedContext * sharedContext,sk_cfp<id<MTLBlitCommandEncoder>> encoder)122     MtlBlitCommandEncoder(const SharedContext* sharedContext,
123                           sk_cfp<id<MTLBlitCommandEncoder>> encoder)
124             : Resource(sharedContext,
125                        Ownership::kOwned,
126                        skgpu::Budgeted::kYes,
127                        /*gpuMemorySize=*/0)
128             , fCommandEncoder(std::move(encoder)) {}
129 
freeGpuData()130     void freeGpuData() override {
131         fCommandEncoder.reset();
132     }
133 
134     sk_cfp<id<MTLBlitCommandEncoder>> fCommandEncoder;
135 };
136 
137 } // namespace skgpu::graphite
138 
139 #endif // skgpu_graphite_MtlBlitCommandEncoder_DEFINED
140