blob: cf4395f441d6fa6873a38897d92ccbbc484e7036 [file] [log] [blame]
/*
* 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_graphite_TextureProxyView_DEFINED
#define skgpu_graphite_TextureProxyView_DEFINED
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/gpu/graphite/GraphiteTypes.h"
#include "src/gpu/Swizzle.h"
#include "src/gpu/graphite/TextureProxy.h"
enum class SkBackingFit;
namespace skgpu::graphite {
class Recorder;
class TextureProxyView {
public:
TextureProxyView() = default;
TextureProxyView(sk_sp<TextureProxy> proxy, Swizzle swizzle)
: fProxy(std::move(proxy)), fSwizzle(swizzle) {}
TextureProxyView(sk_sp<TextureProxy> proxy, Swizzle swizzle, Origin origin)
: fProxy(std::move(proxy)), fSwizzle(swizzle), fOrigin(origin) {}
// This entry point is used when we don't care about the swizzle and assume TopLeft origin.
explicit TextureProxyView(sk_sp<TextureProxy> proxy)
: fProxy(std::move(proxy)) {}
TextureProxyView(TextureProxyView&& view) = default;
TextureProxyView(const TextureProxyView&) = default;
explicit operator bool() const { return SkToBool(fProxy.get()); }
TextureProxyView& operator=(const TextureProxyView&) = default;
TextureProxyView& operator=(TextureProxyView&& view) = default;
bool operator==(const TextureProxyView& view) const {
return fProxy == view.fProxy &&
fSwizzle == view.fSwizzle &&
fOrigin == view.fOrigin;
}
bool operator!=(const TextureProxyView& other) const { return !(*this == other); }
int width() const { return this->proxy()->dimensions().width(); }
int height() const { return this->proxy()->dimensions().height(); }
SkISize dimensions() const { return this->proxy()->dimensions(); }
skgpu::Mipmapped mipmapped() const {
if (const TextureProxy* proxy = this->proxy()) {
return proxy->mipmapped();
}
return skgpu::Mipmapped::kNo;
}
TextureProxy* proxy() const { return fProxy.get(); }
sk_sp<TextureProxy> refProxy() const { return fProxy; }
Swizzle swizzle() const { return fSwizzle; }
Origin origin() const { return fOrigin; }
void concatSwizzle(Swizzle swizzle) {
fSwizzle = skgpu::Swizzle::Concat(fSwizzle, swizzle);
}
// makeSwizzle returns a new view with 'swizzle' composed on to this view's existing swizzle
TextureProxyView makeSwizzle(Swizzle swizzle) const & {
return {fProxy, Swizzle::Concat(fSwizzle, swizzle), fOrigin};
}
TextureProxyView makeSwizzle(Swizzle swizzle) && {
return {std::move(fProxy), Swizzle::Concat(fSwizzle, swizzle), fOrigin};
}
// resetSwizzle returns a new view that uses 'swizzle' and disregards this view's prior swizzle.
TextureProxyView replaceSwizzle(Swizzle swizzle) const {
return {fProxy, swizzle, fOrigin};
}
void reset() {
*this = {};
}
// This does not reset the swizzle, so the View can still be used to access those
// properties associated with the detached proxy.
sk_sp<TextureProxy> detachProxy() {
return std::move(fProxy);
}
private:
sk_sp<TextureProxy> fProxy;
Swizzle fSwizzle;
Origin fOrigin = Origin::kTopLeft;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_TextureProxyView_DEFINED