2013-04-09 15:04:12 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2013 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
2014-11-25 15:41:12 +00:00
|
|
|
#include "SkTypes.h"
|
|
|
|
|
2013-04-09 15:04:12 +00:00
|
|
|
#if SK_SUPPORT_GPU
|
|
|
|
|
|
|
|
#include "GrContext.h"
|
Revert "Revert "Plumb GrBackendTexture throughout skia.""
This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6.
Reason for revert: Relanding this change now that other fixes have landed.
Original change's description:
> Revert "Plumb GrBackendTexture throughout skia."
>
> This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12.
>
> Reason for revert: fix android roll
>
> Original change's description:
> > Plumb GrBackendTexture throughout skia.
> >
> > Bug: skia:
> > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875
> > Reviewed-on: https://skia-review.googlesource.com/13645
> > Commit-Queue: Greg Daniel <egdaniel@google.com>
> > Reviewed-by: Robert Phillips <robertphillips@google.com>
> >
>
> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
>
> Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89
> Reviewed-on: https://skia-review.googlesource.com/13773
> Reviewed-by: Stan Iliev <stani@google.com>
> Commit-Queue: Stan Iliev <stani@google.com>
>
TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2
Reviewed-on: https://skia-review.googlesource.com/13975
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
|
|
|
#include "GrContextPriv.h"
|
2015-11-10 19:54:56 +00:00
|
|
|
#include "GrGpu.h"
|
2018-01-16 13:06:32 +00:00
|
|
|
#include "GrProxyProvider.h"
|
2017-07-26 19:48:41 +00:00
|
|
|
#include "GrRenderTarget.h"
|
2017-03-04 13:12:46 +00:00
|
|
|
#include "GrResourceProvider.h"
|
Revert "Revert "Plumb GrBackendTexture throughout skia.""
This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6.
Reason for revert: Relanding this change now that other fixes have landed.
Original change's description:
> Revert "Plumb GrBackendTexture throughout skia."
>
> This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12.
>
> Reason for revert: fix android roll
>
> Original change's description:
> > Plumb GrBackendTexture throughout skia.
> >
> > Bug: skia:
> > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875
> > Reviewed-on: https://skia-review.googlesource.com/13645
> > Commit-Queue: Greg Daniel <egdaniel@google.com>
> > Reviewed-by: Robert Phillips <robertphillips@google.com>
> >
>
> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
>
> Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89
> Reviewed-on: https://skia-review.googlesource.com/13773
> Reviewed-by: Stan Iliev <stani@google.com>
> Commit-Queue: Stan Iliev <stani@google.com>
>
TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2
Reviewed-on: https://skia-review.googlesource.com/13975
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
|
|
|
#include "GrTest.h"
|
2013-04-09 15:04:12 +00:00
|
|
|
#include "GrTexture.h"
|
2017-06-02 12:45:06 +00:00
|
|
|
#include "SkMipMap.h"
|
2014-01-10 22:08:27 +00:00
|
|
|
#include "Test.h"
|
2013-04-09 15:04:12 +00:00
|
|
|
|
2014-11-25 15:41:12 +00:00
|
|
|
// Tests that GrSurface::asTexture(), GrSurface::asRenderTarget(), and static upcasting of texture
|
|
|
|
// and render targets to GrSurface all work as expected.
|
2016-04-06 21:02:39 +00:00
|
|
|
DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrSurface, reporter, ctxInfo) {
|
2016-05-11 13:33:06 +00:00
|
|
|
GrContext* context = ctxInfo.grContext();
|
2018-01-16 20:07:54 +00:00
|
|
|
auto resourceProvider = context->contextPriv().resourceProvider();
|
2018-01-22 15:48:15 +00:00
|
|
|
GrGpu* gpu = context->contextPriv().getGpu();
|
2018-01-16 20:07:54 +00:00
|
|
|
|
2015-12-01 12:35:26 +00:00
|
|
|
GrSurfaceDesc desc;
|
|
|
|
desc.fFlags = kRenderTarget_GrSurfaceFlag;
|
2017-07-27 20:16:25 +00:00
|
|
|
desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
2015-12-01 12:35:26 +00:00
|
|
|
desc.fWidth = 256;
|
|
|
|
desc.fHeight = 256;
|
2017-07-27 20:16:25 +00:00
|
|
|
desc.fConfig = kRGBA_8888_GrPixelConfig;
|
2018-02-03 01:32:49 +00:00
|
|
|
desc.fSampleCnt = 1;
|
2018-01-16 20:07:54 +00:00
|
|
|
sk_sp<GrSurface> texRT1 = resourceProvider->createTexture(desc, SkBudgeted::kNo);
|
2014-11-25 15:41:12 +00:00
|
|
|
|
2017-04-06 11:59:41 +00:00
|
|
|
REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asRenderTarget());
|
|
|
|
REPORTER_ASSERT(reporter, texRT1.get() == texRT1->asTexture());
|
2015-12-01 12:35:26 +00:00
|
|
|
REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
|
|
|
|
texRT1->asTexture());
|
|
|
|
REPORTER_ASSERT(reporter, texRT1->asRenderTarget() ==
|
|
|
|
static_cast<GrSurface*>(texRT1->asTexture()));
|
|
|
|
REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT1->asRenderTarget()) ==
|
|
|
|
static_cast<GrSurface*>(texRT1->asTexture()));
|
2014-11-25 15:41:12 +00:00
|
|
|
|
2015-12-01 12:35:26 +00:00
|
|
|
desc.fFlags = kNone_GrSurfaceFlags;
|
2017-07-27 20:16:25 +00:00
|
|
|
desc.fOrigin = kTopLeft_GrSurfaceOrigin;
|
2018-01-16 20:07:54 +00:00
|
|
|
sk_sp<GrTexture> tex1 = resourceProvider->createTexture(desc, SkBudgeted::kNo);
|
2015-12-01 12:35:26 +00:00
|
|
|
REPORTER_ASSERT(reporter, nullptr == tex1->asRenderTarget());
|
2017-04-06 11:59:41 +00:00
|
|
|
REPORTER_ASSERT(reporter, tex1.get() == tex1->asTexture());
|
|
|
|
REPORTER_ASSERT(reporter, static_cast<GrSurface*>(tex1.get()) == tex1->asTexture());
|
2013-04-09 15:04:12 +00:00
|
|
|
|
2018-01-22 15:48:15 +00:00
|
|
|
GrBackendTexture backendTex = gpu->createTestingOnlyBackendTexture(
|
2017-12-12 18:01:25 +00:00
|
|
|
nullptr, 256, 256, kRGBA_8888_GrPixelConfig, false, GrMipMapped::kNo);
|
2015-11-10 19:54:56 +00:00
|
|
|
|
2018-02-03 01:32:49 +00:00
|
|
|
sk_sp<GrSurface> texRT2 =
|
|
|
|
resourceProvider->wrapRenderableBackendTexture(backendTex, 1, kBorrow_GrWrapOwnership);
|
Revert "Revert "Plumb GrBackendTexture throughout skia.""
This reverts commit 7fa5c31c2c9af834bee66d5fcf476e250076c8d6.
Reason for revert: Relanding this change now that other fixes have landed.
Original change's description:
> Revert "Plumb GrBackendTexture throughout skia."
>
> This reverts commit 7da62b9059f3c1d31624a0e4da96ee5f908f9c12.
>
> Reason for revert: fix android roll
>
> Original change's description:
> > Plumb GrBackendTexture throughout skia.
> >
> > Bug: skia:
> > Change-Id: I1bae6768ee7229818a83ba608035a1f7867e6875
> > Reviewed-on: https://skia-review.googlesource.com/13645
> > Commit-Queue: Greg Daniel <egdaniel@google.com>
> > Reviewed-by: Robert Phillips <robertphillips@google.com>
> >
>
> TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,brianosman@google.com,reviews@skia.org,stani@google.com
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
>
> Change-Id: I5cb8763cc837c83ebc6d10366fe2dd3efe35fb89
> Reviewed-on: https://skia-review.googlesource.com/13773
> Reviewed-by: Stan Iliev <stani@google.com>
> Commit-Queue: Stan Iliev <stani@google.com>
>
TBR=egdaniel@google.com,bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,stani@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: I92bc074e4fe37fa5c83186afadc472c03802e8f2
Reviewed-on: https://skia-review.googlesource.com/13975
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
2017-04-20 16:41:55 +00:00
|
|
|
|
2016-10-27 16:30:08 +00:00
|
|
|
REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asRenderTarget());
|
|
|
|
REPORTER_ASSERT(reporter, texRT2.get() == texRT2->asTexture());
|
2015-12-01 12:35:26 +00:00
|
|
|
REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
|
|
|
|
texRT2->asTexture());
|
|
|
|
REPORTER_ASSERT(reporter, texRT2->asRenderTarget() ==
|
|
|
|
static_cast<GrSurface*>(texRT2->asTexture()));
|
|
|
|
REPORTER_ASSERT(reporter, static_cast<GrSurface*>(texRT2->asRenderTarget()) ==
|
|
|
|
static_cast<GrSurface*>(texRT2->asTexture()));
|
2013-04-09 15:04:12 +00:00
|
|
|
|
2018-01-22 15:48:15 +00:00
|
|
|
gpu->deleteTestingOnlyBackendTexture(&backendTex);
|
2013-04-09 15:04:12 +00:00
|
|
|
}
|
|
|
|
|
2017-05-22 17:23:19 +00:00
|
|
|
// This test checks that the isConfigTexturable and isConfigRenderable are
|
|
|
|
// consistent with createTexture's result.
|
|
|
|
DEF_GPUTEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability, reporter, ctxInfo) {
|
|
|
|
GrContext* context = ctxInfo.grContext();
|
2018-01-08 18:40:32 +00:00
|
|
|
GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
|
2018-01-16 20:07:54 +00:00
|
|
|
GrResourceProvider* resourceProvider = context->contextPriv().resourceProvider();
|
2017-05-22 17:23:19 +00:00
|
|
|
const GrCaps* caps = context->caps();
|
|
|
|
|
|
|
|
GrPixelConfig configs[] = {
|
|
|
|
kUnknown_GrPixelConfig,
|
|
|
|
kAlpha_8_GrPixelConfig,
|
2017-11-17 21:47:21 +00:00
|
|
|
kAlpha_8_as_Alpha_GrPixelConfig,
|
|
|
|
kAlpha_8_as_Red_GrPixelConfig,
|
2017-05-22 17:23:19 +00:00
|
|
|
kGray_8_GrPixelConfig,
|
2017-12-05 21:27:11 +00:00
|
|
|
kGray_8_as_Lum_GrPixelConfig,
|
|
|
|
kGray_8_as_Red_GrPixelConfig,
|
2017-05-22 17:23:19 +00:00
|
|
|
kRGB_565_GrPixelConfig,
|
|
|
|
kRGBA_4444_GrPixelConfig,
|
|
|
|
kRGBA_8888_GrPixelConfig,
|
|
|
|
kBGRA_8888_GrPixelConfig,
|
|
|
|
kSRGBA_8888_GrPixelConfig,
|
|
|
|
kSBGRA_8888_GrPixelConfig,
|
|
|
|
kRGBA_float_GrPixelConfig,
|
|
|
|
kRG_float_GrPixelConfig,
|
|
|
|
kAlpha_half_GrPixelConfig,
|
2017-11-17 21:47:21 +00:00
|
|
|
kAlpha_half_as_Red_GrPixelConfig,
|
2017-05-22 17:23:19 +00:00
|
|
|
kRGBA_half_GrPixelConfig,
|
|
|
|
};
|
|
|
|
SkASSERT(kGrPixelConfigCnt == SK_ARRAY_COUNT(configs));
|
|
|
|
|
|
|
|
GrSurfaceDesc desc;
|
|
|
|
desc.fWidth = 64;
|
|
|
|
desc.fHeight = 64;
|
|
|
|
|
|
|
|
for (GrPixelConfig config : configs) {
|
|
|
|
for (GrSurfaceOrigin origin : { kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin }) {
|
|
|
|
desc.fFlags = kNone_GrSurfaceFlags;
|
|
|
|
desc.fOrigin = origin;
|
|
|
|
desc.fConfig = config;
|
2018-02-03 01:32:49 +00:00
|
|
|
desc.fSampleCnt = 1;
|
2017-05-22 17:23:19 +00:00
|
|
|
|
2017-05-24 11:44:02 +00:00
|
|
|
sk_sp<GrSurface> tex = resourceProvider->createTexture(desc, SkBudgeted::kNo);
|
2018-01-29 14:50:47 +00:00
|
|
|
bool ict = caps->isConfigTexturable(desc.fConfig);
|
|
|
|
REPORTER_ASSERT(reporter, SkToBool(tex) == ict,
|
|
|
|
"config:%d, tex:%d, isConfigTexturable:%d", config, SkToBool(tex), ict);
|
2017-05-22 17:23:19 +00:00
|
|
|
|
2018-01-16 13:06:32 +00:00
|
|
|
sk_sp<GrTextureProxy> proxy = proxyProvider->createMipMapProxy(
|
2018-02-09 21:08:30 +00:00
|
|
|
desc, SkBudgeted::kNo);
|
2017-06-02 12:45:06 +00:00
|
|
|
REPORTER_ASSERT(reporter, SkToBool(proxy.get()) ==
|
|
|
|
(caps->isConfigTexturable(desc.fConfig) &&
|
2018-02-05 20:55:54 +00:00
|
|
|
caps->mipMapSupport()));
|
2017-06-02 12:45:06 +00:00
|
|
|
|
2017-05-22 17:23:19 +00:00
|
|
|
desc.fFlags = kRenderTarget_GrSurfaceFlag;
|
2017-05-24 11:44:02 +00:00
|
|
|
tex = resourceProvider->createTexture(desc, SkBudgeted::kNo);
|
2018-02-03 01:32:49 +00:00
|
|
|
bool isRenderable = caps->isConfigRenderable(config);
|
|
|
|
REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
|
|
|
|
"config:%d, tex:%d, isRenderable:%d", config, SkToBool(tex),
|
|
|
|
isRenderable);
|
2017-05-22 17:23:19 +00:00
|
|
|
|
2018-02-03 01:32:49 +00:00
|
|
|
desc.fSampleCnt = 2;
|
2017-05-24 11:44:02 +00:00
|
|
|
tex = resourceProvider->createTexture(desc, SkBudgeted::kNo);
|
2018-02-03 01:32:49 +00:00
|
|
|
isRenderable = SkToBool(caps->getRenderTargetSampleCount(2, config));
|
|
|
|
REPORTER_ASSERT(reporter, SkToBool(tex) == isRenderable,
|
|
|
|
"config:%d, tex:%d, isRenderable:%d", config, SkToBool(tex),
|
|
|
|
isRenderable);
|
2017-05-22 17:23:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-23 20:53:47 +00:00
|
|
|
#include "GrDrawingManager.h"
|
|
|
|
#include "GrSurfaceProxy.h"
|
|
|
|
#include "GrTextureContext.h"
|
|
|
|
|
|
|
|
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(InitialTextureClear, reporter, context_info) {
|
|
|
|
static constexpr int kSize = 100;
|
|
|
|
GrSurfaceDesc desc;
|
|
|
|
desc.fWidth = desc.fHeight = kSize;
|
|
|
|
std::unique_ptr<uint32_t[]> data(new uint32_t[kSize * kSize]);
|
2018-01-16 13:06:32 +00:00
|
|
|
|
2017-05-23 20:53:47 +00:00
|
|
|
GrContext* context = context_info.grContext();
|
2018-01-16 13:06:32 +00:00
|
|
|
GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider();
|
|
|
|
|
2017-05-23 20:53:47 +00:00
|
|
|
for (int c = 0; c <= kLast_GrPixelConfig; ++c) {
|
|
|
|
desc.fConfig = static_cast<GrPixelConfig>(c);
|
2018-02-13 14:25:22 +00:00
|
|
|
sk_sp<SkColorSpace> colorSpace;
|
|
|
|
if (GrPixelConfigIsSRGB(desc.fConfig)) {
|
|
|
|
colorSpace = SkColorSpace::MakeSRGB();
|
|
|
|
}
|
2017-05-23 20:53:47 +00:00
|
|
|
if (!context_info.grContext()->caps()->isConfigTexturable(desc.fConfig)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
desc.fFlags = kPerformInitialClear_GrSurfaceFlag;
|
|
|
|
for (bool rt : {false, true}) {
|
2018-02-03 01:32:49 +00:00
|
|
|
if (rt && !context->caps()->isConfigRenderable(desc.fConfig)) {
|
2017-05-23 20:53:47 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
desc.fFlags |= rt ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlags;
|
2017-09-25 16:26:58 +00:00
|
|
|
for (GrSurfaceOrigin origin :
|
|
|
|
{kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin}) {
|
|
|
|
desc.fOrigin = origin;
|
2018-01-16 13:06:32 +00:00
|
|
|
for (auto fit : { SkBackingFit::kApprox, SkBackingFit::kExact }) {
|
2017-09-25 16:26:58 +00:00
|
|
|
// Try directly creating the texture.
|
|
|
|
// Do this twice in an attempt to hit the cache on the second time through.
|
|
|
|
for (int i = 0; i < 2; ++i) {
|
2018-01-16 13:06:32 +00:00
|
|
|
sk_sp<GrTextureProxy> proxy = proxyProvider->createInstantiatedProxy(
|
|
|
|
desc, fit, SkBudgeted::kYes);
|
|
|
|
if (!proxy) {
|
2017-09-25 16:26:58 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
auto texCtx = context->contextPriv().makeWrappedSurfaceContext(
|
2018-02-13 14:25:22 +00:00
|
|
|
std::move(proxy), colorSpace);
|
2017-09-25 16:26:58 +00:00
|
|
|
SkImageInfo info = SkImageInfo::Make(
|
|
|
|
kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
|
|
|
|
memset(data.get(), 0xAB, kSize * kSize * sizeof(uint32_t));
|
|
|
|
if (texCtx->readPixels(info, data.get(), 0, 0, 0)) {
|
|
|
|
uint32_t cmp = GrPixelConfigIsOpaque(desc.fConfig) ? 0xFF000000 : 0;
|
|
|
|
for (int i = 0; i < kSize * kSize; ++i) {
|
|
|
|
if (cmp != data.get()[i]) {
|
|
|
|
ERRORF(reporter, "Failed on config %d", desc.fConfig);
|
|
|
|
break;
|
2017-05-23 20:53:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-25 16:26:58 +00:00
|
|
|
memset(data.get(), 0xBC, kSize * kSize * sizeof(uint32_t));
|
|
|
|
// Here we overwrite the texture so that the second time through we
|
|
|
|
// test against recycling without reclearing.
|
|
|
|
if (0 == i) {
|
|
|
|
texCtx->writePixels(info, data.get(), 0, 0, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
context->purgeAllUnlockedResources();
|
|
|
|
|
|
|
|
// Try creating the texture as a deferred proxy.
|
|
|
|
for (int i = 0; i < 2; ++i) {
|
|
|
|
auto surfCtx = context->contextPriv().makeDeferredSurfaceContext(
|
2018-02-13 14:25:22 +00:00
|
|
|
desc, GrMipMapped::kNo, fit, SkBudgeted::kYes, colorSpace);
|
2017-09-25 16:26:58 +00:00
|
|
|
if (!surfCtx) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
SkImageInfo info = SkImageInfo::Make(
|
|
|
|
kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
|
|
|
|
memset(data.get(), 0xAB, kSize * kSize * sizeof(uint32_t));
|
|
|
|
if (surfCtx->readPixels(info, data.get(), 0, 0, 0)) {
|
|
|
|
uint32_t cmp = GrPixelConfigIsOpaque(desc.fConfig) ? 0xFF000000 : 0;
|
|
|
|
for (int i = 0; i < kSize * kSize; ++i) {
|
|
|
|
if (cmp != data.get()[i]) {
|
|
|
|
ERRORF(reporter, "Failed on config %d", desc.fConfig);
|
|
|
|
break;
|
2017-05-23 20:53:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-25 16:26:58 +00:00
|
|
|
// Here we overwrite the texture so that the second time through we
|
|
|
|
// test against recycling without reclearing.
|
|
|
|
if (0 == i) {
|
|
|
|
surfCtx->writePixels(info, data.get(), 0, 0, 0);
|
|
|
|
}
|
2017-05-23 20:53:47 +00:00
|
|
|
}
|
2017-09-25 16:26:58 +00:00
|
|
|
context->purgeAllUnlockedResources();
|
2017-05-23 20:53:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-04-09 15:04:12 +00:00
|
|
|
#endif
|