blob: 9c4359af2c443c9dd21d8f13710bb753c11ced4e [file] [log] [blame]
bsalomon@google.com686bcb82013-04-09 15:04:12 +00001/*
2 * Copyright 2013 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
bsalomona2c23232014-11-25 07:41:12 -08008#include "SkTypes.h"
9
bsalomon@google.com686bcb82013-04-09 15:04:12 +000010#if SK_SUPPORT_GPU
11
bsalomon@google.com686bcb82013-04-09 15:04:12 +000012#include "GrContext.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000013#include "GrContextPriv.h"
bsalomon091f60c2015-11-10 11:54:56 -080014#include "GrGpu.h"
Robert Phillips0bd24dc2018-01-16 08:06:32 -050015#include "GrProxyProvider.h"
Robert Phillips2890fbf2017-07-26 15:48:41 -040016#include "GrRenderTarget.h"
Brian Osman32342f02017-03-04 08:12:46 -050017#include "GrResourceProvider.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000018#include "GrTest.h"
bsalomon@google.com686bcb82013-04-09 15:04:12 +000019#include "GrTexture.h"
Brian Osman48c99192017-06-02 08:45:06 -040020#include "SkMipMap.h"
tfarina@chromium.org4ee16bf2014-01-10 22:08:27 +000021#include "Test.h"
bsalomon@google.com686bcb82013-04-09 15:04:12 +000022
bsalomona2c23232014-11-25 07:41:12 -080023// Tests that GrSurface::asTexture(), GrSurface::asRenderTarget(), and static upcasting of texture
24// and render targets to GrSurface all work as expected.
bsalomon758586c2016-04-06 14:02:39 -070025DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrSurface, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -070026 GrContext* context = ctxInfo.grContext();
Robert Phillips6be756b2018-01-16 15:07:54 -050027 auto resourceProvider = context->contextPriv().resourceProvider();
Robert Phillipsf35fd8d2018-01-22 10:48:15 -050028 GrGpu* gpu = context->contextPriv().getGpu();
Robert Phillips6be756b2018-01-16 15:07:54 -050029
kkinnunen15302832015-12-01 04:35:26 -080030 GrSurfaceDesc desc;
kkinnunen15302832015-12-01 04:35:26 -080031 desc.fFlags = kRenderTarget_GrSurfaceFlag;
Robert Phillips16d8ec62017-07-27 16:16:25 -040032 desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
kkinnunen15302832015-12-01 04:35:26 -080033 desc.fWidth = 256;
34 desc.fHeight = 256;
Robert Phillips16d8ec62017-07-27 16:16:25 -040035 desc.fConfig = kRGBA_8888_GrPixelConfig;
Brian Salomonbdecacf2018-02-02 20:32:49 -050036 desc.fSampleCnt = 1;
Robert Phillips6be756b2018-01-16 15:07:54 -050037 sk_sp<GrSurface> texRT1 = resourceProvider->createTexture(desc, SkBudgeted::kNo);
bsalomona2c23232014-11-25 07:41:12 -080038
Robert Phillipse78b7252017-04-06 07:59:41 -040039 REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asRenderTarget());
40 REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asTexture());
kkinnunen15302832015-12-01 04:35:26 -080041 REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
42 texRT1->asTexture());
43 REPORTER_ASSERT(reporter, texRT1->asRenderTarget() ==
44 static_cast<GrSurface*>(texRT1->asTexture()));
45 REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
46 static_cast<GrSurface*>(texRT1->asTexture()));
bsalomona2c23232014-11-25 07:41:12 -080047
kkinnunen15302832015-12-01 04:35:26 -080048 desc.fFlags = kNone_GrSurfaceFlags;
Robert Phillips16d8ec62017-07-27 16:16:25 -040049 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
Robert Phillips6be756b2018-01-16 15:07:54 -050050 sk_sp<GrTexture> tex1 = resourceProvider->createTexture(desc, SkBudgeted::kNo);
kkinnunen15302832015-12-01 04:35:26 -080051 REPORTER_ASSERT(reporter, nullptr == tex1->asRenderTarget());
Robert Phillipse78b7252017-04-06 07:59:41 -040052 REPORTER_ASSERT(reporter, tex1.get() == tex1->asTexture());
53 REPORTER_ASSERT(reporter, static_cast<GrSurface*>(tex1.get()) == tex1->asTexture());
bsalomon@google.com686bcb82013-04-09 15:04:12 +000054
Robert Phillipsf35fd8d2018-01-22 10:48:15 -050055 GrBackendTexture backendTex = gpu->createTestingOnlyBackendTexture(
Robert Phillipsd21b2a52017-12-12 13:01:25 -050056 nullptr, 256, 256, kRGBA_8888_GrPixelConfig, false, GrMipMapped::kNo);
bsalomon091f60c2015-11-10 11:54:56 -080057
Brian Salomonbdecacf2018-02-02 20:32:49 -050058 sk_sp<GrSurface> texRT2 =
59 resourceProvider->wrapRenderableBackendTexture(backendTex, 1, kBorrow_GrWrapOwnership);
Greg Daniel7ef28f32017-04-20 16:41:55 +000060
bungeman6bd52842016-10-27 09:30:08 -070061 REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asRenderTarget());
62 REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asTexture());
kkinnunen15302832015-12-01 04:35:26 -080063 REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
64 texRT2->asTexture());
65 REPORTER_ASSERT(reporter, texRT2->asRenderTarget() ==
66 static_cast<GrSurface*>(texRT2->asTexture()));
67 REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
68 static_cast<GrSurface*>(texRT2->asTexture()));
bsalomon@google.com686bcb82013-04-09 15:04:12 +000069
Robert Phillipsf35fd8d2018-01-22 10:48:15 -050070 gpu->deleteTestingOnlyBackendTexture(&backendTex);
bsalomon@google.com686bcb82013-04-09 15:04:12 +000071}
72
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -040073// This test checks that the isConfigTexturable and isConfigRenderable are
74// consistent with createTexture's result.
75DEF_GPUTEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability, reporter, ctxInfo) {
76 GrContext* context = ctxInfo.grContext();
Robert Phillips1afd4cd2018-01-08 13:40:32 -050077 GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
Robert Phillips6be756b2018-01-16 15:07:54 -050078 GrResourceProvider* resourceProvider = context->contextPriv().resourceProvider();
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -040079 const GrCaps* caps = context->caps();
80
81 GrPixelConfig configs[] = {
82 kUnknown_GrPixelConfig,
83 kAlpha_8_GrPixelConfig,
Greg Danielef59d872017-11-17 16:47:21 -050084 kAlpha_8_as_Alpha_GrPixelConfig,
85 kAlpha_8_as_Red_GrPixelConfig,
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -040086 kGray_8_GrPixelConfig,
Greg Daniel7af060a2017-12-05 16:27:11 -050087 kGray_8_as_Lum_GrPixelConfig,
88 kGray_8_as_Red_GrPixelConfig,
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -040089 kRGB_565_GrPixelConfig,
90 kRGBA_4444_GrPixelConfig,
91 kRGBA_8888_GrPixelConfig,
92 kBGRA_8888_GrPixelConfig,
93 kSRGBA_8888_GrPixelConfig,
94 kSBGRA_8888_GrPixelConfig,
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -040095 kRGBA_float_GrPixelConfig,
96 kRG_float_GrPixelConfig,
97 kAlpha_half_GrPixelConfig,
Greg Danielef59d872017-11-17 16:47:21 -050098 kAlpha_half_as_Red_GrPixelConfig,
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -040099 kRGBA_half_GrPixelConfig,
100 };
101 SkASSERT(kGrPixelConfigCnt == SK_ARRAY_COUNT(configs));
102
103 GrSurfaceDesc desc;
104 desc.fWidth = 64;
105 desc.fHeight = 64;
106
Brian Osman48c99192017-06-02 08:45:06 -0400107 // Enough space for the first mip of our largest pixel config
108 const size_t pixelBufferSize = desc.fWidth * desc.fHeight *
109 GrBytesPerPixel(kRGBA_float_GrPixelConfig);
110 std::unique_ptr<char[]> pixelData(new char[pixelBufferSize]);
111 memset(pixelData.get(), 0, pixelBufferSize);
112
113 // We re-use the same mip level objects (with updated pointers and rowBytes) for each config
114 const int levelCount = SkMipMap::ComputeLevelCount(desc.fWidth, desc.fHeight) + 1;
115 std::unique_ptr<GrMipLevel[]> texels(new GrMipLevel[levelCount]);
116
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400117 for (GrPixelConfig config : configs) {
118 for (GrSurfaceOrigin origin : { kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin }) {
119 desc.fFlags = kNone_GrSurfaceFlags;
120 desc.fOrigin = origin;
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400121 desc.fConfig = config;
Brian Salomonbdecacf2018-02-02 20:32:49 -0500122 desc.fSampleCnt = 1;
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400123
Robert Phillips3b3307f2017-05-24 07:44:02 -0400124 sk_sp<GrSurface> tex = resourceProvider->createTexture(desc, SkBudgeted::kNo);
Brian Salomon1c80e992018-01-29 09:50:47 -0500125 bool ict = caps->isConfigTexturable(desc.fConfig);
126 REPORTER_ASSERT(reporter, SkToBool(tex) == ict,
127 "config:%d, tex:%d, isConfigTexturable:%d", config, SkToBool(tex), ict);
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400128
Brian Osman48c99192017-06-02 08:45:06 -0400129 size_t rowBytes = desc.fWidth * GrBytesPerPixel(desc.fConfig);
130 for (int i = 0; i < levelCount; ++i) {
131 texels[i].fPixels = pixelData.get();
132 texels[i].fRowBytes = rowBytes >> i;
133 }
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500134
135 sk_sp<GrTextureProxy> proxy = proxyProvider->createMipMapProxy(
136 desc, SkBudgeted::kNo,
137 texels.get(), levelCount);
Brian Osman48c99192017-06-02 08:45:06 -0400138 REPORTER_ASSERT(reporter, SkToBool(proxy.get()) ==
139 (caps->isConfigTexturable(desc.fConfig) &&
Brian Salomon57111332018-02-05 15:55:54 -0500140 caps->mipMapSupport()));
Brian Osman48c99192017-06-02 08:45:06 -0400141
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400142 desc.fFlags = kRenderTarget_GrSurfaceFlag;
Robert Phillips3b3307f2017-05-24 07:44:02 -0400143 tex = resourceProvider->createTexture(desc, SkBudgeted::kNo);
Brian Salomonbdecacf2018-02-02 20:32:49 -0500144 bool isRenderable = caps->isConfigRenderable(config);
145 REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
146 "config:%d, tex:%d, isRenderable:%d", config, SkToBool(tex),
147 isRenderable);
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400148
Brian Salomonbdecacf2018-02-02 20:32:49 -0500149 desc.fSampleCnt = 2;
Robert Phillips3b3307f2017-05-24 07:44:02 -0400150 tex = resourceProvider->createTexture(desc, SkBudgeted::kNo);
Brian Salomonbdecacf2018-02-02 20:32:49 -0500151 isRenderable = SkToBool(caps->getRenderTargetSampleCount(2, config));
152 REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
153 "config:%d, tex:%d, isRenderable:%d", config, SkToBool(tex),
154 isRenderable);
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400155 }
156 }
157}
Robert Phillipsb7b7e5f2017-05-22 13:23:19 -0400158
Brian Salomond17b4a62017-05-23 16:53:47 -0400159#include "GrDrawingManager.h"
160#include "GrSurfaceProxy.h"
161#include "GrTextureContext.h"
162
163DEF_GPUTEST_FOR_RENDERING_CONTEXTS(InitialTextureClear, reporter, context_info) {
164 static constexpr int kSize = 100;
165 GrSurfaceDesc desc;
166 desc.fWidth = desc.fHeight = kSize;
167 std::unique_ptr<uint32_t[]> data(new uint32_t[kSize * kSize]);
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500168
Brian Salomond17b4a62017-05-23 16:53:47 -0400169 GrContext* context = context_info.grContext();
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500170 GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
171
Brian Salomond17b4a62017-05-23 16:53:47 -0400172 for (int c = 0; c <= kLast_GrPixelConfig; ++c) {
173 desc.fConfig = static_cast<GrPixelConfig>(c);
174 if (!context_info.grContext()->caps()->isConfigTexturable(desc.fConfig)) {
175 continue;
176 }
177 desc.fFlags = kPerformInitialClear_GrSurfaceFlag;
178 for (bool rt : {false, true}) {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500179 if (rt && !context->caps()->isConfigRenderable(desc.fConfig)) {
Brian Salomond17b4a62017-05-23 16:53:47 -0400180 continue;
181 }
182 desc.fFlags |= rt ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlags;
Greg Daniel90f28ec2017-09-25 12:26:58 -0400183 for (GrSurfaceOrigin origin :
184 {kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin}) {
185 desc.fOrigin = origin;
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500186 for (auto fit : { SkBackingFit::kApprox, SkBackingFit::kExact }) {
Greg Daniel90f28ec2017-09-25 12:26:58 -0400187 // Try directly creating the texture.
188 // Do this twice in an attempt to hit the cache on the second time through.
189 for (int i = 0; i < 2; ++i) {
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500190 sk_sp<GrTextureProxy> proxy = proxyProvider->createInstantiatedProxy(
191 desc, fit, SkBudgeted::kYes);
192 if (!proxy) {
Greg Daniel90f28ec2017-09-25 12:26:58 -0400193 continue;
194 }
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500195
Greg Daniel90f28ec2017-09-25 12:26:58 -0400196 auto texCtx = context->contextPriv().makeWrappedSurfaceContext(
Robert Phillipsd5f9cdd2018-01-31 09:29:48 -0500197 std::move(proxy));
Greg Daniel90f28ec2017-09-25 12:26:58 -0400198 SkImageInfo info = SkImageInfo::Make(
199 kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
200 memset(data.get(), 0xAB, kSize * kSize * sizeof(uint32_t));
201 if (texCtx->readPixels(info, data.get(), 0, 0, 0)) {
202 uint32_t cmp = GrPixelConfigIsOpaque(desc.fConfig) ? 0xFF000000 : 0;
203 for (int i = 0; i < kSize * kSize; ++i) {
204 if (cmp != data.get()[i]) {
205 ERRORF(reporter, "Failed on config %d", desc.fConfig);
206 break;
Brian Salomond17b4a62017-05-23 16:53:47 -0400207 }
208 }
Brian Salomond17b4a62017-05-23 16:53:47 -0400209 }
Greg Daniel90f28ec2017-09-25 12:26:58 -0400210 memset(data.get(), 0xBC, kSize * kSize * sizeof(uint32_t));
211 // Here we overwrite the texture so that the second time through we
212 // test against recycling without reclearing.
213 if (0 == i) {
214 texCtx->writePixels(info, data.get(), 0, 0, 0);
Greg Daniel52cb5fe2017-09-05 15:45:15 -0400215 }
Greg Daniel52cb5fe2017-09-05 15:45:15 -0400216 }
Greg Daniel90f28ec2017-09-25 12:26:58 -0400217 context->purgeAllUnlockedResources();
218
219 // Try creating the texture as a deferred proxy.
220 for (int i = 0; i < 2; ++i) {
221 auto surfCtx = context->contextPriv().makeDeferredSurfaceContext(
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500222 desc, GrMipMapped::kNo, fit, SkBudgeted::kYes);
Greg Daniel90f28ec2017-09-25 12:26:58 -0400223 if (!surfCtx) {
224 continue;
225 }
226 SkImageInfo info = SkImageInfo::Make(
227 kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
228 memset(data.get(), 0xAB, kSize * kSize * sizeof(uint32_t));
229 if (surfCtx->readPixels(info, data.get(), 0, 0, 0)) {
230 uint32_t cmp = GrPixelConfigIsOpaque(desc.fConfig) ? 0xFF000000 : 0;
231 for (int i = 0; i < kSize * kSize; ++i) {
232 if (cmp != data.get()[i]) {
233 ERRORF(reporter, "Failed on config %d", desc.fConfig);
234 break;
235 }
236 }
237 }
238 // Here we overwrite the texture so that the second time through we
239 // test against recycling without reclearing.
240 if (0 == i) {
241 surfCtx->writePixels(info, data.get(), 0, 0, 0);
242 }
243 }
244 context->purgeAllUnlockedResources();
Brian Salomond17b4a62017-05-23 16:53:47 -0400245 }
246 }
247 }
248 }
249}
bsalomon@google.com686bcb82013-04-09 15:04:12 +0000250#endif