blob: 0faf59d5e8f0e8b674b4bfa520207be2f5161450 [file] [log] [blame]
/*
* Copyright 2023 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef DisplayParams_DEFINED
#define DisplayParams_DEFINED
#include "include/core/SkColorSpace.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkSurfaceProps.h"
#include "include/gpu/ganesh/GrContextOptions.h"
#include "src/base/SkMathPriv.h"
#include <memory>
namespace skwindow {
struct GraphiteTestOptions;
// DisplayParams should be treated as a immutable object once created.
class DisplayParams {
public:
DisplayParams()
: fColorType(kN32_SkColorType)
, fColorSpace(nullptr)
, fMSAASampleCount(1)
, fSurfaceProps(0, kRGB_H_SkPixelGeometry)
, fDisableVsync(false)
, fDelayDrawableAcquisition(false)
, fCreateProtectedNativeBackend(false)
{}
DisplayParams(const DisplayParams* other) {
SkASSERT(other);
fColorType = other->fColorType;
fColorSpace = other->fColorSpace;
fMSAASampleCount = other->fMSAASampleCount;
fGrContextOptions = other->fGrContextOptions;
fSurfaceProps = other->fSurfaceProps;
fDisableVsync = other->fDisableVsync;
fDelayDrawableAcquisition = other->fDelayDrawableAcquisition;
fCreateProtectedNativeBackend = other->fCreateProtectedNativeBackend;
}
DisplayParams(const DisplayParams& other) : DisplayParams(&other) {}
virtual ~DisplayParams() = default;
virtual std::unique_ptr<DisplayParams> clone() const {
return std::make_unique<DisplayParams>(*this);
}
SkColorType colorType() const { return fColorType; }
sk_sp<SkColorSpace> colorSpace() const { return fColorSpace; }
int msaaSampleCount() const { return fMSAASampleCount; }
const GrContextOptions& grContextOptions() const { return fGrContextOptions; }
const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
bool disableVsync() const { return fDisableVsync; }
bool delayDrawableAcquisition() const { return fDelayDrawableAcquisition; }
bool createProtectedNativeBackend() const { return fCreateProtectedNativeBackend; }
virtual const GraphiteTestOptions* graphiteTestOptions() const { return nullptr; }
private:
friend class DisplayParamsBuilder;
SkColorType fColorType;
sk_sp<SkColorSpace> fColorSpace;
int fMSAASampleCount;
GrContextOptions fGrContextOptions;
SkSurfaceProps fSurfaceProps;
bool fDisableVsync;
bool fDelayDrawableAcquisition;
bool fCreateProtectedNativeBackend = false;
};
class DisplayParamsBuilder {
public:
DisplayParamsBuilder() : fDisplayParams(std::make_unique<DisplayParams>()) {}
// Call clone() in case other is a subclass of DisplayParams
DisplayParamsBuilder(const DisplayParams* other) : fDisplayParams(other->clone()) {}
DisplayParamsBuilder& colorType(SkColorType colorType) {
fDisplayParams->fColorType = colorType;
return *this;
}
DisplayParamsBuilder& colorSpace(const sk_sp<SkColorSpace>& colorSpace) {
fDisplayParams->fColorSpace = colorSpace;
return *this;
}
DisplayParamsBuilder& msaaSampleCount(int MSAASampleCount) {
fDisplayParams->fMSAASampleCount = MSAASampleCount;
return *this;
}
DisplayParamsBuilder& roundUpMSAA() {
// SkNextPow2 is undefined for 0, so handle that ourselves.
if (fDisplayParams->fMSAASampleCount <= 1) {
fDisplayParams->fMSAASampleCount = 1;
} else {
fDisplayParams->fMSAASampleCount = SkNextPow2(fDisplayParams->fMSAASampleCount);
}
return *this;
}
DisplayParamsBuilder& grContextOptions(const GrContextOptions& grContextOptions) {
fDisplayParams->fGrContextOptions = grContextOptions;
return *this;
}
DisplayParamsBuilder& surfaceProps(const SkSurfaceProps& surfaceProps) {
fDisplayParams->fSurfaceProps = surfaceProps;
return *this;
}
DisplayParamsBuilder& disableVsync(bool disableVsync) {
fDisplayParams->fDisableVsync = disableVsync;
return *this;
}
DisplayParamsBuilder& delayDrawableAcquisition(bool delayDrawableAcquisition) {
fDisplayParams->fDelayDrawableAcquisition = delayDrawableAcquisition;
return *this;
}
DisplayParamsBuilder& createProtectedNativeBackend(bool createProtectedNativeBackend) {
fDisplayParams->fCreateProtectedNativeBackend = createProtectedNativeBackend;
return *this;
}
std::unique_ptr<DisplayParams> build() { return std::move(fDisplayParams); }
protected:
DisplayParamsBuilder(std::unique_ptr<DisplayParams> other) : fDisplayParams(std::move(other)) {}
std::unique_ptr<DisplayParams> fDisplayParams;
};
} // namespace skwindow
#endif