/* * 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 "include/core/SkColor.h" #include "include/gpu/GrBackendSurface.h" #include "src/gpu/GrContextPriv.h" #include "src/gpu/GrDrawingManager.h" #include "src/gpu/GrGpu.h" #include "src/gpu/GrImageInfo.h" #include "src/gpu/GrProgramInfo.h" #include "src/gpu/GrProxyProvider.h" #include "src/gpu/SkGr.h" #include "tools/gpu/ProxyUtils.h" namespace sk_gpu_test { sk_sp MakeTextureProxyFromData(GrContext* context, GrRenderable renderable, GrSurfaceOrigin origin, const GrImageInfo& imageInfo, const void* data, size_t rowBytes) { if (context->priv().abandoned()) { return nullptr; } const GrCaps* caps = context->priv().caps(); const GrBackendFormat format = caps->getDefaultBackendFormat(imageInfo.colorType(), renderable); if (!format.isValid()) { return nullptr; } sk_sp proxy; GrSurfaceDesc desc; desc.fConfig = GrColorTypeToPixelConfig(imageInfo.colorType()); desc.fWidth = imageInfo.width(); desc.fHeight = imageInfo.height(); proxy = context->priv().proxyProvider()->createProxy(format, desc, renderable, 1, origin, GrMipMapped::kNo, SkBackingFit::kExact, SkBudgeted::kYes, GrProtected::kNo); if (!proxy) { return nullptr; } auto sContext = context->priv().makeWrappedSurfaceContext(proxy, imageInfo.colorType(), imageInfo.alphaType(), imageInfo.refColorSpace(), nullptr); if (!sContext) { return nullptr; } if (!sContext->writePixels(imageInfo, data, rowBytes, {0, 0}, context)) { return nullptr; } return proxy; } GrProgramInfo* CreateProgramInfo(const GrCaps* caps, SkArenaAlloc* arena, const GrSurfaceProxyView* dstView, GrAppliedClip&& appliedClip, const GrXferProcessor::DstProxyView& dstProxyView, GrGeometryProcessor* geomProc, SkBlendMode blendMode, GrPrimitiveType primitiveType, GrPipeline::InputFlags flags, const GrUserStencilSettings* stencil) { GrPipeline::InitArgs initArgs; initArgs.fInputFlags = flags; initArgs.fUserStencil = stencil; initArgs.fCaps = caps; initArgs.fDstProxyView = dstProxyView; initArgs.fOutputSwizzle = dstView->swizzle(); GrPipeline::FixedDynamicState* fixedDynamicState = nullptr; if (appliedClip.scissorState().enabled()) { fixedDynamicState = arena->make( appliedClip.scissorState().rect()); } GrProcessorSet processors = GrProcessorSet(blendMode); SkPMColor4f analysisColor = { 0, 0, 0, 1 }; // opaque black SkDEBUGCODE(auto analysis =) processors.finalize(analysisColor, GrProcessorAnalysisCoverage::kNone, &appliedClip, stencil, false, *caps, GrClampType::kAuto, &analysisColor); SkASSERT(!analysis.requiresDstTexture()); GrPipeline* pipeline = arena->make(initArgs, std::move(processors), std::move(appliedClip)); GrRenderTargetProxy* dstProxy = dstView->asRenderTargetProxy(); return arena->make(dstProxy->numSamples(), dstProxy->numStencilSamples(), dstProxy->backendFormat(), dstView->origin(), pipeline, geomProc, fixedDynamicState, nullptr, 0, primitiveType); } } // namespace sk_gpu_test