1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 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#include "tools/gpu/ProxyUtils.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 11cb93a386Sopenharmony_ci#include "include/gpu/GrBackendSurface.h" 12cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h" 13cb93a386Sopenharmony_ci#include "include/private/GrImageContext.h" 14cb93a386Sopenharmony_ci#include "src/gpu/GrDirectContextPriv.h" 15cb93a386Sopenharmony_ci#include "src/gpu/GrDrawingManager.h" 16cb93a386Sopenharmony_ci#include "src/gpu/GrGpu.h" 17cb93a386Sopenharmony_ci#include "src/gpu/GrImageContextPriv.h" 18cb93a386Sopenharmony_ci#include "src/gpu/GrPixmap.h" 19cb93a386Sopenharmony_ci#include "src/gpu/GrProgramInfo.h" 20cb93a386Sopenharmony_ci#include "src/gpu/GrProxyProvider.h" 21cb93a386Sopenharmony_ci#include "src/gpu/SkGr.h" 22cb93a386Sopenharmony_ci#include "src/gpu/SurfaceContext.h" 23cb93a386Sopenharmony_ci#include "src/image/SkImage_Base.h" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci#if SK_GPU_V1 26cb93a386Sopenharmony_ci#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h" 27cb93a386Sopenharmony_ci#endif 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cinamespace sk_gpu_test { 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciGrTextureProxy* GetTextureImageProxy(SkImage* image, GrRecordingContext* rContext) { 32cb93a386Sopenharmony_ci if (!image->isTextureBacked() || as_IB(image)->isYUVA()) { 33cb93a386Sopenharmony_ci return nullptr; 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci if (!rContext) { 36cb93a386Sopenharmony_ci // If the image is backed by a recording context we'll use that. 37cb93a386Sopenharmony_ci GrImageContext* iContext = as_IB(image)->context(); 38cb93a386Sopenharmony_ci SkASSERT(iContext); 39cb93a386Sopenharmony_ci rContext = iContext->priv().asRecordingContext(); 40cb93a386Sopenharmony_ci if (!rContext) { 41cb93a386Sopenharmony_ci return nullptr; 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci auto [view, ct] = as_IB(image)->asView(rContext, GrMipmapped::kNo); 45cb93a386Sopenharmony_ci if (!view) { 46cb93a386Sopenharmony_ci // With the above checks we expect this to succeed unless there is a context mismatch. 47cb93a386Sopenharmony_ci SkASSERT(!image->isValid(rContext)); 48cb93a386Sopenharmony_ci return nullptr; 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci GrSurfaceProxy* proxy = view.proxy(); 51cb93a386Sopenharmony_ci SkASSERT(proxy->asTextureProxy()); 52cb93a386Sopenharmony_ci return proxy->asTextureProxy(); 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ciGrSurfaceProxyView MakeTextureProxyViewFromData(GrDirectContext* dContext, 56cb93a386Sopenharmony_ci GrRenderable renderable, 57cb93a386Sopenharmony_ci GrSurfaceOrigin origin, 58cb93a386Sopenharmony_ci GrCPixmap pixmap) { 59cb93a386Sopenharmony_ci if (dContext->abandoned()) { 60cb93a386Sopenharmony_ci return {}; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci const GrCaps* caps = dContext->priv().caps(); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci const GrBackendFormat format = caps->getDefaultBackendFormat(pixmap.colorType(), renderable); 66cb93a386Sopenharmony_ci if (!format.isValid()) { 67cb93a386Sopenharmony_ci return {}; 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci GrSwizzle swizzle = caps->getReadSwizzle(format, pixmap.colorType()); 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci sk_sp<GrTextureProxy> proxy; 72cb93a386Sopenharmony_ci proxy = dContext->priv().proxyProvider()->createProxy(format, 73cb93a386Sopenharmony_ci pixmap.dimensions(), 74cb93a386Sopenharmony_ci renderable, 75cb93a386Sopenharmony_ci /*sample count*/ 1, 76cb93a386Sopenharmony_ci GrMipmapped::kNo, 77cb93a386Sopenharmony_ci SkBackingFit::kExact, 78cb93a386Sopenharmony_ci SkBudgeted::kYes, 79cb93a386Sopenharmony_ci GrProtected::kNo); 80cb93a386Sopenharmony_ci if (!proxy) { 81cb93a386Sopenharmony_ci return {}; 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci GrSurfaceProxyView view(proxy, origin, swizzle); 84cb93a386Sopenharmony_ci auto sContext = dContext->priv().makeSC(std::move(view), pixmap.colorInfo()); 85cb93a386Sopenharmony_ci if (!sContext) { 86cb93a386Sopenharmony_ci return {}; 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci if (!sContext->writePixels(dContext, pixmap, {0, 0})) { 89cb93a386Sopenharmony_ci return {}; 90cb93a386Sopenharmony_ci } 91cb93a386Sopenharmony_ci return sContext->readSurfaceView(); 92cb93a386Sopenharmony_ci} 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci#if SK_GPU_V1 95cb93a386Sopenharmony_ciGrProgramInfo* CreateProgramInfo(const GrCaps* caps, 96cb93a386Sopenharmony_ci SkArenaAlloc* arena, 97cb93a386Sopenharmony_ci const GrSurfaceProxyView& writeView, 98cb93a386Sopenharmony_ci bool usesMSAASurface, 99cb93a386Sopenharmony_ci GrAppliedClip&& appliedClip, 100cb93a386Sopenharmony_ci const GrDstProxyView& dstProxyView, 101cb93a386Sopenharmony_ci GrGeometryProcessor* geomProc, 102cb93a386Sopenharmony_ci SkBlendMode blendMode, 103cb93a386Sopenharmony_ci GrPrimitiveType primitiveType, 104cb93a386Sopenharmony_ci GrXferBarrierFlags renderPassXferBarriers, 105cb93a386Sopenharmony_ci GrLoadOp colorLoadOp, 106cb93a386Sopenharmony_ci GrPipeline::InputFlags flags, 107cb93a386Sopenharmony_ci const GrUserStencilSettings* stencilSettings) { 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci GrProcessorSet processors = GrProcessorSet(blendMode); 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci SkPMColor4f analysisColor = { 0, 0, 0, 1 }; // opaque black 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci SkDEBUGCODE(auto analysis =) processors.finalize(analysisColor, 114cb93a386Sopenharmony_ci GrProcessorAnalysisCoverage::kSingleChannel, 115cb93a386Sopenharmony_ci &appliedClip, stencilSettings, *caps, 116cb93a386Sopenharmony_ci GrClampType::kAuto, &analysisColor); 117cb93a386Sopenharmony_ci SkASSERT(!analysis.requiresDstTexture()); 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci return GrSimpleMeshDrawOpHelper::CreateProgramInfo(caps, arena, writeView, usesMSAASurface, 120cb93a386Sopenharmony_ci std::move(appliedClip), dstProxyView, 121cb93a386Sopenharmony_ci geomProc, std::move(processors), 122cb93a386Sopenharmony_ci primitiveType, renderPassXferBarriers, 123cb93a386Sopenharmony_ci colorLoadOp, flags, stencilSettings); 124cb93a386Sopenharmony_ci} 125cb93a386Sopenharmony_ci#endif // SK_GPU_V1 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci} // namespace sk_gpu_test 128