blob: c33bc514dac84a0e50c11910084615e60dc015b5 [file] [log] [blame]
Robert Phillipseb35f4d2017-03-21 07:56:47 -04001/*
2 * Copyright 2017 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
Chris Daltonfe199b72017-05-05 11:26:15 -04008#include "GrOnFlushResourceProvider.h"
Robert Phillipseb35f4d2017-03-21 07:56:47 -04009
Robert Phillips1afd4cd2018-01-08 13:40:32 -050010#include "GrContextPriv.h"
Robert Phillipseb35f4d2017-03-21 07:56:47 -040011#include "GrDrawingManager.h"
Robert Phillips0bd24dc2018-01-16 08:06:32 -050012#include "GrProxyProvider.h"
Robert Phillipseb35f4d2017-03-21 07:56:47 -040013#include "GrSurfaceProxy.h"
14
Chris Daltonfe199b72017-05-05 11:26:15 -040015sk_sp<GrRenderTargetContext> GrOnFlushResourceProvider::makeRenderTargetContext(
Brian Salomon2a4f9832018-03-03 22:43:43 -050016 const GrSurfaceDesc& desc,
17 GrSurfaceOrigin origin,
18 sk_sp<SkColorSpace> colorSpace,
19 const SkSurfaceProps* props) {
Robert Phillipseb35f4d2017-03-21 07:56:47 -040020 GrSurfaceDesc tmpDesc = desc;
21 tmpDesc.fFlags |= kRenderTarget_GrSurfaceFlag;
22
Robert Phillips6be756b2018-01-16 15:07:54 -050023 auto proxyProvider = fDrawingMgr->getContext()->contextPriv().proxyProvider();
24 auto resourceProvider = fDrawingMgr->getContext()->contextPriv().resourceProvider();
25
Robert Phillipseb35f4d2017-03-21 07:56:47 -040026 // Because this is being allocated at the start of a flush we must ensure the proxy
27 // will, when instantiated, have no pending IO.
28 // TODO: fold the kNoPendingIO_Flag into GrSurfaceFlags?
Brian Salomon2a4f9832018-03-03 22:43:43 -050029 sk_sp<GrSurfaceProxy> proxy =
30 proxyProvider->createProxy(tmpDesc, origin, SkBackingFit::kExact, SkBudgeted::kYes,
31 GrResourceProvider::kNoPendingIO_Flag);
Robert Phillipseb35f4d2017-03-21 07:56:47 -040032 if (!proxy->asRenderTargetProxy()) {
33 return nullptr;
34 }
35
Robert Phillips1119dc32017-04-11 12:54:57 -040036 sk_sp<GrRenderTargetContext> renderTargetContext(
37 fDrawingMgr->makeRenderTargetContext(std::move(proxy),
38 std::move(colorSpace),
Robert Phillips941d1442017-06-14 16:37:02 -040039 props, false));
Robert Phillips1119dc32017-04-11 12:54:57 -040040
41 if (!renderTargetContext) {
42 return nullptr;
43 }
44
Robert Phillipse0070c02017-11-13 12:47:24 -050045 // Since this is at flush time and these won't be allocated for us by the GrResourceAllocator
46 // we have to manually ensure it is allocated here. The proxy had best have been created
47 // with the kNoPendingIO flag!
Robert Phillips6be756b2018-01-16 15:07:54 -050048 if (!renderTargetContext->asSurfaceProxy()->instantiate(resourceProvider)) {
Robert Phillipse0070c02017-11-13 12:47:24 -050049 return nullptr;
50 }
51
Robert Phillips1119dc32017-04-11 12:54:57 -040052 renderTargetContext->discard();
53
54 return renderTargetContext;
Robert Phillipseb35f4d2017-03-21 07:56:47 -040055}
56
Chris Daltonfe199b72017-05-05 11:26:15 -040057sk_sp<GrRenderTargetContext> GrOnFlushResourceProvider::makeRenderTargetContext(
Robert Phillipseb35f4d2017-03-21 07:56:47 -040058 sk_sp<GrSurfaceProxy> proxy,
59 sk_sp<SkColorSpace> colorSpace,
60 const SkSurfaceProps* props) {
Robert Phillips1119dc32017-04-11 12:54:57 -040061 sk_sp<GrRenderTargetContext> renderTargetContext(
62 fDrawingMgr->makeRenderTargetContext(std::move(proxy),
63 std::move(colorSpace),
Robert Phillips941d1442017-06-14 16:37:02 -040064 props, false));
Robert Phillips1119dc32017-04-11 12:54:57 -040065
66 if (!renderTargetContext) {
67 return nullptr;
68 }
69
Robert Phillips6be756b2018-01-16 15:07:54 -050070 auto resourceProvider = fDrawingMgr->getContext()->contextPriv().resourceProvider();
71
Robert Phillipse0070c02017-11-13 12:47:24 -050072 // Since this is at flush time and these won't be allocated for us by the GrResourceAllocator
73 // we have to manually ensure it is allocated here. The proxy had best have been created
74 // with the kNoPendingIO flag!
Robert Phillips6be756b2018-01-16 15:07:54 -050075 if (!renderTargetContext->asSurfaceProxy()->instantiate(resourceProvider)) {
Robert Phillipse0070c02017-11-13 12:47:24 -050076 return nullptr;
77 }
78
Robert Phillips1119dc32017-04-11 12:54:57 -040079 renderTargetContext->discard();
80
81 return renderTargetContext;
Robert Phillipseb35f4d2017-03-21 07:56:47 -040082}
83
Robert Phillipscd5099c2018-02-09 09:56:56 -050084bool GrOnFlushResourceProvider::instatiateProxy(GrSurfaceProxy* proxy) {
85 auto resourceProvider = fDrawingMgr->getContext()->contextPriv().resourceProvider();
86
Robert Phillips7d79e7b2018-02-14 11:09:57 -050087 if (GrSurfaceProxy::LazyState::kNot != proxy->lazyInstantiationState()) {
Greg Daniel4684f822018-03-08 15:27:36 -050088 // DDL TODO: Decide if we ever plan to have these proxies use the GrUninstantiateTracker
89 // to support unistantiating them at the end of a flush.
Robert Phillips7d79e7b2018-02-14 11:09:57 -050090 return proxy->priv().doLazyInstantiation(resourceProvider);
91 }
92
Robert Phillipscd5099c2018-02-09 09:56:56 -050093 return proxy->instantiate(resourceProvider);
94}
95
Chris Dalton6081ebb2017-06-20 11:35:59 -070096sk_sp<GrBuffer> GrOnFlushResourceProvider::makeBuffer(GrBufferType intendedType, size_t size,
97 const void* data) {
Robert Phillips6be756b2018-01-16 15:07:54 -050098 auto resourceProvider = fDrawingMgr->getContext()->contextPriv().resourceProvider();
99 return sk_sp<GrBuffer>(resourceProvider->createBuffer(size, intendedType,
100 kDynamic_GrAccessPattern,
101 GrResourceProvider::kNoPendingIO_Flag,
102 data));
Chris Dalton6081ebb2017-06-20 11:35:59 -0700103}
104
Chris Dalton5d2de082017-12-19 10:40:23 -0700105sk_sp<const GrBuffer> GrOnFlushResourceProvider::findOrMakeStaticBuffer(GrBufferType intendedType,
106 size_t size,
107 const void* data,
108 const GrUniqueKey& key) {
Robert Phillips6be756b2018-01-16 15:07:54 -0500109 auto resourceProvider = fDrawingMgr->getContext()->contextPriv().resourceProvider();
110 sk_sp<const GrBuffer> buffer = resourceProvider->findOrMakeStaticBuffer(intendedType, size,
111 data, key);
Chris Dalton5d2de082017-12-19 10:40:23 -0700112 // Static buffers should never have pending IO.
113 SkASSERT(!buffer->resourcePriv().hasPendingIO_debugOnly());
Chris Daltone9e91dd2017-07-14 08:48:57 -0600114 return buffer;
115}
116
Chris Dalton6081ebb2017-06-20 11:35:59 -0700117const GrCaps* GrOnFlushResourceProvider::caps() const {
118 return fDrawingMgr->getContext()->caps();
119}