1 /*
2 * Copyright 2018 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 #include "ProxyUtils.h"
9 #include "GrBackendSurface.h"
10 #include "GrContextPriv.h"
11 #include "GrDrawingManager.h"
12 #include "GrGpu.h"
13 #include "GrProxyProvider.h"
14
15 namespace sk_gpu_test {
16
MakeTextureProxyFromData(GrContext * context,bool isRT,int width,int height,GrColorType colorType,GrSRGBEncoded srgbEncoded,GrSurfaceOrigin origin,const void * data,size_t rowBytes)17 sk_sp<GrTextureProxy> MakeTextureProxyFromData(GrContext* context, bool isRT, int width, int height,
18 GrColorType colorType, GrSRGBEncoded srgbEncoded,
19 GrSurfaceOrigin origin, const void* data,
20 size_t rowBytes) {
21 if (context->abandoned()) {
22 return nullptr;
23 }
24
25 sk_sp<GrTextureProxy> proxy;
26 if (kBottomLeft_GrSurfaceOrigin == origin) {
27 // We (soon will) only support using kBottomLeft with wrapped textures.
28 auto backendTex = context->contextPriv().getGpu()->createTestingOnlyBackendTexture(
29 nullptr, width, height, colorType, isRT, GrMipMapped::kNo);
30 if (!backendTex.isValid()) {
31 return nullptr;
32 }
33 // Adopt ownership so our caller doesn't have to worry about deleting the backend texture.
34 if (isRT) {
35 proxy = context->contextPriv().proxyProvider()->wrapRenderableBackendTexture(
36 backendTex, origin, 1, kAdopt_GrWrapOwnership, GrWrapCacheable::kNo);
37 } else {
38 proxy = context->contextPriv().proxyProvider()->wrapBackendTexture(
39 backendTex, origin, kAdopt_GrWrapOwnership, GrWrapCacheable::kNo, kRW_GrIOType);
40 }
41
42 if (!proxy) {
43 context->contextPriv().getGpu()->deleteTestingOnlyBackendTexture(backendTex);
44 return nullptr;
45 }
46
47 } else {
48 GrPixelConfig config = GrColorTypeToPixelConfig(colorType, srgbEncoded);
49 if (!context->contextPriv().caps()->isConfigTexturable(config)) {
50 return nullptr;
51 }
52
53 const GrBackendFormat format =
54 context->contextPriv().caps()->getBackendFormatFromGrColorType(colorType,
55 srgbEncoded);
56 if (!format.isValid()) {
57 return nullptr;
58 }
59
60 GrSurfaceDesc desc;
61 desc.fConfig = config;
62 desc.fWidth = width;
63 desc.fHeight = height;
64 desc.fFlags = isRT ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlags;
65 proxy = context->contextPriv().proxyProvider()->createProxy(
66 format, desc, origin, SkBackingFit::kExact, SkBudgeted::kYes);
67 if (!proxy) {
68 return nullptr;
69 }
70 }
71 auto sContext = context->contextPriv().makeWrappedSurfaceContext(proxy, nullptr);
72 if (!sContext) {
73 return nullptr;
74 }
75 if (!context->contextPriv().writeSurfacePixels(sContext.get(), 0, 0, width, height, colorType,
76 nullptr, data, rowBytes)) {
77 return nullptr;
78 }
79 return proxy;
80 }
81
82 } // namespace sk_gpu_test
83