8fd61eea0d
This also adds support for making a Resources unbudgeted state when it is pulled out of the cache to be used for an SkImage or Surface. It then puts the resources back as budgeted when returned to the cache. Bug: skia:12754 Change-Id: I469ace602aa6f5f708b82655e94557ff8ad45a72 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/538046 Reviewed-by: Jim Van Verth <jvanverth@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
60 lines
2.5 KiB
C++
60 lines
2.5 KiB
C++
/*
|
|
* Copyright 2022 Google LLC
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "tests/Test.h"
|
|
|
|
#include "include/gpu/graphite/Context.h"
|
|
#include "include/gpu/graphite/Recorder.h"
|
|
#include "src/gpu/graphite/Device.h"
|
|
|
|
using namespace skgpu::graphite;
|
|
|
|
// Tests to make sure the managing of back pointers between Recorder and Device all work properly.
|
|
DEF_GRAPHITE_TEST_FOR_CONTEXTS(RecorderDevicePtrTest, reporter, context) {
|
|
std::unique_ptr<Recorder> recorder = context->makeRecorder();
|
|
|
|
SkImageInfo info = SkImageInfo::Make({16, 16}, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
|
|
|
|
sk_sp<Device> device1 = Device::Make(recorder.get(), info, SkBudgeted::kYes);
|
|
|
|
REPORTER_ASSERT(reporter, device1->recorder() == recorder.get());
|
|
REPORTER_ASSERT(reporter, recorder->deviceIsRegistered(device1.get()));
|
|
|
|
Device* devPtr = device1.get();
|
|
device1.reset();
|
|
REPORTER_ASSERT(reporter, !recorder->deviceIsRegistered(devPtr));
|
|
|
|
// Test adding multiple devices
|
|
device1 = Device::Make(recorder.get(), info, SkBudgeted::kYes);
|
|
sk_sp<Device> device2 = Device::Make(recorder.get(), info, SkBudgeted::kYes);
|
|
sk_sp<Device> device3 = Device::Make(recorder.get(), info, SkBudgeted::kYes);
|
|
REPORTER_ASSERT(reporter, device1->recorder() == recorder.get());
|
|
REPORTER_ASSERT(reporter, device2->recorder() == recorder.get());
|
|
REPORTER_ASSERT(reporter, device3->recorder() == recorder.get());
|
|
REPORTER_ASSERT(reporter, recorder->deviceIsRegistered(device1.get()));
|
|
REPORTER_ASSERT(reporter, recorder->deviceIsRegistered(device2.get()));
|
|
REPORTER_ASSERT(reporter, recorder->deviceIsRegistered(device3.get()));
|
|
|
|
// Test freeing a device in the middle.
|
|
devPtr = device2.get();
|
|
device2.reset();
|
|
REPORTER_ASSERT(reporter, recorder->deviceIsRegistered(device1.get()));
|
|
REPORTER_ASSERT(reporter, !recorder->deviceIsRegistered(devPtr));
|
|
REPORTER_ASSERT(reporter, recorder->deviceIsRegistered(device3.get()));
|
|
|
|
// Delete the recorder and make sure remaining devices not longer have a valid recorder.
|
|
recorder.reset();
|
|
REPORTER_ASSERT(reporter, device1->recorder() == nullptr);
|
|
REPORTER_ASSERT(reporter, device3->recorder() == nullptr);
|
|
|
|
// Make sure freeing Devices after recorder doesn't cause any crash. This would get checked
|
|
// naturually when these devices go out of scope, but manually reseting will give us a better
|
|
// stack trace if something does go wrong.
|
|
device1.reset();
|
|
device3.reset();
|
|
}
|