blob: b10e8ad6057373894388b0e7aec0951733d9f86b [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_GraphiteTypes_DEFINED
#define skgpu_graphite_GraphiteTypes_DEFINED
#include "include/core/SkPoint.h"
#include "include/core/SkTypes.h"
#include "include/gpu/GpuTypes.h"
#include <memory>
class SkSurface;
namespace skgpu {
class MutableTextureState;
}
namespace skgpu::graphite {
class BackendSemaphore;
class Recording;
class Task;
using GpuFinishedContext = void*;
using GpuFinishedProc = void (*)(GpuFinishedContext finishedContext, CallbackResult);
/**
* The fFinishedProc is called when the Recording has been submitted and finished on the GPU, or
* when there is a failure that caused it not to be submitted. The callback will always be called
* and the caller can use the callback to know it is safe to free any resources associated with
* the Recording that they may be holding onto. If the Recording is successfully submitted to the
* GPU the callback will be called with CallbackResult::kSuccess once the GPU has finished. All
* other cases where some failure occured it will be called with CallbackResult::kFailed.
*
* The fTargetSurface, if provided, is used as a target for any draws recorded onto a deferred
* canvas returned from Recorder::makeDeferredCanvas. This target surface must be provided iff
* the Recording contains any such draws. It must be Graphite-backed and its backing texture's
* TextureInfo must match the info provided to the Recorder when making the deferred canvas.
*
* fTargetTranslation is an additional translation applied to draws targeting fTargetSurface.
*
* The client may pass in two arrays of initialized BackendSemaphores to be included in the
* command stream. At some time before issuing commands in the Recording, the fWaitSemaphores will
* be waited on by the gpu. We only guarantee these wait semaphores block transfer and fragment
* shader work. Similarly, at some time after issuing the Recording's commands, the
* fSignalSemaphores will be signaled by the gpu. Depending on the platform, the timing of the wait
* and signal operations will either be immediately before or after the given Recording's command
* stream, respectively, or before and after the entire CommandBuffer's command stream. The
* semaphores are not sent to the GPU until the next Context::submit call is made.
*
* The client will own and be responsible for deleting the underlying semaphore objects after the
* submission completes, however the BackendSemaphore objects themselves can be deleted as soon
* as this function returns.
*/
struct InsertRecordingInfo {
Recording* fRecording = nullptr;
SkSurface* fTargetSurface = nullptr;
SkIVector fTargetTranslation = {0, 0};
MutableTextureState* fTargetTextureState = nullptr;
size_t fNumWaitSemaphores = 0;
BackendSemaphore* fWaitSemaphores = nullptr;
size_t fNumSignalSemaphores = 0;
BackendSemaphore* fSignalSemaphores = nullptr;
GpuFinishedContext fFinishedContext = nullptr;
GpuFinishedProc fFinishedProc = nullptr;
};
/**
* The fFinishedProc is called when the Recording has been submitted and finished on the GPU, or
* when there is a failure that caused it not to be submitted. The callback will always be called
* and the caller can use the callback to know it is safe to free any resources associated with
* the Recording that they may be holding onto. If the Recording is successfully submitted to the
* GPU the callback will be called with CallbackResult::kSuccess once the GPU has finished. All
* other cases where some failure occured it will be called with CallbackResult::kFailed.
*/
struct InsertFinishInfo {
GpuFinishedContext fFinishedContext = nullptr;
GpuFinishedProc fFinishedProc = nullptr;
};
/**
* Actually submit work to the GPU and track its completion
*/
enum class SyncToCpu : bool {
kYes = true,
kNo = false
};
/*
* For Promise Images - should the Promise Image be fulfilled every time a Recording that references
* it is inserted into the Context.
*/
enum class Volatile : bool {
kNo = false, // only fulfilled once
kYes = true // fulfilled on every insertion call
};
enum class DepthStencilFlags : int {
kNone = 0b000,
kDepth = 0b001,
kStencil = 0b010,
kDepthStencil = kDepth | kStencil,
};
/*
* This enum allows mapping from a set of observed RenderSteps (e.g., from a GraphicsPipeline
* printout) to the correct 'drawTypes' parameter needed by the Precompilation API.
*/
enum DrawTypeFlags : uint16_t {
kNone = 0b000000000,
// kBitmapText_Mask should be used for the BitmapTextRenderStep[mask] RenderStep
kBitmapText_Mask = 0b00000001,
// kBitmapText_LCD should be used for the BitmapTextRenderStep[LCD] RenderStep
kBitmapText_LCD = 0b00000010,
// kBitmapText_Color should be used for the BitmapTextRenderStep[color] RenderStep
kBitmapText_Color = 0b00000100,
// kSDFText should be used for the SDFTextRenderStep RenderStep
kSDFText = 0b00001000,
// kSDFText_LCD should be used for the SDFTextLCDRenderStep RenderStep
kSDFText_LCD = 0b00010000,
// kDrawVertices should be used to generate Pipelines that use the following RenderSteps:
// VerticesRenderStep[*] for:
// [tris], [tris-texCoords], [tris-color], [tris-color-texCoords],
// [tristrips], [tristrips-texCoords], [tristrips-color], [tristrips-color-texCoords]
kDrawVertices = 0b00100000,
// kSimpleShape should be used to generate Pipelines that use the following RenderSteps:
// AnalyticBlurRenderStep
// AnalyticRRectRenderStep
// PerEdgeAAQuadRenderStep
// CoverBoundsRenderStep[non-aa-fill]
kSimpleShape = 0b01000000,
// kNonSimpleShape should be used to generate Pipelines that use the following RenderSteps:
// CoverageMaskRenderStep
// CoverBoundsRenderStep[*] for [inverse-cover], [regular-cover]
// TessellateStrokeRenderStep
// TessellateWedgesRenderStep[*] for [convex], [evenodd], [winding]
// TessellateCurvesRenderStep[*] for [even-odd], [winding]
// MiddleOutFanRenderStep[*] for [even-odd], [winding]
kNonSimpleShape = 0b10000000,
kLast = kNonSimpleShape,
};
static constexpr int kDrawTypeFlagsCnt = static_cast<int>(DrawTypeFlags::kLast) + 1;
} // namespace skgpu::graphite
#endif // skgpu_graphite_GraphiteTypes_DEFINED