Index: src/gpu/GrCaps.cpp |
diff --git a/src/gpu/GrCaps.cpp b/src/gpu/GrCaps.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eb2cf7dcbd45a270524e875b80f0c0f40aa04e0c |
--- /dev/null |
+++ b/src/gpu/GrCaps.cpp |
@@ -0,0 +1,213 @@ |
+ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "GrCaps.h" |
+#include "GrContextOptions.h" |
+ |
+GrShaderCaps::GrShaderCaps() { |
+ fShaderDerivativeSupport = false; |
+ fGeometryShaderSupport = false; |
+ fPathRenderingSupport = false; |
+ fDstReadInShaderSupport = false; |
+ fDualSourceBlendingSupport = false; |
+ fMixedSamplesSupport = false; |
+ fShaderPrecisionVaries = false; |
+} |
+ |
+static const char* shader_type_to_string(GrShaderType type) { |
+ switch (type) { |
+ case kVertex_GrShaderType: |
+ return "vertex"; |
+ case kGeometry_GrShaderType: |
+ return "geometry"; |
+ case kFragment_GrShaderType: |
+ return "fragment"; |
+ } |
+ return ""; |
+} |
+ |
+static const char* precision_to_string(GrSLPrecision p) { |
+ switch (p) { |
+ case kLow_GrSLPrecision: |
+ return "low"; |
+ case kMedium_GrSLPrecision: |
+ return "medium"; |
+ case kHigh_GrSLPrecision: |
+ return "high"; |
+ } |
+ return ""; |
+} |
+ |
+SkString GrShaderCaps::dump() const { |
+ SkString r; |
+ static const char* gNY[] = { "NO", "YES" }; |
+ r.appendf("Shader Derivative Support : %s\n", gNY[fShaderDerivativeSupport]); |
+ r.appendf("Geometry Shader Support : %s\n", gNY[fGeometryShaderSupport]); |
+ r.appendf("Path Rendering Support : %s\n", gNY[fPathRenderingSupport]); |
+ r.appendf("Dst Read In Shader Support : %s\n", gNY[fDstReadInShaderSupport]); |
+ r.appendf("Dual Source Blending Support : %s\n", gNY[fDualSourceBlendingSupport]); |
+ r.appendf("Mixed Samples Support : %s\n", gNY[fMixedSamplesSupport]); |
+ |
+ r.appendf("Shader Float Precisions (varies: %s):\n", gNY[fShaderPrecisionVaries]); |
+ |
+ for (int s = 0; s < kGrShaderTypeCount; ++s) { |
+ GrShaderType shaderType = static_cast<GrShaderType>(s); |
+ r.appendf("\t%s:\n", shader_type_to_string(shaderType)); |
+ for (int p = 0; p < kGrSLPrecisionCount; ++p) { |
+ if (fFloatPrecisions[s][p].supported()) { |
+ GrSLPrecision precision = static_cast<GrSLPrecision>(p); |
+ r.appendf("\t\t%s: log_low: %d log_high: %d bits: %d\n", |
+ precision_to_string(precision), |
+ fFloatPrecisions[s][p].fLogRangeLow, |
+ fFloatPrecisions[s][p].fLogRangeHigh, |
+ fFloatPrecisions[s][p].fBits); |
+ } |
+ } |
+ } |
+ |
+ return r; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+GrCaps::GrCaps(const GrContextOptions& options) { |
+ fMipMapSupport = false; |
+ fNPOTTextureTileSupport = false; |
+ fTwoSidedStencilSupport = false; |
+ fStencilWrapOpsSupport = false; |
+ fDiscardRenderTargetSupport = false; |
+ fReuseScratchTextures = true; |
+ fGpuTracingSupport = false; |
+ fCompressedTexSubImageSupport = false; |
+ fOversizedStencilSupport = false; |
+ fTextureBarrierSupport = false; |
+ |
+ fUseDrawInsteadOfClear = false; |
+ |
+ fBlendEquationSupport = kBasic_BlendEquationSupport; |
+ fMapBufferFlags = kNone_MapFlags; |
+ |
+ fMaxRenderTargetSize = 0; |
+ fMaxTextureSize = 0; |
+ fMaxSampleCount = 0; |
+ |
+ memset(fConfigRenderSupport, 0, sizeof(fConfigRenderSupport)); |
+ memset(fConfigTextureSupport, 0, sizeof(fConfigTextureSupport)); |
+ |
+ fSupressPrints = options.fSuppressPrints; |
+ fDrawPathMasksToCompressedTextureSupport = options.fDrawPathToCompressedTexture; |
+} |
+ |
+static SkString map_flags_to_string(uint32_t flags) { |
+ SkString str; |
+ if (GrCaps::kNone_MapFlags == flags) { |
+ str = "none"; |
+ } else { |
+ SkASSERT(GrCaps::kCanMap_MapFlag & flags); |
+ SkDEBUGCODE(flags &= ~GrCaps::kCanMap_MapFlag); |
+ str = "can_map"; |
+ |
+ if (GrCaps::kSubset_MapFlag & flags) { |
+ str.append(" partial"); |
+ } else { |
+ str.append(" full"); |
+ } |
+ SkDEBUGCODE(flags &= ~GrCaps::kSubset_MapFlag); |
+ } |
+ SkASSERT(0 == flags); // Make sure we handled all the flags. |
+ return str; |
+} |
+ |
+SkString GrCaps::dump() const { |
+ SkString r; |
+ static const char* gNY[] = {"NO", "YES"}; |
+ r.appendf("MIP Map Support : %s\n", gNY[fMipMapSupport]); |
+ r.appendf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport]); |
+ r.appendf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport]); |
+ r.appendf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]); |
+ r.appendf("Discard Render Target Support : %s\n", gNY[fDiscardRenderTargetSupport]); |
+ r.appendf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]); |
+ r.appendf("Gpu Tracing Support : %s\n", gNY[fGpuTracingSupport]); |
+ r.appendf("Compressed Update Support : %s\n", gNY[fCompressedTexSubImageSupport]); |
+ r.appendf("Oversized Stencil Support : %s\n", gNY[fOversizedStencilSupport]); |
+ r.appendf("Texture Barrier Support : %s\n", gNY[fTextureBarrierSupport]); |
+ r.appendf("Draw Instead of Clear [workaround] : %s\n", gNY[fUseDrawInsteadOfClear]); |
+ |
+ r.appendf("Max Texture Size : %d\n", fMaxTextureSize); |
+ r.appendf("Max Render Target Size : %d\n", fMaxRenderTargetSize); |
+ r.appendf("Max Sample Count : %d\n", fMaxSampleCount); |
+ |
+ static const char* kBlendEquationSupportNames[] = { |
+ "Basic", |
+ "Advanced", |
+ "Advanced Coherent", |
+ }; |
+ GR_STATIC_ASSERT(0 == kBasic_BlendEquationSupport); |
+ GR_STATIC_ASSERT(1 == kAdvanced_BlendEquationSupport); |
+ GR_STATIC_ASSERT(2 == kAdvancedCoherent_BlendEquationSupport); |
+ GR_STATIC_ASSERT(SK_ARRAY_COUNT(kBlendEquationSupportNames) == kLast_BlendEquationSupport + 1); |
+ |
+ r.appendf("Blend Equation Support : %s\n", |
+ kBlendEquationSupportNames[fBlendEquationSupport]); |
+ r.appendf("Map Buffer Support : %s\n", |
+ map_flags_to_string(fMapBufferFlags).c_str()); |
+ |
+ static const char* kConfigNames[] = { |
+ "Unknown", // kUnknown_GrPixelConfig |
+ "Alpha8", // kAlpha_8_GrPixelConfig, |
+ "Index8", // kIndex_8_GrPixelConfig, |
+ "RGB565", // kRGB_565_GrPixelConfig, |
+ "RGBA444", // kRGBA_4444_GrPixelConfig, |
+ "RGBA8888", // kRGBA_8888_GrPixelConfig, |
+ "BGRA8888", // kBGRA_8888_GrPixelConfig, |
+ "SRGBA8888",// kSRGBA_8888_GrPixelConfig, |
+ "ETC1", // kETC1_GrPixelConfig, |
+ "LATC", // kLATC_GrPixelConfig, |
+ "R11EAC", // kR11_EAC_GrPixelConfig, |
+ "ASTC12x12",// kASTC_12x12_GrPixelConfig, |
+ "RGBAFloat",// kRGBA_float_GrPixelConfig |
+ "AlphaHalf",// kAlpha_half_GrPixelConfig |
+ "RGBAHalf", // kRGBA_half_GrPixelConfig |
+ }; |
+ GR_STATIC_ASSERT(0 == kUnknown_GrPixelConfig); |
+ GR_STATIC_ASSERT(1 == kAlpha_8_GrPixelConfig); |
+ GR_STATIC_ASSERT(2 == kIndex_8_GrPixelConfig); |
+ GR_STATIC_ASSERT(3 == kRGB_565_GrPixelConfig); |
+ GR_STATIC_ASSERT(4 == kRGBA_4444_GrPixelConfig); |
+ GR_STATIC_ASSERT(5 == kRGBA_8888_GrPixelConfig); |
+ GR_STATIC_ASSERT(6 == kBGRA_8888_GrPixelConfig); |
+ GR_STATIC_ASSERT(7 == kSRGBA_8888_GrPixelConfig); |
+ GR_STATIC_ASSERT(8 == kETC1_GrPixelConfig); |
+ GR_STATIC_ASSERT(9 == kLATC_GrPixelConfig); |
+ GR_STATIC_ASSERT(10 == kR11_EAC_GrPixelConfig); |
+ GR_STATIC_ASSERT(11 == kASTC_12x12_GrPixelConfig); |
+ GR_STATIC_ASSERT(12 == kRGBA_float_GrPixelConfig); |
+ GR_STATIC_ASSERT(13 == kAlpha_half_GrPixelConfig); |
+ GR_STATIC_ASSERT(14 == kRGBA_half_GrPixelConfig); |
+ GR_STATIC_ASSERT(SK_ARRAY_COUNT(kConfigNames) == kGrPixelConfigCnt); |
+ |
+ SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig][0]); |
+ SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig][1]); |
+ |
+ for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) { |
+ r.appendf("%s is renderable: %s, with MSAA: %s\n", |
+ kConfigNames[i], |
+ gNY[fConfigRenderSupport[i][0]], |
+ gNY[fConfigRenderSupport[i][1]]); |
+ } |
+ |
+ SkASSERT(!fConfigTextureSupport[kUnknown_GrPixelConfig]); |
+ |
+ for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) { |
+ r.appendf("%s is uploadable to a texture: %s\n", |
+ kConfigNames[i], |
+ gNY[fConfigTextureSupport[i]]); |
+ } |
+ |
+ return r; |
+} |