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

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: more wraps 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') | src/gpu/gl/GrGLGpu.cpp » ('J')
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..a54a10da52d6109ed725a076bf6335539711ca7d 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,58 @@ 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 false if
+ * no stencil format is supported with the config. The returned index refers to the array
+ * returned by stencilFormats().
+ */
+ bool getStencilFormatIndexForConfig(GrPixelConfig config, int* index) const {
+ SkASSERT(this->hasStencilFormatBeenDeterminedForConfig(config));
+ if (ConfigInfo::kUnsupported_StencilFormatIndex ==
+ fConfigTable[config].fStencilFormatIndex) {
+ return false;
+ } else {
+ *index = fConfigTable[config].fStencilFormatIndex;
egdaniel 2015/12/21 15:10:44 is it worth asserting that index > 0 here. Thus we
bsalomon 2015/12/21 15:59:43 Took your other suggestion to just return an int h
+ return true;
+ }
+ }
+
+ /**
+ * 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 +224,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 +393,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 +436,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') | src/gpu/gl/GrGLGpu.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698