1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef DisplayParams_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define DisplayParams_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkMathPriv.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace skwindow { 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker struct GraphiteTestOptions; 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker // DisplayParams should be treated as a immutable object once created. 23*c8dee2aaSAndroid Build Coastguard Worker class DisplayParams { 24*c8dee2aaSAndroid Build Coastguard Worker public: DisplayParams()25*c8dee2aaSAndroid Build Coastguard Worker DisplayParams() 26*c8dee2aaSAndroid Build Coastguard Worker : fColorType(kN32_SkColorType) 27*c8dee2aaSAndroid Build Coastguard Worker , fColorSpace(nullptr) 28*c8dee2aaSAndroid Build Coastguard Worker , fMSAASampleCount(1) 29*c8dee2aaSAndroid Build Coastguard Worker , fSurfaceProps(0, kRGB_H_SkPixelGeometry) 30*c8dee2aaSAndroid Build Coastguard Worker , fDisableVsync(false) 31*c8dee2aaSAndroid Build Coastguard Worker , fDelayDrawableAcquisition(false) 32*c8dee2aaSAndroid Build Coastguard Worker , fCreateProtectedNativeBackend(false) 33*c8dee2aaSAndroid Build Coastguard Worker {} 34*c8dee2aaSAndroid Build Coastguard Worker DisplayParams(const DisplayParams * other)35*c8dee2aaSAndroid Build Coastguard Worker DisplayParams(const DisplayParams* other) { 36*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(other); 37*c8dee2aaSAndroid Build Coastguard Worker fColorType = other->fColorType; 38*c8dee2aaSAndroid Build Coastguard Worker fColorSpace = other->fColorSpace; 39*c8dee2aaSAndroid Build Coastguard Worker fMSAASampleCount = other->fMSAASampleCount; 40*c8dee2aaSAndroid Build Coastguard Worker fGrContextOptions = other->fGrContextOptions; 41*c8dee2aaSAndroid Build Coastguard Worker fSurfaceProps = other->fSurfaceProps; 42*c8dee2aaSAndroid Build Coastguard Worker fDisableVsync = other->fDisableVsync; 43*c8dee2aaSAndroid Build Coastguard Worker fDelayDrawableAcquisition = other->fDelayDrawableAcquisition; 44*c8dee2aaSAndroid Build Coastguard Worker fCreateProtectedNativeBackend = other->fCreateProtectedNativeBackend; 45*c8dee2aaSAndroid Build Coastguard Worker } DisplayParams(const DisplayParams & other)46*c8dee2aaSAndroid Build Coastguard Worker DisplayParams(const DisplayParams& other) : DisplayParams(&other) {} 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker virtual ~DisplayParams() = default; 49*c8dee2aaSAndroid Build Coastguard Worker clone()50*c8dee2aaSAndroid Build Coastguard Worker virtual std::unique_ptr<DisplayParams> clone() const { 51*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<DisplayParams>(*this); 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker colorType()54*c8dee2aaSAndroid Build Coastguard Worker SkColorType colorType() const { return fColorType; } colorSpace()55*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> colorSpace() const { return fColorSpace; } msaaSampleCount()56*c8dee2aaSAndroid Build Coastguard Worker int msaaSampleCount() const { return fMSAASampleCount; } grContextOptions()57*c8dee2aaSAndroid Build Coastguard Worker const GrContextOptions& grContextOptions() const { return fGrContextOptions; } surfaceProps()58*c8dee2aaSAndroid Build Coastguard Worker const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; } disableVsync()59*c8dee2aaSAndroid Build Coastguard Worker bool disableVsync() const { return fDisableVsync; } delayDrawableAcquisition()60*c8dee2aaSAndroid Build Coastguard Worker bool delayDrawableAcquisition() const { return fDelayDrawableAcquisition; } createProtectedNativeBackend()61*c8dee2aaSAndroid Build Coastguard Worker bool createProtectedNativeBackend() const { return fCreateProtectedNativeBackend; } graphiteTestOptions()62*c8dee2aaSAndroid Build Coastguard Worker virtual const GraphiteTestOptions* graphiteTestOptions() const { return nullptr; } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker private: 65*c8dee2aaSAndroid Build Coastguard Worker friend class DisplayParamsBuilder; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker SkColorType fColorType; 68*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> fColorSpace; 69*c8dee2aaSAndroid Build Coastguard Worker int fMSAASampleCount; 70*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions fGrContextOptions; 71*c8dee2aaSAndroid Build Coastguard Worker SkSurfaceProps fSurfaceProps; 72*c8dee2aaSAndroid Build Coastguard Worker bool fDisableVsync; 73*c8dee2aaSAndroid Build Coastguard Worker bool fDelayDrawableAcquisition; 74*c8dee2aaSAndroid Build Coastguard Worker bool fCreateProtectedNativeBackend = false; 75*c8dee2aaSAndroid Build Coastguard Worker }; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker class DisplayParamsBuilder { 78*c8dee2aaSAndroid Build Coastguard Worker public: DisplayParamsBuilder()79*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder() : fDisplayParams(std::make_unique<DisplayParams>()) {} 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker // Call clone() in case other is a subclass of DisplayParams DisplayParamsBuilder(const DisplayParams * other)82*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder(const DisplayParams* other) : fDisplayParams(other->clone()) {} 83*c8dee2aaSAndroid Build Coastguard Worker colorType(SkColorType colorType)84*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& colorType(SkColorType colorType) { 85*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fColorType = colorType; 86*c8dee2aaSAndroid Build Coastguard Worker return *this; 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker colorSpace(const sk_sp<SkColorSpace> & colorSpace)89*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& colorSpace(const sk_sp<SkColorSpace>& colorSpace) { 90*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fColorSpace = colorSpace; 91*c8dee2aaSAndroid Build Coastguard Worker return *this; 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker msaaSampleCount(int MSAASampleCount)94*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& msaaSampleCount(int MSAASampleCount) { 95*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fMSAASampleCount = MSAASampleCount; 96*c8dee2aaSAndroid Build Coastguard Worker return *this; 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker roundUpMSAA()99*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& roundUpMSAA() { 100*c8dee2aaSAndroid Build Coastguard Worker // SkNextPow2 is undefined for 0, so handle that ourselves. 101*c8dee2aaSAndroid Build Coastguard Worker if (fDisplayParams->fMSAASampleCount <= 1) { 102*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fMSAASampleCount = 1; 103*c8dee2aaSAndroid Build Coastguard Worker } else { 104*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fMSAASampleCount = SkNextPow2(fDisplayParams->fMSAASampleCount); 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker return *this; 107*c8dee2aaSAndroid Build Coastguard Worker } 108*c8dee2aaSAndroid Build Coastguard Worker grContextOptions(const GrContextOptions & grContextOptions)109*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& grContextOptions(const GrContextOptions& grContextOptions) { 110*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fGrContextOptions = grContextOptions; 111*c8dee2aaSAndroid Build Coastguard Worker return *this; 112*c8dee2aaSAndroid Build Coastguard Worker } 113*c8dee2aaSAndroid Build Coastguard Worker surfaceProps(const SkSurfaceProps & surfaceProps)114*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& surfaceProps(const SkSurfaceProps& surfaceProps) { 115*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fSurfaceProps = surfaceProps; 116*c8dee2aaSAndroid Build Coastguard Worker return *this; 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker disableVsync(bool disableVsync)119*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& disableVsync(bool disableVsync) { 120*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fDisableVsync = disableVsync; 121*c8dee2aaSAndroid Build Coastguard Worker return *this; 122*c8dee2aaSAndroid Build Coastguard Worker } 123*c8dee2aaSAndroid Build Coastguard Worker delayDrawableAcquisition(bool delayDrawableAcquisition)124*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& delayDrawableAcquisition(bool delayDrawableAcquisition) { 125*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fDelayDrawableAcquisition = delayDrawableAcquisition; 126*c8dee2aaSAndroid Build Coastguard Worker return *this; 127*c8dee2aaSAndroid Build Coastguard Worker } 128*c8dee2aaSAndroid Build Coastguard Worker createProtectedNativeBackend(bool createProtectedNativeBackend)129*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder& createProtectedNativeBackend(bool createProtectedNativeBackend) { 130*c8dee2aaSAndroid Build Coastguard Worker fDisplayParams->fCreateProtectedNativeBackend = createProtectedNativeBackend; 131*c8dee2aaSAndroid Build Coastguard Worker return *this; 132*c8dee2aaSAndroid Build Coastguard Worker } 133*c8dee2aaSAndroid Build Coastguard Worker build()134*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<DisplayParams> build() { return std::move(fDisplayParams); } 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker protected: DisplayParamsBuilder(std::unique_ptr<DisplayParams> other)137*c8dee2aaSAndroid Build Coastguard Worker DisplayParamsBuilder(std::unique_ptr<DisplayParams> other) : fDisplayParams(std::move(other)) {} 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<DisplayParams> fDisplayParams; 140*c8dee2aaSAndroid Build Coastguard Worker }; 141*c8dee2aaSAndroid Build Coastguard Worker 142*c8dee2aaSAndroid Build Coastguard Worker } // namespace skwindow 143*c8dee2aaSAndroid Build Coastguard Worker 144*c8dee2aaSAndroid Build Coastguard Worker #endif 145