| /* | |
| * Copyright 2022 Google LLC. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef skgpu_MutableTextureState_DEFINED | |
| #define skgpu_MutableTextureState_DEFINED | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/core/SkTypes.h" | |
| #include "include/private/base/SkAnySubclass.h" | |
| #include <cstddef> | |
| namespace skgpu { | |
| enum class BackendApi : unsigned int; | |
| class MutableTextureStateData; | |
| /** | |
| * Since Skia and clients can both modify gpu textures and their connected state, Skia needs a way | |
| * for clients to inform us if they have modifiend any of this state. In order to not need setters | |
| * for every single API and state, we use this class to be a generic wrapper around all the mutable | |
| * state. This class is used for calls that inform Skia of these texture/image state changes by the | |
| * client as well as for requesting state changes to be done by Skia. The backend specific state | |
| * that is wrapped by this class are located in files like: | |
| * - include/gpu/vk/VulkanMutableTextureState.h | |
| */ | |
| class SK_API MutableTextureState : public SkRefCnt { | |
| public: | |
| MutableTextureState(); | |
| ~MutableTextureState() override; | |
| MutableTextureState(const MutableTextureState& that); | |
| MutableTextureState& operator=(const MutableTextureState& that); | |
| void set(const MutableTextureState& that); | |
| BackendApi backend() const { return fBackend; } | |
| // Returns true if the backend mutable state has been initialized. | |
| bool isValid() const { return fIsValid; } | |
| private: | |
| friend class MutableTextureStateData; | |
| friend class MutableTextureStatePriv; | |
| // Size determined by looking at the MutableTextureStateData subclasses, then | |
| // guessing-and-checking. Compiler will complain if this is too small - in that case, | |
| // just increase the number. | |
| inline constexpr static size_t kMaxSubclassSize = 16; | |
| using AnyStateData = SkAnySubclass<MutableTextureStateData, kMaxSubclassSize>; | |
| template <typename StateData> | |
| MutableTextureState(BackendApi api, const StateData& data) : fBackend(api), fIsValid(true) { | |
| fStateData.emplace<StateData>(data); | |
| } | |
| AnyStateData fStateData; | |
| BackendApi fBackend; | |
| bool fIsValid; | |
| }; | |
| } // namespace skgpu | |
| #endif // skgpu_MutableTextureState_DEFINED |