#include "src/gpu/ganesh/GrDrawingManager.h"
#include "include/core/SkData.h"
#include "include/core/SkRect.h"
#include "include/core/SkSize.h"
#include "include/core/SkSurface.h"
#include "include/gpu/GpuTypes.h"
#include "include/gpu/ganesh/GrDirectContext.h"
#include "include/gpu/ganesh/GrRecordingContext.h"
#include "include/gpu/ganesh/GrTypes.h"
#include "include/private/base/SkAssert.h"
#include "include/private/base/SkTo.h"
#include "include/private/chromium/GrDeferredDisplayList.h"
#include "include/private/chromium/GrSurfaceCharacterization.h"
#include "include/private/gpu/ganesh/GrTypesPriv.h"
#include "src/base/SkTInternalLList.h"
#include "src/core/SkTraceEvent.h"
#include "src/gpu/ganesh/GrAuditTrail.h"
#include "src/gpu/ganesh/GrBufferTransferRenderTask.h"
#include "src/gpu/ganesh/GrBufferUpdateRenderTask.h"
#include "src/gpu/ganesh/GrClientMappedBufferManager.h"
#include "src/gpu/ganesh/GrCopyRenderTask.h"
#include "src/gpu/ganesh/GrDDLTask.h"
#include "src/gpu/ganesh/GrDeferredDisplayListPriv.h"
#include "src/gpu/ganesh/GrDirectContextPriv.h"
#include "src/gpu/ganesh/GrGpu.h"
#include "src/gpu/ganesh/GrGpuBuffer.h"
#include "src/gpu/ganesh/GrNativeRect.h"
#include "src/gpu/ganesh/GrOnFlushResourceProvider.h"
#include "src/gpu/ganesh/GrOpFlushState.h"
#include "src/gpu/ganesh/GrRecordingContextPriv.h"
#include "src/gpu/ganesh/GrRenderTargetProxy.h"
#include "src/gpu/ganesh/GrRenderTask.h"
#include "src/gpu/ganesh/GrRenderTaskCluster.h"
#include "src/gpu/ganesh/GrResourceAllocator.h"
#include "src/gpu/ganesh/GrResourceCache.h"
#include "src/gpu/ganesh/GrSurfaceProxyView.h"
#include "src/gpu/ganesh/GrTTopoSort.h"
#include "src/gpu/ganesh/GrTextureProxy.h"
#include "src/gpu/ganesh/GrTextureResolveManager.h"
#include "src/gpu/ganesh/GrTextureResolveRenderTask.h"
#include "src/gpu/ganesh/GrTracing.h"
#include "src/gpu/ganesh/GrTransferFromRenderTask.h"
#include "src/gpu/ganesh/GrWaitRenderTask.h"
#include "src/gpu/ganesh/GrWritePixelsRenderTask.h"
#include "src/gpu/ganesh/ops/GrOp.h"
#include "src/gpu/ganesh/ops/OpsTask.h"
#include "src/gpu/ganesh/ops/SoftwarePathRenderer.h"
#include <algorithm>
#include <memory>
#include <utility>
usingnamespaceskia_private;
GrDrawingManager::GrDrawingManager(GrRecordingContext* rContext,
const PathRendererChain::Options& optionsForPathRendererChain,
bool reduceOpsTaskSplitting)
: … { … }
GrDrawingManager::~GrDrawingManager() { … }
bool GrDrawingManager::wasAbandoned() const { … }
void GrDrawingManager::freeGpuResources() { … }
bool GrDrawingManager::flush(SkSpan<GrSurfaceProxy*> proxies,
SkSurfaces::BackendSurfaceAccess access,
const GrFlushInfo& info,
const skgpu::MutableTextureState* newState) { … }
bool GrDrawingManager::submitToGpu(GrSyncCpu sync) { … }
bool GrDrawingManager::executeRenderTasks(GrOpFlushState* flushState) { … }
void GrDrawingManager::removeRenderTasks() { … }
void GrDrawingManager::sortTasks() { … }
template <typename T>
static void reorder_array_by_llist(const SkTInternalLList<T>& llist, TArray<sk_sp<T>>* array) { … }
bool GrDrawingManager::reorderTasks(GrResourceAllocator* resourceAllocator) { … }
void GrDrawingManager::closeAllTasks() { … }
GrRenderTask* GrDrawingManager::insertTaskBeforeLast(sk_sp<GrRenderTask> task) { … }
GrRenderTask* GrDrawingManager::appendTask(sk_sp<GrRenderTask> task) { … }
static void resolve_and_mipmap(GrGpu* gpu, GrSurfaceProxy* proxy) { … }
GrSemaphoresSubmitted GrDrawingManager::flushSurfaces(SkSpan<GrSurfaceProxy*> proxies,
SkSurfaces::BackendSurfaceAccess access,
const GrFlushInfo& info,
const skgpu::MutableTextureState* newState) { … }
void GrDrawingManager::addOnFlushCallbackObject(GrOnFlushCallbackObject* onFlushCBObject) { … }
#if defined(GPU_TEST_UTILS)
void GrDrawingManager::testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject* cb) {
int n = std::find(fOnFlushCBObjects.begin(), fOnFlushCBObjects.end(), cb) -
fOnFlushCBObjects.begin();
SkASSERT(n < fOnFlushCBObjects.size());
fOnFlushCBObjects.removeShuffle(n);
}
#endif
void GrDrawingManager::setLastRenderTask(const GrSurfaceProxy* proxy, GrRenderTask* task) { … }
GrRenderTask* GrDrawingManager::getLastRenderTask(const GrSurfaceProxy* proxy) const { … }
skgpu::ganesh::OpsTask* GrDrawingManager::getLastOpsTask(const GrSurfaceProxy* proxy) const { … }
void GrDrawingManager::moveRenderTasksToDDL(GrDeferredDisplayList* ddl) { … }
void GrDrawingManager::createDDLTask(sk_sp<const GrDeferredDisplayList> ddl,
sk_sp<GrRenderTargetProxy> newDest) { … }
#ifdef SK_DEBUG
void GrDrawingManager::validate() const { … }
#endif
void GrDrawingManager::closeActiveOpsTask() { … }
sk_sp<skgpu::ganesh::OpsTask> GrDrawingManager::newOpsTask(GrSurfaceProxyView surfaceView,
sk_sp<GrArenas> arenas) { … }
void GrDrawingManager::addAtlasTask(sk_sp<GrRenderTask> atlasTask,
GrRenderTask* previousAtlasTask) { … }
GrTextureResolveRenderTask* GrDrawingManager::newTextureResolveRenderTaskBefore(
const GrCaps& caps) { … }
void GrDrawingManager::newTextureResolveRenderTask(sk_sp<GrSurfaceProxy> proxy,
GrSurfaceProxy::ResolveFlags flags,
const GrCaps& caps) { … }
void GrDrawingManager::newWaitRenderTask(const sk_sp<GrSurfaceProxy>& proxy,
std::unique_ptr<std::unique_ptr<GrSemaphore>[]> semaphores,
int numSemaphores) { … }
void GrDrawingManager::newTransferFromRenderTask(const sk_sp<GrSurfaceProxy>& srcProxy,
const SkIRect& srcRect,
GrColorType surfaceColorType,
GrColorType dstColorType,
sk_sp<GrGpuBuffer> dstBuffer,
size_t dstOffset) { … }
void GrDrawingManager::newBufferTransferTask(sk_sp<GrGpuBuffer> src,
size_t srcOffset,
sk_sp<GrGpuBuffer> dst,
size_t dstOffset,
size_t size) { … }
void GrDrawingManager::newBufferUpdateTask(sk_sp<SkData> src,
sk_sp<GrGpuBuffer> dst,
size_t dstOffset) { … }
sk_sp<GrRenderTask> GrDrawingManager::newCopyRenderTask(sk_sp<GrSurfaceProxy> dst,
SkIRect dstRect,
const sk_sp<GrSurfaceProxy>& src,
SkIRect srcRect,
GrSamplerState::Filter filter,
GrSurfaceOrigin origin) { … }
bool GrDrawingManager::newWritePixelsTask(sk_sp<GrSurfaceProxy> dst,
SkIRect rect,
GrColorType srcColorType,
GrColorType dstColorType,
const GrMipLevel levels[],
int levelCount) { … }
skgpu::ganesh::PathRenderer* GrDrawingManager::getPathRenderer(
const PathRenderer::CanDrawPathArgs& args,
bool allowSW,
PathRendererChain::DrawType drawType,
PathRenderer::StencilSupport* stencilSupport) { … }
skgpu::ganesh::PathRenderer* GrDrawingManager::getSoftwarePathRenderer() { … }
skgpu::ganesh::AtlasPathRenderer* GrDrawingManager::getAtlasPathRenderer() { … }
skgpu::ganesh::PathRenderer* GrDrawingManager::getTessellationPathRenderer() { … }
void GrDrawingManager::flushIfNecessary() { … }