Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Unified Diff: src/gpu/gl/GrGLCaps.h

Issue 1535153002: Move config table to GrGLCaps from GrGLGpu. (Closed) Base URL: https://skia.googlesource.com/skia.git@rmc2glf
Patch Set: Address comments Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/gpu/gl/GrGLCaps.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLCaps.h
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index c8fad0ade60d75d36ca265c1b01b72b195c6db3e..0f1b2c53a1d20ea0fdb9d967876f04fab18ff4df 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -28,6 +28,24 @@ class GrGLCaps : public GrCaps {
public:
typedef GrGLStencilAttachment::Format StencilFormat;
+ /** Provides information about the mappiing from GrPixelConfig to GL formats. */
+ struct ConfigFormats {
+ ConfigFormats() {
+ // Inits to known bad GL enum values.
+ memset(this, 0xAB, sizeof(ConfigFormats));
+ }
+ GrGLenum fBaseInternalFormat;
+ GrGLenum fSizedInternalFormat;
+ GrGLenum fExternalFormat;
+ GrGLenum fExternalType;
+
+ // The <format> parameter to use for glTexImage and glTexSubImage.
+ // This is usually the same as fExternalFormat except for kSRGBA on some GL contexts.
+ GrGLenum fExternalFormatForTexImage;
+ // Either the base or sized internal format depending on the GL and config.
+ GrGLenum fInternalFormatTexImage;
+ };
+
/**
* The type of MSAA for FBOs supported. Different extensions have different
* semantics of how / when a resolve is performed.
@@ -105,6 +123,52 @@ public:
GrGLCaps(const GrContextOptions& contextOptions, const GrGLContextInfo& ctxInfo,
const GrGLInterface* glInterface);
+ /** Returns conversions to various GL format parameters for a GrPixelCfonig. */
+ const ConfigFormats& configGLFormats(GrPixelConfig config) const {
+ return fConfigTable[config].fFormats;
+ }
+
+
+ /**
+ * Gets an array of legal stencil formats. These formats are not guaranteed
+ * to be supported by the driver but are legal GLenum names given the GL
+ * version and extensions supported.
+ */
+ const SkTArray<StencilFormat, true>& stencilFormats() const {
+ return fStencilFormats;
+ }
+
+ /**
+ * Has a stencil format index been found for the config (or we've found that no format works).
+ */
+ bool hasStencilFormatBeenDeterminedForConfig(GrPixelConfig config) const {
+ return fConfigTable[config].fStencilFormatIndex != ConfigInfo::kUnknown_StencilIndex;
+ }
+
+ /**
+ * Gets the stencil format index for the config. This assumes
+ * hasStencilFormatBeenDeterminedForConfig has already been checked. Returns a value < 0 if
+ * no stencil format is supported with the config. Otherwise, returned index refers to the array
+ * returned by stencilFormats().
+ */
+ int getStencilFormatIndexForConfig(GrPixelConfig config) const {
+ SkASSERT(this->hasStencilFormatBeenDeterminedForConfig(config));
+ return fConfigTable[config].fStencilFormatIndex;
+ }
+
+ /**
+ * If index is >= 0 this records an index into stencilFormats() as the best stencil format for
+ * the config. If < 0 it records that the config has no supported stencil format index.
+ */
+ void setStencilFormatIndexForConfig(GrPixelConfig config, int index) {
+ SkASSERT(!this->hasStencilFormatBeenDeterminedForConfig(config));
+ if (index < 0) {
+ fConfigTable[config].fStencilFormatIndex = ConfigInfo::kUnsupported_StencilFormatIndex;
+ } else {
+ fConfigTable[config].fStencilFormatIndex = index;
+ }
+ }
+
/**
* Call to note that a color config has been verified as a valid color
* attachment. This may save future calls to glCheckFramebufferStatus
@@ -154,15 +218,6 @@ public:
/// What type of transfer buffer is supported?
TransferBufferType transferBufferType() const { return fTransferBufferType; }
- /**
- * Gets an array of legal stencil formats. These formats are not guaranteed
- * to be supported by the driver but are legal GLenum names given the GL
- * version and extensions supported.
- */
- const SkTArray<StencilFormat, true>& stencilFormats() const {
- return fStencilFormats;
- }
-
/// The maximum number of fragment uniform vectors (GLES has min. 16).
int maxFragmentUniformVectors() const { return fMaxFragmentUniformVectors; }
@@ -332,6 +387,8 @@ private:
void initConfigSwizzleTable(const GrGLContextInfo& ctxInfo, GrGLSLCaps* glslCaps);
+ void initConfigTable(const GrGLContextInfo&);
+
// tracks configs that have been verified to pass the FBO completeness when
// used as a color attachment
VerifiedColorConfigs fVerifiedColorConfigs;
@@ -373,6 +430,25 @@ private:
bool fBindUniformLocationSupport : 1;
bool fExternalTextureSupport : 1;
+ struct ConfigInfo {
+ ConfigInfo() : fStencilFormatIndex(kUnknown_StencilIndex) {};
+
+ ConfigFormats fFormats;
+
+ // Index into GrGLCaps's list of stencil formats. Support is determined experimentally and
+ // lazily.
+ int fStencilFormatIndex;
+
+ enum {
+ // This indicates that a stencil format has not yet been determined for the config.
+ kUnknown_StencilIndex = -1,
+ // This indicates that there is no supported stencil format for the config.
+ kUnsupported_StencilFormatIndex = -2
+ };
+ };
+
+ ConfigInfo fConfigTable[kGrPixelConfigCnt];
+
struct ReadPixelsSupportedFormat {
GrGLenum fFormat;
GrGLenum fType;
« no previous file with comments | « no previous file | src/gpu/gl/GrGLCaps.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698