blob: d24afa58baae71201332ddd4fd7ce2f16b03eb7d [file] [log] [blame]
Brian Salomoncfe910d2017-07-06 16:40:18 -04001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrMockCaps_DEFINED
9#define GrMockCaps_DEFINED
10
11#include "GrCaps.h"
Greg Daniel4065d452018-11-16 15:43:41 -050012#include "SkGr.h"
Brian Salomon8fe24272017-07-07 12:56:11 -040013#include "mock/GrMockTypes.h"
Brian Salomoncfe910d2017-07-06 16:40:18 -040014
15class GrMockCaps : public GrCaps {
16public:
17 GrMockCaps(const GrContextOptions& contextOptions, const GrMockOptions& options)
18 : INHERITED(contextOptions), fOptions(options) {
Chris Daltonfddb6c02017-11-04 15:22:22 -060019 fInstanceAttribSupport = options.fInstanceAttribSupport;
20 fMapBufferFlags = options.fMapBufferFlags;
21 fBufferMapThreshold = SK_MaxS32; // Overridable in GrContextOptions.
Brian Salomoncfe910d2017-07-06 16:40:18 -040022 fMaxTextureSize = options.fMaxTextureSize;
23 fMaxRenderTargetSize = SkTMin(options.fMaxRenderTargetSize, fMaxTextureSize);
Chris Dalton2612bae2018-02-22 13:41:37 -070024 fMaxPreferredRenderTargetSize = fMaxRenderTargetSize;
Brian Salomoncfe910d2017-07-06 16:40:18 -040025 fMaxVertexAttributes = options.fMaxVertexAttributes;
Chris Daltonfddb6c02017-11-04 15:22:22 -060026
Brian Salomoncfe910d2017-07-06 16:40:18 -040027 fShaderCaps.reset(new GrShaderCaps(contextOptions));
Chris Daltonfddb6c02017-11-04 15:22:22 -060028 fShaderCaps->fGeometryShaderSupport = options.fGeometryShaderSupport;
Chris Daltonfddb6c02017-11-04 15:22:22 -060029 fShaderCaps->fIntegerSupport = options.fIntegerSupport;
30 fShaderCaps->fFlatInterpolationSupport = options.fFlatInterpolationSupport;
Robert Phillips7ffbcf92017-12-04 12:52:46 -050031 fShaderCaps->fMaxFragmentSamplers = options.fMaxFragmentSamplers;
Brian Salomon821ef182017-11-07 16:41:11 -050032 fShaderCaps->fShaderDerivativeSupport = options.fShaderDerivativeSupport;
Chris Daltonfddb6c02017-11-04 15:22:22 -060033
Brian Salomon8fe24272017-07-07 12:56:11 -040034 this->applyOptionsOverrides(contextOptions);
Brian Salomoncfe910d2017-07-06 16:40:18 -040035 }
Brian Salomoncfe910d2017-07-06 16:40:18 -040036 bool isConfigTexturable(GrPixelConfig config) const override {
37 return fOptions.fConfigOptions[config].fTexturable;
38 }
Brian Salomonbdecacf2018-02-02 20:32:49 -050039
Greg Danielbb76ace2017-09-29 15:58:22 -040040 bool isConfigCopyable(GrPixelConfig config) const override {
41 return false;
42 }
43
Brian Salomonbdecacf2018-02-02 20:32:49 -050044 int getRenderTargetSampleCount(int requestCount, GrPixelConfig config) const override {
45 requestCount = SkTMax(requestCount, 1);
46 switch (fOptions.fConfigOptions[config].fRenderability) {
47 case GrMockOptions::ConfigOptions::Renderability::kNo:
48 return 0;
49 case GrMockOptions::ConfigOptions::Renderability::kNonMSAA:
50 return requestCount > 1 ? 0 : 1;
51 case GrMockOptions::ConfigOptions::Renderability::kMSAA:
52 return requestCount > kMaxSampleCnt ? 0 : GrNextPow2(requestCount);
53 }
54 return 0;
55 }
56
57 int maxRenderTargetSampleCount(GrPixelConfig config) const override {
58 switch (fOptions.fConfigOptions[config].fRenderability) {
59 case GrMockOptions::ConfigOptions::Renderability::kNo:
60 return 0;
61 case GrMockOptions::ConfigOptions::Renderability::kNonMSAA:
62 return 1;
63 case GrMockOptions::ConfigOptions::Renderability::kMSAA:
64 return kMaxSampleCnt;
65 }
66 return 0;
67 }
68
Brian Salomonff4ccaa2018-12-05 21:35:33 +000069 bool surfaceSupportsWritePixels(const GrSurface*) const override { return true; }
Brian Salomon19eaf2d2018-03-19 16:06:44 -040070 bool surfaceSupportsReadPixels(const GrSurface*) const override { return true; }
Brian Salomon5f33a8c2018-02-26 14:32:39 -050071
Brian Salomonff4ccaa2018-12-05 21:35:33 +000072 bool canCopySurface(const GrSurfaceProxy* dst, const GrSurfaceProxy* src,
73 const SkIRect& srcRect, const SkIPoint& dstPoint) const override {
74 return true;
75 }
76
Brian Salomon2a4f9832018-03-03 22:43:43 -050077 bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc, GrSurfaceOrigin*,
Brian Salomoncfe910d2017-07-06 16:40:18 -040078 bool* rectsMustMatch, bool* disallowSubrect) const override {
79 return false;
80 }
81
Greg Danielfaa095e2017-12-19 13:15:02 -050082 bool validateBackendTexture(const GrBackendTexture& tex, SkColorType,
Robert Phillipsfc711a22018-02-13 17:03:00 -050083 GrPixelConfig* config) const override {
Greg Daniel52e16d92018-04-10 09:34:07 -040084 GrMockTextureInfo texInfo;
85 if (!tex.getMockTextureInfo(&texInfo)) {
Robert Phillipsfc711a22018-02-13 17:03:00 -050086 return false;
87 }
88
Greg Daniel52e16d92018-04-10 09:34:07 -040089 *config = texInfo.fConfig;
Robert Phillipsfc711a22018-02-13 17:03:00 -050090 return true;
Greg Danielf5d87582017-12-18 14:48:15 -050091 }
92
Greg Danielfaa095e2017-12-19 13:15:02 -050093 bool validateBackendRenderTarget(const GrBackendRenderTarget& rt, SkColorType,
94 GrPixelConfig*) const override {
95 return false;
96 }
97
Robert Phillipsfc711a22018-02-13 17:03:00 -050098 bool getConfigFromBackendFormat(const GrBackendFormat& format, SkColorType ct,
99 GrPixelConfig* config) const override {
100 const GrPixelConfig* mockFormat = format.getMockFormat();
101 if (!mockFormat) {
102 return false;
103 }
104 *config = *mockFormat;
105 return true;
106 }
107
Jim Van Verth9bf81202018-10-30 15:53:36 -0400108 bool getYUVAConfigFromBackendTexture(const GrBackendTexture& tex,
109 GrPixelConfig* config) const override {
110 GrMockTextureInfo texInfo;
111 if (!tex.getMockTextureInfo(&texInfo)) {
112 return false;
113 }
114
115 *config = texInfo.fConfig;
116 return true;
117 }
118
Jim Van Verthb7f0b9c2018-10-22 14:12:03 -0400119 bool getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
120 GrPixelConfig* config) const override {
121 const GrPixelConfig* mockFormat = format.getMockFormat();
122 if (!mockFormat) {
123 return false;
124 }
125 *config = *mockFormat;
126 return true;
127 }
128
Greg Daniel4065d452018-11-16 15:43:41 -0500129 GrBackendFormat getBackendFormatFromGrColorType(GrColorType ct,
130 GrSRGBEncoded srgbEncoded) const override {
131 GrPixelConfig config = GrColorTypeToPixelConfig(ct, srgbEncoded);
132 if (config == kUnknown_GrPixelConfig) {
133 return GrBackendFormat();
134 }
135 return GrBackendFormat::MakeMock(config);
136 }
137
Greg Danielfaa095e2017-12-19 13:15:02 -0500138private:
Timothy Liang036fdfe2018-06-28 15:50:36 -0400139 GrBackendFormat onCreateFormatFromBackendTexture(
140 const GrBackendTexture& backendTex) const override {
141 GrMockTextureInfo mockInfo;
142 SkAssertResult(backendTex.getMockTextureInfo(&mockInfo));
143 return GrBackendFormat::MakeMock(mockInfo.fConfig);
144 }
Timothy Liang036fdfe2018-06-28 15:50:36 -0400145
Brian Salomonbdecacf2018-02-02 20:32:49 -0500146 static const int kMaxSampleCnt = 16;
147
Brian Salomoncfe910d2017-07-06 16:40:18 -0400148 GrMockOptions fOptions;
149 typedef GrCaps INHERITED;
150};
151
152#endif