• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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