skia2/tools/gpu/ProxyUtils.cpp
Adlai Holler d169e1915c Migrate GrSurfaceContext readPixels to take direct context
After this lands we'll proceed up the stack and add the direct
context requirement to the public API and SkImage.

Bug: skia:104662
Change-Id: I4b2d779a7fcd65eec68e631757821ac8e136ddba
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309044
Commit-Queue: Adlai Holler <adlai@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
2020-08-10 21:54:04 +00:00

91 lines
3.8 KiB
C++

/*
* 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 "include/gpu/GrDirectContext.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/GrSurfaceContext.h"
#include "src/gpu/SkGr.h"
#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
#include "tools/gpu/ProxyUtils.h"
namespace sk_gpu_test {
sk_sp<GrTextureProxy> MakeTextureProxyFromData(GrDirectContext* dContext,
GrRenderable renderable,
GrSurfaceOrigin origin,
const GrImageInfo& imageInfo,
const void* data,
size_t rowBytes) {
if (dContext->abandoned()) {
return nullptr;
}
const GrCaps* caps = dContext->priv().caps();
const GrBackendFormat format = caps->getDefaultBackendFormat(imageInfo.colorType(), renderable);
if (!format.isValid()) {
return nullptr;
}
GrSwizzle swizzle = caps->getReadSwizzle(format, imageInfo.colorType());
sk_sp<GrTextureProxy> proxy;
proxy = dContext->priv().proxyProvider()->createProxy(format, imageInfo.dimensions(),
renderable, 1, GrMipmapped::kNo,
SkBackingFit::kExact, SkBudgeted::kYes,
GrProtected::kNo);
if (!proxy) {
return nullptr;
}
GrSurfaceProxyView view(proxy, origin, swizzle);
auto sContext = GrSurfaceContext::Make(dContext, std::move(view), imageInfo.colorType(),
imageInfo.alphaType(), imageInfo.refColorSpace());
if (!sContext) {
return nullptr;
}
if (!sContext->writePixels(dContext, imageInfo, data, rowBytes, {0, 0})) {
return nullptr;
}
return proxy;
}
GrProgramInfo* CreateProgramInfo(const GrCaps* caps,
SkArenaAlloc* arena,
const GrSurfaceProxyView* writeView,
GrAppliedClip&& appliedClip,
const GrXferProcessor::DstProxyView& dstProxyView,
GrGeometryProcessor* geomProc,
SkBlendMode blendMode,
GrPrimitiveType primitiveType,
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, false,
*caps, GrClampType::kAuto, &analysisColor);
SkASSERT(!analysis.requiresDstTexture());
return GrSimpleMeshDrawOpHelper::CreateProgramInfo(caps, arena, writeView,
std::move(appliedClip), dstProxyView,
geomProc, std::move(processors),
primitiveType, flags, stencilSettings);
}
} // namespace sk_gpu_test