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

Side by Side Diff: src/gpu/gl/GrGLCoordTransform.h

Issue 24853002: Make GPU coord transforms automatic (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/effects/GrTextureDomainEffect.cpp ('k') | src/gpu/gl/GrGLCoordTransform.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #ifndef GrGLCoordTransform_DEFINED
9 #define GrGLCoordTransform_DEFINED
10
11 #include "GrBackendEffectFactory.h"
12 #include "GrCoordTransform.h"
13 #include "GrGLUniformManager.h"
14
15 class GrTexture;
16 class GrGLShaderBuilder;
17
18 /**
19 * This is a helper class used by the framework to implement a coordinate transf orm that operates on
20 * incoming coords in the vertex shader and writes them to a varying to be used in the fragment
21 * shader. Effects should not use this class directly, but instead call GrEffect ::addCoordTransform.
22 * When the input coords are local coordinates this class accounts for the coord change matrix
23 * communicated via GrDrawEffect. The input coords may also be positions and in this case the coord
24 * change matrix is ignored. The GrGLCoordTransform may emit different code base d on the type of
25 * matrix and thus must contribute to the effect's key.
26 *
27 * This class cannot be used to apply a matrix to coordinates that come in the f orm of custom vertex
28 * attributes.
29 */
30 class GrGLCoordTransform {
31 private:
32 // We specialize the generated code for each of these matrix types.
33 enum MatrixTypes {
34 kIdentity_MatrixType = 0,
35 kTrans_MatrixType = 1,
36 kNoPersp_MatrixType = 2,
37 kGeneral_MatrixType = 3,
38 };
39 // The key for is made up of a matrix type and a bit that indicates the sour ce of the input
40 // coords.
41 enum {
42 kMatrixTypeKeyBits = 2,
43 kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1,
44 kPositionCoords_Flag = (1 << kMatrixTypeKeyBits),
45 kKeyBitsPrivate = kMatrixTypeKeyBits + 1,
46 };
47
48 public:
49
50 typedef GrBackendEffectFactory::EffectKey EffectKey;
51
52 /**
53 * A GrGLCoordTransform key is kKeyBits long. The framework automatically ge nerates and includes
54 * these in EffectKeys.
55 */
56 enum {
57 kKeyBits = kKeyBitsPrivate,
58 kKeyMask = (1 << kKeyBits) - 1,
59 };
60
61 GrGLCoordTransform() { fPrevMatrix = SkMatrix::InvalidMatrix(); }
62
63 /**
64 * Generates the key for the portion of the code emitted by this class's emi tCode() function.
65 */
66 static EffectKey GenKey(const GrDrawEffect&, int transformIdx);
67
68 /**
69 * Stores the name and type of a transformed set of coordinates. This class is passed to
70 * GrGLEffect::emitCode.
71 */
72 class TransformedCoords {
73 public:
74 const char* c_str() const { return fName.c_str(); }
75 GrSLType type() const { return fType; }
76 const SkString& getName() const { return fName; }
77 // TODO: Remove the VS name when we have vertexless shaders, and gradien ts are reworked.
78 const SkString& getVSName() const { return fVSName; }
79
80 private:
81 friend class GrGLCoordTransform;
82
83 SkString fName;
84 GrSLType fType;
85 SkString fVSName;
86 };
87
88 /**
89 * Emits code to implement the matrix in the VS. A varying is added as an ou tput of the VS and
90 * input to the FS. The varying may be either a vec2f or vec3f depending upo n whether
91 * perspective interpolation is required or not. The names of the varying in the VS and FS as
92 * well as its type are written to the TransformedCoords* object. The suffix is an optional
93 * parameter that can be used to make all variables emitted by the object un ique within a stage.
94 * It is only necessary if multiple GrGLCoordTransform objects are used by a single GrGLEffect.
95 */
96 void emitCode(GrGLShaderBuilder*, EffectKey, TransformedCoords*, int suffix = 0);
97
98 /**
99 * Call from a GrGLEffect's subclass to update the texture matrix. The matri x and reverseY value
100 * should match those used with GenKey.
101 */
102 void setData(const GrGLUniformManager&, const GrDrawEffect&, int transformId x);
103
104 GrGLUniformManager::UniformHandle fUni;
105 GrSLType fUniType;
106 SkMatrix fPrevMatrix;
107 };
108
109 #endif
OLDNEW
« no previous file with comments | « src/gpu/effects/GrTextureDomainEffect.cpp ('k') | src/gpu/gl/GrGLCoordTransform.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698