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

Side by Side Diff: src/gpu/gl/GrGLCaps.cpp

Issue 1177053002: Init GrGLSLCaps fields from inside GrGLCaps (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 6 months 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 unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLCaps.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrGLCaps.h" 9 #include "GrGLCaps.h"
10 10
(...skipping 29 matching lines...) Expand all
40 fFragCoordsConventionSupport = false; 40 fFragCoordsConventionSupport = false;
41 fVertexArrayObjectSupport = false; 41 fVertexArrayObjectSupport = false;
42 fES2CompatibilitySupport = false; 42 fES2CompatibilitySupport = false;
43 fMultisampleDisableSupport = false; 43 fMultisampleDisableSupport = false;
44 fUseNonVBOVertexAndIndexDynamicData = false; 44 fUseNonVBOVertexAndIndexDynamicData = false;
45 fIsCoreProfile = false; 45 fIsCoreProfile = false;
46 fFullClearIsFree = false; 46 fFullClearIsFree = false;
47 47
48 fReadPixelsSupportedCache.reset(); 48 fReadPixelsSupportedCache.reset();
49 49
50 this->init(ctxInfo, glInterface);
51
52 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions, 50 fShaderCaps.reset(SkNEW_ARGS(GrGLSLCaps, (contextOptions,
53 ctxInfo, glInterface, *this))); 51 ctxInfo, glInterface, *this)));
54 52
55 this->applyOptionsOverrides(contextOptions); 53 this->init(contextOptions, ctxInfo, glInterface);
56 } 54 }
57 55
58 void GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { 56 void GrGLCaps::init(const GrContextOptions& contextOptions,
57 const GrGLContextInfo& ctxInfo,
58 const GrGLInterface* gli) {
59 GrGLStandard standard = ctxInfo.standard(); 59 GrGLStandard standard = ctxInfo.standard();
60 GrGLVersion version = ctxInfo.version(); 60 GrGLVersion version = ctxInfo.version();
61 61
62 /************************************************************************** 62 /**************************************************************************
63 * Caps specific to GrGLSLCaps
64 **************************************************************************/
65
66 GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get());
67 glslCaps->fGLSLGeneration = ctxInfo.glslGeneration();
68
69 if (kGLES_GrGLStandard == standard) {
70 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) {
71 glslCaps->fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0));
72 glslCaps->fFBFetchSupport = true;
73 glslCaps->fFBFetchColorName = "gl_LastFragData[0]";
74 glslCaps->fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch ";
75 }
76 else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) {
77 // Actually, we haven't seen an ES3.0 device with this extension yet , so we don't know
78 glslCaps->fFBFetchNeedsCustomOutput = false;
79 glslCaps->fFBFetchSupport = true;
80 glslCaps->fFBFetchColorName = "gl_LastFragData[0]";
81 glslCaps->fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch" ;
82 }
83 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) {
84 // The arm extension also requires an additional flag which we will set onResetContext
85 glslCaps->fFBFetchNeedsCustomOutput = false;
86 glslCaps->fFBFetchSupport = true;
87 glslCaps->fFBFetchColorName = "gl_LastFragColorARM";
88 glslCaps->fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch ";
89 }
90 }
91
92 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero in a shader
93 glslCaps->fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor();
94
95 /**************************************************************************
63 * Caps specific to GrGLCaps 96 * Caps specific to GrGLCaps
64 **************************************************************************/ 97 **************************************************************************/
65 98
66 if (kGLES_GrGLStandard == standard) { 99 if (kGLES_GrGLStandard == standard) {
67 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS, 100 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS,
68 &fMaxFragmentUniformVectors); 101 &fMaxFragmentUniformVectors);
69 } else { 102 } else {
70 SkASSERT(kGL_GrGLStandard == standard); 103 SkASSERT(kGL_GrGLStandard == standard);
71 GrGLint max; 104 GrGLint max;
72 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max); 105 GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 else { 236 else {
204 fES2CompatibilitySupport = true; 237 fES2CompatibilitySupport = true;
205 } 238 }
206 239
207 if (kGL_GrGLStandard == standard) { 240 if (kGL_GrGLStandard == standard) {
208 fMultisampleDisableSupport = true; 241 fMultisampleDisableSupport = true;
209 } else { 242 } else {
210 fMultisampleDisableSupport = false; 243 fMultisampleDisableSupport = false;
211 } 244 }
212 245
246 /**************************************************************************
247 * GrShaderCaps fields
248 **************************************************************************/
249
250 glslCaps->fPathRenderingSupport = ctxInfo.hasExtension("GL_NV_path_rendering ");
251
252 if (glslCaps->fPathRenderingSupport) {
253 if (kGL_GrGLStandard == standard) {
254 // We only support v1.3+ of GL_NV_path_rendering which allows us to
255 // set individual fragment inputs with ProgramPathFragmentInputGen. The API
256 // additions are detected by checking the existence of the function.
257 glslCaps->fPathRenderingSupport =
258 ctxInfo.hasExtension("GL_EXT_direct_state_access") &&
259 ((ctxInfo.version() >= GR_GL_VER(4, 3) ||
260 ctxInfo.hasExtension("GL_ARB_program_interface_query")) &&
261 gli->fFunctions.fProgramPathFragmentInputGen);
262 }
263 else {
264 glslCaps->fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3, 1);
265 }
266 }
267
268 // For now these two are equivalent but we could have dst read in shader via some other method
269 glslCaps->fDstReadInShaderSupport = glslCaps->fFBFetchSupport;
270
271 // Enable supported shader-related caps
272 if (kGL_GrGLStandard == standard) {
273 glslCaps->fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3 , 3) ||
274 ctxInfo.hasExtension("GL_ARB_blend_func_extended")) &&
275 GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration());
276 glslCaps->fShaderDerivativeSupport = true;
277 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS
278 glslCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) &&
279 ctxInfo.glslGeneration() >= k150_GrGLSLGeneration;
280 }
281 else {
282 glslCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0 ) ||
283 ctxInfo.hasExtension("GL_OES_standard_derivatives");
284 }
285
286 // We need dual source blending and the ability to disable multisample in or der to support mixed
287 // samples in every corner case.
288 if (fMultisampleDisableSupport && glslCaps->fDualSourceBlendingSupport) {
289 // We understand "mixed samples" to mean the collective capability of 3 different extensions
290 glslCaps->fMixedSamplesSupport =
291 ctxInfo.hasExtension("GL_NV_framebuffer_mixed_samples") &&
292 ctxInfo.hasExtension("GL_NV_sample_mask_override_coverage") &&
293 ctxInfo.hasExtension("GL_EXT_raster_multisample");
294 }
295
296 /**************************************************************************
297 * GrCaps fields
298 **************************************************************************/
299
213 this->initFSAASupport(ctxInfo, gli); 300 this->initFSAASupport(ctxInfo, gli);
214 this->initStencilFormats(ctxInfo); 301 this->initStencilFormats(ctxInfo);
215 302
216 /**************************************************************************
217 * GrCaps fields
218 **************************************************************************/
219 if (kGL_GrGLStandard == standard) { 303 if (kGL_GrGLStandard == standard) {
220 // we could also look for GL_ATI_separate_stencil extension or 304 // we could also look for GL_ATI_separate_stencil extension or
221 // GL_EXT_stencil_two_side but they use different function signatures 305 // GL_EXT_stencil_two_side but they use different function signatures
222 // than GL2.0+ (and than each other). 306 // than GL2.0+ (and than each other).
223 fTwoSidedStencilSupport = (ctxInfo.version() >= GR_GL_VER(2,0)); 307 fTwoSidedStencilSupport = (ctxInfo.version() >= GR_GL_VER(2,0));
224 // supported on GL 1.4 and higher or by extension 308 // supported on GL 1.4 and higher or by extension
225 fStencilWrapOpsSupport = (ctxInfo.version() >= GR_GL_VER(1,4)) || 309 fStencilWrapOpsSupport = (ctxInfo.version() >= GR_GL_VER(1,4)) ||
226 ctxInfo.hasExtension("GL_EXT_stencil_wrap"); 310 ctxInfo.hasExtension("GL_EXT_stencil_wrap");
227 } else { 311 } else {
228 // ES 2 has two sided stencil and stencil wrap 312 // ES 2 has two sided stencil and stencil wrap
229 fTwoSidedStencilSupport = true; 313 fTwoSidedStencilSupport = true;
230 fStencilWrapOpsSupport = true; 314 fStencilWrapOpsSupport = true;
231 } 315 }
232 316
233 // Disabling advanced blend until we can resolve various bugs 317 // Disabling advanced blend until we can resolve various bugs
234 #if 0 318 #if 0
235 if (kIntel_GrGLVendor != ctxInfo.vendor()) { 319 if (kIntel_GrGLVendor != ctxInfo.vendor()) {
236 if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced_coherent") || 320 if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced_coherent")) {
237 ctxInfo.hasExtension("GL_NV_blend_equation_advanced_coherent")) {
238 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport; 321 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport;
239 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced") || 322 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kAutomatic_AdvBlendEq Interaction;
240 ctxInfo.hasExtension("GL_NV_blend_equation_advanced")) { 323 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced_coherent ")) {
324 fBlendEquationSupport = kAdvancedCoherent_BlendEquationSupport;
325 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kGeneralEnable_AdvBle ndEqInteraction;
326 } else if (ctxInfo.hasExtension("GL_NV_blend_equation_advanced")) {
241 fBlendEquationSupport = kAdvanced_BlendEquationSupport; 327 fBlendEquationSupport = kAdvanced_BlendEquationSupport;
242 } else { 328 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kAutomatic_AdvBlendEq Interaction;
243 fBlendEquationSupport = kBasic_BlendEquationSupport; 329 } else if (ctxInfo.hasExtension("GL_KHR_blend_equation_advanced")) {
330 fBlendEquationSupport = kAdvanced_BlendEquationSupport;
331 glslCaps->fAdvBlendEqInteraction = GrGLSLCaps::kGeneralEnable_AdvBle ndEqInteraction;
244 } 332 }
245 } else {
246 // On Intel platforms, KHR_blend_equation_advanced is not conformant.
247 fBlendEquationSupport = kBasic_BlendEquationSupport;
248 } 333 }
249 #endif 334 #endif
250 if (kGL_GrGLStandard == standard) { 335 if (kGL_GrGLStandard == standard) {
251 fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the des ktop VBO 336 fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the des ktop VBO
252 // extension includes glMapBuffer. 337 // extension includes glMapBuffer.
253 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffe r_range")) { 338 if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffe r_range")) {
254 fMapBufferFlags |= kSubset_MapFlag; 339 fMapBufferFlags |= kSubset_MapFlag;
255 fMapBufferType = kMapBufferRange_MapBufferType; 340 fMapBufferType = kMapBufferRange_MapBufferType;
256 } else { 341 } else {
257 fMapBufferType = kMapBuffer_MapBufferType; 342 fMapBufferType = kMapBuffer_MapBufferType;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 } else { 416 } else {
332 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object")); 417 SkASSERT(ctxInfo.hasExtension("GL_EXT_framebuffer_object"));
333 } 418 }
334 } else { 419 } else {
335 // ES 3.0 supports mixed size FBO attachments, 2.0 does not. 420 // ES 3.0 supports mixed size FBO attachments, 2.0 does not.
336 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0); 421 fOversizedStencilSupport = ctxInfo.version() >= GR_GL_VER(3, 0);
337 } 422 }
338 423
339 this->initConfigTexturableTable(ctxInfo, gli); 424 this->initConfigTexturableTable(ctxInfo, gli);
340 this->initConfigRenderableTable(ctxInfo); 425 this->initConfigRenderableTable(ctxInfo);
426 glslCaps->initShaderPrecisionTable(ctxInfo, gli);
427
428 this->applyOptionsOverrides(contextOptions);
429 glslCaps->applyOptionsOverrides(contextOptions);
341 } 430 }
342 431
343 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { 432 void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) {
344 // OpenGL < 3.0 433 // OpenGL < 3.0
345 // no support for render targets unless the GL_ARB_framebuffer_object 434 // no support for render targets unless the GL_ARB_framebuffer_object
346 // extension is supported (in which case we get ALPHA, RED, RG, RGB, 435 // extension is supported (in which case we get ALPHA, RED, RG, RGB,
347 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we 436 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we
348 // probably don't get R8 in this case. 437 // probably don't get R8 in this case.
349 438
350 // OpenGL 3.0 439 // OpenGL 3.0
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options, 999 GrGLSLCaps::GrGLSLCaps(const GrContextOptions& options,
911 const GrGLContextInfo& ctxInfo, 1000 const GrGLContextInfo& ctxInfo,
912 const GrGLInterface* gli, 1001 const GrGLInterface* gli,
913 const GrGLCaps& glCaps) { 1002 const GrGLCaps& glCaps) {
914 fDropsTileOnZeroDivide = false; 1003 fDropsTileOnZeroDivide = false;
915 fFBFetchSupport = false; 1004 fFBFetchSupport = false;
916 fFBFetchNeedsCustomOutput = false; 1005 fFBFetchNeedsCustomOutput = false;
917 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction; 1006 fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction;
918 fFBFetchColorName = NULL; 1007 fFBFetchColorName = NULL;
919 fFBFetchExtensionString = NULL; 1008 fFBFetchExtensionString = NULL;
920 this->init(ctxInfo, gli, glCaps);
921 this->applyOptionsOverrides(options);
922 }
923
924 void GrGLSLCaps::init(const GrGLContextInfo& ctxInfo,
925 const GrGLInterface* gli,
926 const GrGLCaps& glCaps) {
927 fGLSLGeneration = ctxInfo.glslGeneration();
928 GrGLStandard standard = ctxInfo.standard();
929 GrGLVersion version = ctxInfo.version();
930
931 /**************************************************************************
932 * Caps specific to GrGLSLCaps
933 **************************************************************************/
934
935 if (kGLES_GrGLStandard == standard) {
936 if (ctxInfo.hasExtension("GL_EXT_shader_framebuffer_fetch")) {
937 fFBFetchNeedsCustomOutput = (version >= GR_GL_VER(3, 0));
938 fFBFetchSupport = true;
939 fFBFetchColorName = "gl_LastFragData[0]";
940 fFBFetchExtensionString = "GL_EXT_shader_framebuffer_fetch";
941 }
942 else if (ctxInfo.hasExtension("GL_NV_shader_framebuffer_fetch")) {
943 // Actually, we haven't seen an ES3.0 device with this extension yet , so we don't know
944 fFBFetchNeedsCustomOutput = false;
945 fFBFetchSupport = true;
946 fFBFetchColorName = "gl_LastFragData[0]";
947 fFBFetchExtensionString = "GL_NV_shader_framebuffer_fetch";
948 }
949 else if (ctxInfo.hasExtension("GL_ARM_shader_framebuffer_fetch")) {
950 // The arm extension also requires an additional flag which we will set onResetContext
951 fFBFetchNeedsCustomOutput = false;
952 fFBFetchSupport = true;
953 fFBFetchColorName = "gl_LastFragColorARM";
954 fFBFetchExtensionString = "GL_ARM_shader_framebuffer_fetch";
955 }
956 }
957
958 // Adreno GPUs have a tendency to drop tiles when there is a divide-by-zero in a shader
959 fDropsTileOnZeroDivide = kQualcomm_GrGLVendor == ctxInfo.vendor();
960
961 /**************************************************************************
962 * GrShaderCaps fields
963 **************************************************************************/
964
965 fPathRenderingSupport = ctxInfo.hasExtension("GL_NV_path_rendering");
966
967 if (fPathRenderingSupport) {
968 if (kGL_GrGLStandard == standard) {
969 // We only support v1.3+ of GL_NV_path_rendering which allows us to
970 // set individual fragment inputs with ProgramPathFragmentInputGen. The API
971 // additions are detected by checking the existence of the function.
972 fPathRenderingSupport = ctxInfo.hasExtension("GL_EXT_direct_state_ac cess") &&
973 ((ctxInfo.version() >= GR_GL_VER(4, 3) ||
974 ctxInfo.hasExtension("GL_ARB_program_interface_query")) &&
975 gli->fFunctions.fProgramPathFragmentInputGen);
976 }
977 else {
978 fPathRenderingSupport = ctxInfo.version() >= GR_GL_VER(3, 1);
979 }
980 }
981
982 // For now these two are equivalent but we could have dst read in shader via some other method
983 fDstReadInShaderSupport = fFBFetchSupport;
984
985 // Enable supported shader-related caps
986 if (kGL_GrGLStandard == standard) {
987 fDualSourceBlendingSupport = (ctxInfo.version() >= GR_GL_VER(3, 3) ||
988 ctxInfo.hasExtension("GL_ARB_blend_func_extended")) &&
989 GrGLSLSupportsNamedFragmentShaderOutputs(ctxInfo.glslGeneration());
990 fShaderDerivativeSupport = true;
991 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS
992 fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) &&
993 ctxInfo.glslGeneration() >= k150_GrGLSLGeneration;
994 }
995 else {
996 fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) ||
997 ctxInfo.hasExtension("GL_OES_standard_derivatives");
998 }
999
1000 // We need dual source blending and the ability to disable multisample in or der to support mixed
1001 // samples in every corner case.
1002 if (fDualSourceBlendingSupport && glCaps.multisampleDisableSupport()) {
1003 // We understand "mixed samples" to mean the collective capability of 3 different extensions
1004 fMixedSamplesSupport = ctxInfo.hasExtension("GL_NV_framebuffer_mixed_sam ples") &&
1005 ctxInfo.hasExtension("GL_NV_sample_mask_override_ coverage") &&
1006 ctxInfo.hasExtension("GL_EXT_raster_multisample") ;
1007 }
1008
1009 if (glCaps.advancedBlendEquationSupport()) {
1010 bool coherent = glCaps.advancedCoherentBlendEquationSupport();
1011 if (ctxInfo.hasExtension(coherent ? "GL_NV_blend_equation_advanced_coher ent"
1012 : "GL_NV_blend_equation_advanced")) {
1013 fAdvBlendEqInteraction = kAutomatic_AdvBlendEqInteraction;
1014 } else {
1015 fAdvBlendEqInteraction = kGeneralEnable_AdvBlendEqInteraction;
1016 // TODO: Use the following on any platform where "blend_support_all_ equations" is slow.
1017 //fAdvBlendEqInteraction = kSpecificEnables_AdvBlendEqInteraction;
1018 }
1019 }
1020
1021 this->initShaderPrecisionTable(ctxInfo, gli);
1022 } 1009 }
1023 1010
1024 SkString GrGLSLCaps::dump() const { 1011 SkString GrGLSLCaps::dump() const {
1025 SkString r = INHERITED::dump(); 1012 SkString r = INHERITED::dump();
1026 1013
1027 static const char* kAdvBlendEqInteractionStr[] = { 1014 static const char* kAdvBlendEqInteractionStr[] = {
1028 "Not Supported", 1015 "Not Supported",
1029 "Automatic", 1016 "Automatic",
1030 "General Enable", 1017 "General Enable",
1031 "Specific Enables", 1018 "Specific Enables",
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 if (fGeometryShaderSupport) { 1109 if (fGeometryShaderSupport) {
1123 for (int p = 0; p < kGrSLPrecisionCount; ++p) { 1110 for (int p = 0; p < kGrSLPrecisionCount; ++p) {
1124 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert ex_GrShaderType][p]; 1111 fFloatPrecisions[kGeometry_GrShaderType][p] = fFloatPrecisions[kVert ex_GrShaderType][p];
1125 } 1112 }
1126 } 1113 }
1127 } 1114 }
1128 1115
1129 1116
1130 1117
1131 1118
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLCaps.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698