57#define ASSERT_SINGLE_OWNER SKGPU_ASSERT_SINGLE_OWNER(this->singleOwner())
58#define ASSERT_SINGLE_OWNER_PRIV SKGPU_ASSERT_SINGLE_OWNER(fRecorder->singleOwner())
89 static std::atomic<uint32_t> nextID{1};
92 id = nextID.fetch_add(1, std::memory_order_relaxed);
100 : fSharedContext(
std::move(sharedContext))
101 , fRuntimeEffectDict(
std::make_unique<RuntimeEffectDictionary>())
102 , fRootTaskList(new TaskList)
105 , fProxyReadCounts(new ProxyReadCountMap)
107 , fAtlasProvider(
std::make_unique<AtlasProvider>(this))
111 fClientImageProvider =
options.fImageProvider;
112 if (!fClientImageProvider) {
117 fOwnedResourceProvider =
nullptr;
118 fResourceProvider = context->priv().resourceProvider();
120 fOwnedResourceProvider = fSharedContext->makeResourceProvider(this->singleOwner(),
123 fResourceProvider = fOwnedResourceProvider.get();
125 fUploadBufferManager = std::make_unique<UploadBufferManager>(fResourceProvider,
126 fSharedContext->caps());
127 fDrawBufferManager = std::make_unique<DrawBufferManager>(fResourceProvider,
128 fSharedContext->caps(),
129 fUploadBufferManager.get());
137 for (
int i = 0;
i < fFinishedProcs.size(); ++
i) {
138 fFinishedProcs[
i]->setFailureResult();
141 for (
auto&
device : fTrackedDevices) {
144 device->abandonRecorder();
147#if defined(GRAPHITE_TEST_UTILS)
149 fContext->priv().deregisterRecorder(
this);
154 fStrikeCache->freeAll();
162 this->
priv().flushTrackedDevices();
164 std::unordered_set<sk_sp<TextureProxy>, Recording::ProxyHash> nonVolatileLazyProxies;
165 std::unordered_set<sk_sp<TextureProxy>, Recording::ProxyHash> volatileLazyProxies;
170 if (tex.first->isLazy()) {
171 if (tex.first->isVolatile()) {
172 volatileLazyProxies.insert(tex.first);
174 nonVolatileLazyProxies.insert(tex.first);
180 std::unique_ptr<Recording::LazyProxyData> targetProxyData;
181 if (fTargetProxyData) {
182 targetProxyData = std::move(fTargetProxyData);
183 fTargetProxyDevice.reset();
184 fTargetProxyCanvas.reset();
189 ScratchResourceManager scratchManager{fResourceProvider, std::move(fProxyReadCounts)};
190 fProxyReadCounts = std::make_unique<ProxyReadCountMap>();
195 if (fDrawBufferManager->hasMappingFailed() ||
196 fRootTaskList->prepareResources(fResourceProvider,
201 fDrawBufferManager = std::make_unique<DrawBufferManager>(fResourceProvider,
202 fSharedContext->caps(),
203 fUploadBufferManager.get());
204 fTextureDataCache = std::make_unique<TextureDataCache>();
205 fUniformDataCache = std::make_unique<UniformDataCache>();
206 fRootTaskList->reset();
207 fRuntimeEffectDict->reset();
211 std::unique_ptr<Recording> recording(
new Recording(fNextRecordingID++,
213 std::move(nonVolatileLazyProxies),
214 std::move(volatileLazyProxies),
215 std::move(targetProxyData),
216 std::move(fFinishedProcs)));
220 fDrawBufferManager->transferToRecording(recording.get());
221 fUploadBufferManager->transferToRecording(recording.get());
222 recording->priv().addTasks(std::move(*fRootTaskList));
224 SkASSERT(!fRootTaskList->hasTasks());
225 fRuntimeEffectDict->reset();
226 fTextureDataCache = std::make_unique<TextureDataCache>();
227 fUniformDataCache = std::make_unique<UniformDataCache>();
228 if (!this->
priv().caps()->requireOrderedRecordings()) {
229 fAtlasProvider->textAtlasManager()->evictAtlases();
239 SKGPU_LOG_W(
"Requested a deferred canvas with mipmapping; this is not supported");
243 if (fTargetProxyCanvas) {
245 SKGPU_LOG_W(
"Requested a new deferred canvas before snapping the previous one");
249 fTargetProxyData = std::make_unique<Recording::LazyProxyData>(textureInfo);
253 fTargetProxyData->refLazyProxy(),
258 fTargetProxyCanvas = std::make_unique<SkCanvas>(fTargetProxyDevice);
259 return fTargetProxyCanvas.get();
270 fTrackedDevices.emplace_back(std::move(
device));
273void Recorder::deregisterDevice(
const Device*
device) {
275 for (
int i = 0;
i < fTrackedDevices.size(); ++
i) {
278 fTrackedDevices[
i] =
nullptr;
287 if (!
info.isValid() ||
info.backend() != this->backend()) {
293#ifdef SK_BUILD_FOR_ANDROID
297 bool isProtectedContent,
299 bool fromAndroidWindow)
const {
301 SKGPU_LOG_W(
"Creating an AHardwareBuffer-backed BackendTexture is only supported with the"
319 if (!backendTex.
isValid() || backendTex.
backend() != this->backend()) {
323 if (!srcData || numLevels <= 0) {
328 int numExpectedLevels = 1;
333 if (numLevels != numExpectedLevels) {
339 if (!this->
priv().caps()->areColorTypeAndTextureInfoCompatible(ct, backendTex.
info())) {
350 std::vector<MipLevel> mipLevels;
351 mipLevels.resize(numLevels);
353 for (
int i = 0;
i < numLevels; ++
i) {
357 mipLevels[
i].fPixels = srcData[
i].
addr();
358 mipLevels[
i].fRowBytes = srcData[
i].
rowBytes();
366 colorInfo, colorInfo,
369 std::make_unique<ImageUploadContext>());
371 SKGPU_LOG_E(
"Recorder::updateBackendTexture: Could not create UploadInstance");
379 this->
priv().
add(std::move(uploadTask));
389 if (!backendTex.
isValid() || backendTex.
backend() != this->backend()) {
410 SKGPU_LOG_E(
"Recorder::updateBackendTexture: Could not create UploadInstance");
418 this->
priv().
add(std::move(uploadTask));
433 if (
info.fFinishedProc) {
436 fFinishedProcs.push_back(std::move(
callback));
451 fAtlasProvider->clearTexturePool();
459 auto purgeTime = skgpu::StdSteadyClock::now() - msNotUsed;
482 fRecorder->fProxyReadCounts->increment(proxy);
487 fRecorder->fRootTaskList->add(std::move(task));
505 const int startingIndex = fRecorder->fFlushingDevicesIndex;
506 while (fRecorder->fFlushingDevicesIndex < fRecorder->fTrackedDevices.size() - 1) {
509 fRecorder->fFlushingDevicesIndex++;
512 Device*
device = fRecorder->fTrackedDevices[fRecorder->fFlushingDevicesIndex].get();
514 device->flushPendingWorkToRecorder();
523 if (startingIndex < 0) {
527 while (i < fRecorder->fTrackedDevices.size()) {
531 device->abandonRecorder();
533 fRecorder->fTrackedDevices.removeShuffle(
i);
540 fRecorder->fFlushingDevicesIndex = -1;
546 std::string_view label) {
561#if defined(GRAPHITE_TEST_UTILS)
562bool RecorderPriv::deviceIsRegistered(
Device*
device)
const {
564 for (
const sk_sp<Device>& currentDevice : fRecorder->fTrackedDevices) {
573void RecorderPriv::setContext(
Context* context) {
574 fRecorder->fContext = context;
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
struct AHardwareBuffer AHardwareBuffer
#define SKGPU_LOG_E(fmt,...)
#define SKGPU_LOG_W(fmt,...)
#define ASSERT_SINGLE_OWNER
#define ASSERT_SINGLE_OWNER_PRIV
static SkImage_Base * as_IB(SkImage *image)
sk_sp< T > sk_ref_sp(T *obj)
static constexpr uint32_t SK_InvalidGenID
static int ComputeLevelCount(int baseWidth, int baseHeight)
SkColorType colorType() const
const SkImageInfo & info() const
const void * addr() const
static sk_sp< RefCntedCallback > Make(Callback proc, Context ctx)
const TextureInfo & info() const
BackendApi backend() const
SkISize dimensions() const
sk_sp< SkImage > findOrCreate(Recorder *recorder, const SkImage *image, SkImage::RequiredProperties) override
static sk_sp< DefaultImageProvider > Make()
static sk_sp< Device > Make(Recorder *recorder, sk_sp< TextureProxy >, SkISize deviceSize, const SkColorInfo &, const SkSurfaceProps &, LoadOp initialLoadOp, bool registerWithRecorder=true)
sk_sp< TextureProxy > findOrCreateCachedProxy(Recorder *, const SkBitmap &, std::string_view label)
void addPendingRead(const TextureProxy *)
TokenTracker * tokenTracker()
size_t getResourceCacheLimit() const
ProxyCache * proxyCache()
ResourceProvider * resourceProvider()
static sk_sp< TextureProxy > CreateCachedProxy(Recorder *, const SkBitmap &, std::string_view label)
void flushTrackedDevices()
SkCanvas * makeDeferredCanvas(const SkImageInfo &, const TextureInfo &)
size_t currentBudgetedBytes() const
BackendApi backend() const
void dumpMemoryStatistics(SkTraceMemoryDump *traceMemoryDump) const
void performDeferredCleanup(std::chrono::milliseconds msNotUsed)
void deleteBackendTexture(const BackendTexture &)
bool updateCompressedBackendTexture(const BackendTexture &, const void *data, size_t dataSize)
size_t maxBudgetedBytes() const
BackendTexture createBackendTexture(SkISize dimensions, const TextureInfo &)
void addFinishInfo(const InsertFinishInfo &)
std::unique_ptr< Recording > snap()
bool updateBackendTexture(const BackendTexture &, const SkPixmap srcData[], int numLevels)
Recorder(const Recorder &)=delete
void purgeResourcesNotUsedSince(StdSteadyClock::time_point purgeTime)
sk_sp< Texture > createWrappedTexture(const BackendTexture &, std::string_view label)
BackendTexture createBackendTexture(SkISize dimensions, const TextureInfo &)
void deleteBackendTexture(const BackendTexture &)
size_t getResourceCacheLimit() const
size_t getResourceCacheCurrentBudgetedBytes() const
void dumpMemoryStatistics(SkTraceMemoryDump *traceMemoryDump) const
std::pair< sk_sp< TextureProxy >, SamplerDesc > SampledTexture
const SampledTexture & texture(int index) const
Mipmapped mipmapped() const
static sk_sp< TextureProxy > Wrap(sk_sp< Texture >)
static UploadInstance MakeCompressed(Recorder *, sk_sp< TextureProxy > targetProxy, const void *data, size_t dataSize)
static UploadInstance Make(Recorder *, sk_sp< TextureProxy > targetProxy, const SkColorInfo &srcColorInfo, const SkColorInfo &dstColorInfo, SkSpan< const MipLevel > levels, const SkIRect &dstRect, std::unique_ptr< ConditionalUploadContext >)
static sk_sp< UploadTask > Make(UploadList *)
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
FlPixelBufferTexturePrivate * priv
sk_sp< const SkImage > image
const myers::Point & get(const myers::Segment &)
PipelineDataCache< UniformDataBlock > UniformDataCache
static uint32_t next_id()
PipelineDataCache< TextureDataBlock > TextureDataCache
static constexpr SkIRect MakeSize(const SkISize &size)
constexpr int32_t width() const
constexpr int32_t height() const
const SkColorInfo & colorInfo() const
SkISize dimensions() const
std::shared_ptr< const fml::Mapping > data
#define TRACE_EVENT0(category_group, name)