/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/gpu/ProxyUtils.h" #include "include/core/SkColor.h" #include "include/gpu/GrBackendSurface.h" #include "include/gpu/GrDirectContext.h" #include "include/private/GrImageContext.h" #include "src/gpu/GrDirectContextPriv.h" #include "src/gpu/GrDrawingManager.h" #include "src/gpu/GrGpu.h" #include "src/gpu/GrImageContextPriv.h" #include "src/gpu/GrPixmap.h" #include "src/gpu/GrProgramInfo.h" #include "src/gpu/GrProxyProvider.h" #include "src/gpu/SkGr.h" #include "src/gpu/SurfaceContext.h" #include "src/image/SkImage_Base.h" #if SK_GPU_V1 #include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h" #endif namespace sk_gpu_test { GrTextureProxy* GetTextureImageProxy(SkImage* image, GrRecordingContext* rContext) { if (!image->isTextureBacked() || as_IB(image)->isYUVA()) { return nullptr; } if (!rContext) { // If the image is backed by a recording context we'll use that. GrImageContext* iContext = as_IB(image)->context(); SkASSERT(iContext); rContext = iContext->priv().asRecordingContext(); if (!rContext) { return nullptr; } } auto [view, ct] = as_IB(image)->asView(rContext, GrMipmapped::kNo); if (!view) { // With the above checks we expect this to succeed unless there is a context mismatch. SkASSERT(!image->isValid(rContext)); return nullptr; } GrSurfaceProxy* proxy = view.proxy(); SkASSERT(proxy->asTextureProxy()); return proxy->asTextureProxy(); } GrSurfaceProxyView MakeTextureProxyViewFromData(GrDirectContext* dContext, GrRenderable renderable, GrSurfaceOrigin origin, GrCPixmap pixmap) { if (dContext->abandoned()) { return {}; } const GrCaps* caps = dContext->priv().caps(); const GrBackendFormat format = caps->getDefaultBackendFormat(pixmap.colorType(), renderable); if (!format.isValid()) { return {}; } skgpu::Swizzle swizzle = caps->getReadSwizzle(format, pixmap.colorType()); sk_sp proxy; proxy = dContext->priv().proxyProvider()->createProxy(format, pixmap.dimensions(), renderable, /*sample count*/ 1, GrMipmapped::kNo, SkBackingFit::kExact, SkBudgeted::kYes, GrProtected::kNo); if (!proxy) { return {}; } GrSurfaceProxyView view(proxy, origin, swizzle); auto sContext = dContext->priv().makeSC(std::move(view), pixmap.colorInfo()); if (!sContext) { return {}; } if (!sContext->writePixels(dContext, pixmap, {0, 0})) { return {}; } return sContext->readSurfaceView(); } #if SK_GPU_V1 GrProgramInfo* CreateProgramInfo(const GrCaps* caps, SkArenaAlloc* arena, const GrSurfaceProxyView& writeView, bool usesMSAASurface, GrAppliedClip&& appliedClip, const GrDstProxyView& dstProxyView, GrGeometryProcessor* geomProc, SkBlendMode blendMode, GrPrimitiveType primitiveType, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp, GrPipeline::InputFlags flags, const GrUserStencilSettings* stencilSettings) { GrProcessorSet processors = GrProcessorSet(blendMode); SkPMColor4f analysisColor = { 0, 0, 0, 1 }; // opaque black SkDEBUGCODE(auto analysis =) processors.finalize(analysisColor, GrProcessorAnalysisCoverage::kSingleChannel, &appliedClip, stencilSettings, *caps, GrClampType::kAuto, &analysisColor); SkASSERT(!analysis.requiresDstTexture()); return GrSimpleMeshDrawOpHelper::CreateProgramInfo(caps, arena, writeView, usesMSAASurface, std::move(appliedClip), dstProxyView, geomProc, std::move(processors), primitiveType, renderPassXferBarriers, colorLoadOp, flags, stencilSettings); } #endif // SK_GPU_V1 } // namespace sk_gpu_test