1 /* 2 * Copyright 2017 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 GrMockGpu_DEFINED 9 #define GrMockGpu_DEFINED 10 11 #include "include/core/SkRect.h" 12 #include "include/core/SkRefCnt.h" 13 #include "include/core/SkSize.h" 14 #include "include/core/SkTextureCompressionType.h" 15 #include "include/gpu/ganesh/GrBackendSurface.h" 16 #include "include/gpu/ganesh/GrTypes.h" 17 #include "include/gpu/ganesh/mock/GrMockTypes.h" 18 #include "include/private/base/SkAssert.h" 19 #include "include/private/base/SkTArray.h" 20 #include "include/private/gpu/ganesh/GrTypesPriv.h" 21 #include "src/core/SkTHash.h" 22 #include "src/gpu/RefCntedCallback.h" 23 #include "src/gpu/ganesh/GrAttachment.h" 24 #include "src/gpu/ganesh/GrGpu.h" 25 #include "src/gpu/ganesh/GrOpsRenderPass.h" 26 #include "src/gpu/ganesh/GrSamplerState.h" 27 #include "src/gpu/ganesh/GrSemaphore.h" // IWYU pragma: keep 28 #include "src/gpu/ganesh/GrXferProcessor.h" 29 30 #include <array> 31 #include <cstddef> 32 #include <cstdint> 33 #include <memory> 34 #include <optional> 35 #include <string_view> 36 37 class GrBackendSemaphore; 38 class GrDirectContext; 39 class GrGpuBuffer; 40 class GrProgramDesc; 41 class GrProgramInfo; 42 class GrRenderTarget; 43 class GrSurface; 44 class GrSurfaceProxy; 45 class GrTexture; 46 class GrThreadSafePipelineBuilder; 47 struct GrContextOptions; 48 49 namespace skgpu { 50 enum class Budgeted : bool; 51 enum class Mipmapped : bool; 52 } 53 54 class GrMockGpu : public GrGpu { 55 public: 56 static std::unique_ptr<GrGpu> Make(const GrMockOptions*, 57 const GrContextOptions&, 58 GrDirectContext*); 59 60 ~GrMockGpu() override; 61 62 GrThreadSafePipelineBuilder* pipelineBuilder() override; 63 sk_sp<GrThreadSafePipelineBuilder> refPipelineBuilder() override; 64 makeSemaphore(bool isOwned)65 [[nodiscard]] std::unique_ptr<GrSemaphore> makeSemaphore(bool isOwned) override { 66 return nullptr; 67 } wrapBackendSemaphore(const GrBackendSemaphore &,GrSemaphoreWrapType,GrWrapOwnership)68 std::unique_ptr<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& /* semaphore */, 69 GrSemaphoreWrapType /* wraptype */, 70 GrWrapOwnership /* ownership */) override { 71 return nullptr; 72 } insertSemaphore(GrSemaphore * semaphore)73 void insertSemaphore(GrSemaphore* semaphore) override {} waitSemaphore(GrSemaphore * semaphore)74 void waitSemaphore(GrSemaphore* semaphore) override {} prepareTextureForCrossContextUsage(GrTexture *)75 std::unique_ptr<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override { 76 return nullptr; 77 } 78 79 void submit(GrOpsRenderPass* renderPass) override; 80 checkFinishedCallbacks()81 void checkFinishedCallbacks() override {} finishOutstandingGpuWork()82 void finishOutstandingGpuWork() override {} 83 84 private: 85 GrMockGpu(GrDirectContext*, const GrMockOptions&, const GrContextOptions&); 86 xferBarrier(GrRenderTarget *,GrXferBarrierType)87 void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {} 88 89 sk_sp<GrTexture> onCreateTexture(SkISize, 90 const GrBackendFormat&, 91 GrRenderable, 92 int renderTargetSampleCnt, 93 skgpu::Budgeted, 94 GrProtected, 95 int mipLevelCount, 96 uint32_t levelClearMask, 97 std::string_view label) override; 98 99 sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions, 100 const GrBackendFormat&, 101 skgpu::Budgeted, 102 skgpu::Mipmapped, 103 GrProtected, 104 const void* data, 105 size_t dataSize) override; 106 107 sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions, 108 const GrBackendFormat&, 109 skgpu::Budgeted, 110 skgpu::Mipmapped, 111 GrProtected, 112 OH_NativeBuffer* nativeBuffer, 113 size_t bufferSize) override; 114 115 sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&, 116 GrWrapOwnership, 117 GrWrapCacheable, 118 GrIOType) override; 119 sk_sp<GrTexture> onWrapCompressedBackendTexture(const GrBackendTexture&, 120 GrWrapOwnership, 121 GrWrapCacheable) override; 122 123 sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&, 124 int sampleCnt, 125 GrWrapOwnership, 126 GrWrapCacheable) override; 127 128 sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) override; 129 130 sk_sp<GrGpuBuffer> onCreateBuffer(size_t sizeInBytes, 131 GrGpuBufferType, 132 GrAccessPattern) override; 133 onReadPixels(GrSurface *,SkIRect,GrColorType surfaceColorType,GrColorType dstColorType,void *,size_t rowBytes)134 bool onReadPixels(GrSurface*, 135 SkIRect, 136 GrColorType surfaceColorType, 137 GrColorType dstColorType, 138 void*, 139 size_t rowBytes) override { 140 return true; 141 } 142 onWritePixels(GrSurface *,SkIRect,GrColorType surfaceColorType,GrColorType srcColorType,const GrMipLevel[],int mipLevelCount,bool prepForTexSampling)143 bool onWritePixels(GrSurface*, 144 SkIRect, 145 GrColorType surfaceColorType, 146 GrColorType srcColorType, 147 const GrMipLevel[], 148 int mipLevelCount, 149 bool prepForTexSampling) override { 150 return true; 151 } 152 onTransferFromBufferToBuffer(sk_sp<GrGpuBuffer> src,size_t srcOffset,sk_sp<GrGpuBuffer> dst,size_t dstOffset,size_t size)153 bool onTransferFromBufferToBuffer(sk_sp<GrGpuBuffer> src, 154 size_t srcOffset, 155 sk_sp<GrGpuBuffer> dst, 156 size_t dstOffset, 157 size_t size) override { 158 return true; 159 } 160 onTransferPixelsTo(GrTexture *,SkIRect,GrColorType surfaceColorType,GrColorType bufferColorType,sk_sp<GrGpuBuffer>,size_t offset,size_t rowBytes)161 bool onTransferPixelsTo(GrTexture*, 162 SkIRect, 163 GrColorType surfaceColorType, 164 GrColorType bufferColorType, 165 sk_sp<GrGpuBuffer>, 166 size_t offset, 167 size_t rowBytes) override { 168 return true; 169 } 170 onTransferPixelsFrom(GrSurface *,SkIRect,GrColorType surfaceColorType,GrColorType bufferColorType,sk_sp<GrGpuBuffer>,size_t offset)171 bool onTransferPixelsFrom(GrSurface*, 172 SkIRect, 173 GrColorType surfaceColorType, 174 GrColorType bufferColorType, 175 sk_sp<GrGpuBuffer>, 176 size_t offset) override { 177 return true; 178 } 179 onCopySurface(GrSurface * dst,const SkIRect & dstRect,GrSurface * src,const SkIRect & srcRect,GrSamplerState::Filter)180 bool onCopySurface(GrSurface* dst, const SkIRect& dstRect, 181 GrSurface* src, const SkIRect& srcRect, 182 GrSamplerState::Filter)override { 183 return true; 184 } 185 onRegenerateMipMapLevels(GrTexture *)186 bool onRegenerateMipMapLevels(GrTexture*) override { return true; } 187 onResolveRenderTarget(GrRenderTarget * target,const SkIRect &)188 void onResolveRenderTarget(GrRenderTarget* target, const SkIRect&) override {} 189 addFinishedCallback(skgpu::AutoCallback callback,std::optional<GrTimerQuery>)190 void addFinishedCallback(skgpu::AutoCallback callback, std::optional<GrTimerQuery>) override { 191 SkASSERT(callback); 192 } 193 194 GrOpsRenderPass* onGetOpsRenderPass( 195 GrRenderTarget*, 196 bool useMSAASurface, 197 GrAttachment*, 198 GrSurfaceOrigin, 199 const SkIRect&, 200 const GrOpsRenderPass::LoadAndStoreInfo&, 201 const GrOpsRenderPass::StencilLoadAndStoreInfo&, 202 const skia_private::TArray<GrSurfaceProxy*, true>& sampledProxies, 203 GrXferBarrierFlags renderPassXferBarriers) override; 204 onSubmitToGpu(const GrSubmitInfo &)205 bool onSubmitToGpu(const GrSubmitInfo&) override { return true; } 206 207 sk_sp<GrAttachment> makeStencilAttachment(const GrBackendFormat& /*colorFormat*/, 208 SkISize dimensions, int numStencilSamples) override; 209 getPreferredStencilFormat(const GrBackendFormat &)210 GrBackendFormat getPreferredStencilFormat(const GrBackendFormat&) override { 211 return GrBackendFormat::MakeMock(GrColorType::kUnknown, SkTextureCompressionType::kNone, 212 true); 213 } 214 makeMSAAAttachment(SkISize dimensions,const GrBackendFormat & format,int numSamples,GrProtected isProtected,GrMemoryless isMemoryless)215 sk_sp<GrAttachment> makeMSAAAttachment(SkISize dimensions, 216 const GrBackendFormat& format, 217 int numSamples, 218 GrProtected isProtected, 219 GrMemoryless isMemoryless) override { 220 return nullptr; 221 } 222 223 GrBackendTexture onCreateBackendTexture(SkISize dimensions, 224 const GrBackendFormat&, 225 GrRenderable, 226 skgpu::Mipmapped, 227 GrProtected, 228 std::string_view label) override; 229 onClearBackendTexture(const GrBackendTexture &,sk_sp<skgpu::RefCntedCallback> finishedCallback,std::array<float,4> color)230 bool onClearBackendTexture(const GrBackendTexture&, 231 sk_sp<skgpu::RefCntedCallback> finishedCallback, 232 std::array<float, 4> color) override { 233 return true; 234 } 235 236 GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions, 237 const GrBackendFormat&, 238 skgpu::Mipmapped, 239 GrProtected) override; 240 onUpdateCompressedBackendTexture(const GrBackendTexture &,sk_sp<skgpu::RefCntedCallback> finishedCallback,const void *,size_t)241 bool onUpdateCompressedBackendTexture(const GrBackendTexture&, 242 sk_sp<skgpu::RefCntedCallback> finishedCallback, 243 const void*, 244 size_t) override { 245 return true; 246 } 247 248 void deleteBackendTexture(const GrBackendTexture&) override; 249 compile(const GrProgramDesc &,const GrProgramInfo &)250 bool compile(const GrProgramDesc&, const GrProgramInfo&) override { return false; } 251 252 #if defined(GPU_TEST_UTILS) 253 bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override; 254 255 GrBackendRenderTarget createTestingOnlyBackendRenderTarget(SkISize dimensions, 256 GrColorType, 257 int sampleCnt, 258 GrProtected) override; 259 void deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) override; 260 #endif 261 262 const GrMockOptions fMockOptions; 263 264 static int NextInternalTextureID(); 265 static int NextExternalTextureID(); 266 static int NextInternalRenderTargetID(); 267 static int NextExternalRenderTargetID(); 268 269 skia_private::THashSet<int> fOutstandingTestingOnlyTextureIDs; 270 271 using INHERITED = GrGpu; 272 }; 273 274 #endif 275