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

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

Issue 778783002: Use texture size to determine precision of texture coord varyings (Closed) Base URL: https://skia.googlesource.com/skia.git@defaultp
Patch Set: include skrandom.h in new gm cpp Created 6 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 unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLCaps.cpp ('k') | src/gpu/gl/GrGLUtil.h » ('j') | 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 2013 Google Inc. 2 * Copyright 2013 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 #include "GrGLProgramDesc.h" 7 #include "GrGLProgramDesc.h"
8 8
9 #include "GrGLProcessor.h" 9 #include "GrGLProcessor.h"
10 #include "GrProcessor.h" 10 #include "GrProcessor.h"
11 #include "GrGpuGL.h" 11 #include "GrGpuGL.h"
12 #include "GrOptDrawState.h" 12 #include "GrOptDrawState.h"
13 #include "SkChecksum.h" 13 #include "SkChecksum.h"
14 #include "gl/builders/GrGLFragmentShaderBuilder.h" 14 #include "gl/builders/GrGLFragmentShaderBuilder.h"
15 15
16 /** 16 /**
17 * The key for an individual coord transform is made up of a matrix type and a b it that
18 * indicates the source of the input coords.
19 */
20 enum {
21 kMatrixTypeKeyBits = 1,
22 kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1,
23 kPositionCoords_Flag = (1 << kMatrixTypeKeyBits),
24 kTransformKeyBits = kMatrixTypeKeyBits + 1,
25 };
26
27 /**
28 * We specialize the vertex code for each of these matrix types.
29 */
30 enum MatrixType {
31 kNoPersp_MatrixType = 0,
32 kGeneral_MatrixType = 1,
33 };
34
35 /**
36 * Do we need to either map r,g,b->a or a->r. configComponentMask indicates whic h channels are 17 * Do we need to either map r,g,b->a or a->r. configComponentMask indicates whic h channels are
37 * present in the texture's config. swizzleComponentMask indicates the channels present in the 18 * present in the texture's config. swizzleComponentMask indicates the channels present in the
38 * shader swizzle. 19 * shader swizzle.
39 */ 20 */
40 static bool swizzle_requires_alpha_remapping(const GrGLCaps& caps, 21 static bool swizzle_requires_alpha_remapping(const GrGLCaps& caps,
41 uint32_t configComponentMask, 22 uint32_t configComponentMask,
42 uint32_t swizzleComponentMask) { 23 uint32_t swizzleComponentMask) {
43 if (caps.textureSwizzleSupport()) { 24 if (caps.textureSwizzleSupport()) {
44 // Any remapping is handled using texture swizzling not shader modificat ions. 25 // Any remapping is handled using texture swizzling not shader modificat ions.
45 return false; 26 return false;
(...skipping 19 matching lines...) Expand all
65 const GrGeometryProcessor::VertexAttribArray& vars = proc.getAttribs(); 46 const GrGeometryProcessor::VertexAttribArray& vars = proc.getAttribs();
66 int numAttributes = vars.count(); 47 int numAttributes = vars.count();
67 SkASSERT(numAttributes <= GrGeometryProcessor::kMaxVertexAttribs); 48 SkASSERT(numAttributes <= GrGeometryProcessor::kMaxVertexAttribs);
68 for (int a = 0; a < numAttributes; ++a) { 49 for (int a = 0; a < numAttributes; ++a) {
69 uint32_t value = 1 << a; 50 uint32_t value = 1 << a;
70 key |= value; 51 key |= value;
71 } 52 }
72 return key; 53 return key;
73 } 54 }
74 55
75 static uint32_t gen_transform_key(const GrPendingFragmentStage& stage, 56 /**
76 bool useExplicitLocalCoords) { 57 * The key for an individual coord transform is made up of a matrix type, a prec ision, and a bit
58 * that indicates the source of the input coords.
59 */
60 enum {
61 kMatrixTypeKeyBits = 1,
62 kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1,
63
64 kPrecisionBits = 2,
65 kPrecisionShift = kMatrixTypeKeyBits,
66
67 kPositionCoords_Flag = (1 << (kPrecisionShift + kPrecisionBits)),
68
69 kTransformKeyBits = kMatrixTypeKeyBits + kPrecisionBits + 1,
70 };
71
72 GR_STATIC_ASSERT(GrShaderVar::kHigh_Precision < (1 << kPrecisionBits));
73
74 /**
75 * We specialize the vertex code for each of these matrix types.
76 */
77 enum MatrixType {
78 kNoPersp_MatrixType = 0,
79 kGeneral_MatrixType = 1,
80 };
81
82 static uint32_t gen_transform_key(const GrPendingFragmentStage& stage, bool useE xplicitLocalCoords) {
77 uint32_t totalKey = 0; 83 uint32_t totalKey = 0;
78 int numTransforms = stage.getProcessor()->numTransforms(); 84 int numTransforms = stage.getProcessor()->numTransforms();
79 for (int t = 0; t < numTransforms; ++t) { 85 for (int t = 0; t < numTransforms; ++t) {
80 uint32_t key = 0; 86 uint32_t key = 0;
81 if (stage.isPerspectiveCoordTransform(t)) { 87 if (stage.isPerspectiveCoordTransform(t)) {
82 key |= kGeneral_MatrixType; 88 key |= kGeneral_MatrixType;
83 } else { 89 } else {
84 key |= kNoPersp_MatrixType; 90 key |= kNoPersp_MatrixType;
85 } 91 }
86 92
87 const GrCoordTransform& coordTransform = stage.getProcessor()->coordTran sform(t); 93 const GrCoordTransform& coordTransform = stage.getProcessor()->coordTran sform(t);
88 if (kLocal_GrCoordSet != coordTransform.sourceCoords() && useExplicitLoc alCoords) { 94 if (kLocal_GrCoordSet != coordTransform.sourceCoords() && useExplicitLoc alCoords) {
89 key |= kPositionCoords_Flag; 95 key |= kPositionCoords_Flag;
90 } 96 }
97
98 GR_STATIC_ASSERT(GrShaderVar::kPrecisionCount <= (1 << kPrecisionBits));
99 key |= (coordTransform.precision() << kPrecisionShift);
100
91 key <<= kTransformKeyBits * t; 101 key <<= kTransformKeyBits * t;
102
92 SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap 103 SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap
93 totalKey |= key; 104 totalKey |= key;
94 } 105 }
95 return totalKey; 106 return totalKey;
96 } 107 }
97 108
98 static uint32_t gen_texture_key(const GrProcessor& proc, const GrGLCaps& caps) { 109 static uint32_t gen_texture_key(const GrProcessor& proc, const GrGLCaps& caps) {
99 uint32_t key = 0; 110 uint32_t key = 0;
100 int numTextures = proc.numTextures(); 111 int numTextures = proc.numTextures();
101 for (int t = 0; t < numTextures; ++t) { 112 for (int t = 0; t < numTextures; ++t) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 } 261 }
251 262
252 header->fPrimaryOutputType = descInfo.fPrimaryOutputType; 263 header->fPrimaryOutputType = descInfo.fPrimaryOutputType;
253 header->fSecondaryOutputType = descInfo.fSecondaryOutputType; 264 header->fSecondaryOutputType = descInfo.fSecondaryOutputType;
254 265
255 header->fColorEffectCnt = optState.numColorStages(); 266 header->fColorEffectCnt = optState.numColorStages();
256 header->fCoverageEffectCnt = optState.numCoverageStages(); 267 header->fCoverageEffectCnt = optState.numCoverageStages();
257 desc->finalize(); 268 desc->finalize();
258 return true; 269 return true;
259 } 270 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLCaps.cpp ('k') | src/gpu/gl/GrGLUtil.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698