commit-bot@chromium.org | 261dc56 | 2013-10-04 15:42:56 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2013 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 | |
egdaniel | e659a58 | 2015-11-13 09:55:43 -0800 | [diff] [blame] | 8 | #ifndef GrGLSLGeometryProcessor_DEFINED |
| 9 | #define GrGLSLGeometryProcessor_DEFINED |
commit-bot@chromium.org | 261dc56 | 2013-10-04 15:42:56 +0000 | [diff] [blame] | 10 | |
egdaniel | e659a58 | 2015-11-13 09:55:43 -0800 | [diff] [blame] | 11 | #include "GrGLSLPrimitiveProcessor.h" |
commit-bot@chromium.org | 261dc56 | 2013-10-04 15:42:56 +0000 | [diff] [blame] | 12 | |
egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 13 | class GrGLSLGPBuilder; |
joshualitt | 8072caa | 2015-02-12 14:20:52 -0800 | [diff] [blame] | 14 | |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 15 | /** |
| 16 | * If a GL effect needs a GrGLFullShaderBuilder* object to emit vertex code, then it must inherit |
| 17 | * from this class. Since paths don't have vertices, this class is only meant to be used internally |
| 18 | * by skia, for special cases. |
| 19 | */ |
egdaniel | e659a58 | 2015-11-13 09:55:43 -0800 | [diff] [blame] | 20 | class GrGLSLGeometryProcessor : public GrGLSLPrimitiveProcessor { |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 21 | public: |
| 22 | /* Any general emit code goes in the base class emitCode. Subclasses override onEmitCode */ |
mtklein | 36352bf | 2015-03-25 18:17:31 -0700 | [diff] [blame] | 23 | void emitCode(EmitArgs&) override; |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 24 | |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 25 | // By default we use the identity matrix |
joshualitt | d8dd47b | 2015-09-11 11:45:01 -0700 | [diff] [blame] | 26 | void setTransformData(const GrPrimitiveProcessor&, |
egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 27 | const GrGLSLProgramDataManager& pdman, |
joshualitt | d8dd47b | 2015-09-11 11:45:01 -0700 | [diff] [blame] | 28 | int index, |
| 29 | const SkTArray<const GrCoordTransform*, true>& transforms) override { |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 30 | this->setTransformDataMatrix(SkMatrix::I(), pdman, index, transforms); |
| 31 | } |
| 32 | |
bsalomon | 1d417a8 | 2016-03-23 11:50:26 -0700 | [diff] [blame] | 33 | protected: |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 34 | // A helper which subclasses can use if needed |
| 35 | template <class GeometryProcessor> |
| 36 | void setTransformDataHelper(const GrPrimitiveProcessor& primProc, |
egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 37 | const GrGLSLProgramDataManager& pdman, |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 38 | int index, |
| 39 | const SkTArray<const GrCoordTransform*, true>& transforms) { |
| 40 | const GeometryProcessor& gp = primProc.cast<GeometryProcessor>(); |
| 41 | this->setTransformDataMatrix(gp.localMatrix(), pdman, index, transforms); |
| 42 | } |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 43 | |
joshualitt | b2aa7cb | 2015-08-05 11:05:22 -0700 | [diff] [blame] | 44 | // Emit a uniform matrix for each coord transform. |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 45 | void emitTransforms(GrGLSLVertexBuilder* vb, |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 46 | GrGLSLVaryingHandler* varyingHandler, |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 47 | GrGLSLUniformHandler* uniformHandler, |
robertphillips | 46d36f0 | 2015-01-18 08:14:14 -0800 | [diff] [blame] | 48 | const GrShaderVar& posVar, |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 49 | const char* localCoords, |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 50 | const TransformsIn& tin, |
| 51 | TransformsOut* tout) { |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 52 | this->emitTransforms(vb, varyingHandler, uniformHandler, |
| 53 | posVar, localCoords, SkMatrix::I(), tin, tout); |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 54 | } |
| 55 | |
joshualitt | b2aa7cb | 2015-08-05 11:05:22 -0700 | [diff] [blame] | 56 | // Emit pre-transformed coords as a vertex attribute per coord-transform. |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 57 | void emitTransforms(GrGLSLVertexBuilder*, |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 58 | GrGLSLVaryingHandler*, |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 59 | GrGLSLUniformHandler*, |
robertphillips | 46d36f0 | 2015-01-18 08:14:14 -0800 | [diff] [blame] | 60 | const GrShaderVar& posVar, |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 61 | const char* localCoords, |
| 62 | const SkMatrix& localMatrix, |
| 63 | const TransformsIn&, |
| 64 | TransformsOut*); |
| 65 | |
joshualitt | b2aa7cb | 2015-08-05 11:05:22 -0700 | [diff] [blame] | 66 | // caller has emitted transforms via attributes |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 67 | void emitTransforms(GrGLSLVertexBuilder*, |
egdaniel | 0eafe79 | 2015-11-20 14:01:22 -0800 | [diff] [blame] | 68 | GrGLSLVaryingHandler*, |
joshualitt | b2aa7cb | 2015-08-05 11:05:22 -0700 | [diff] [blame] | 69 | const char* localCoords, |
| 70 | const TransformsIn& tin, |
| 71 | TransformsOut* tout); |
| 72 | |
robertphillips | 46d36f0 | 2015-01-18 08:14:14 -0800 | [diff] [blame] | 73 | struct GrGPArgs { |
| 74 | // The variable used by a GP to store its position. It can be |
| 75 | // either a vec2 or a vec3 depending on the presence of perspective. |
| 76 | GrShaderVar fPositionVar; |
| 77 | }; |
| 78 | |
| 79 | // Create the correct type of position variable given the CTM |
egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 80 | void setupPosition(GrGLSLVertexBuilder*, GrGPArgs*, const char* posName); |
| 81 | void setupPosition(GrGLSLVertexBuilder*, |
| 82 | GrGLSLUniformHandler* uniformHandler, |
egdaniel | 4ca2e60 | 2015-11-18 08:01:26 -0800 | [diff] [blame] | 83 | GrGPArgs*, |
| 84 | const char* posName, |
| 85 | const SkMatrix& mat, |
joshualitt | 5559ca2 | 2015-05-21 15:50:36 -0700 | [diff] [blame] | 86 | UniformHandle* viewMatrixUniform); |
robertphillips | 46d36f0 | 2015-01-18 08:14:14 -0800 | [diff] [blame] | 87 | |
| 88 | static uint32_t ComputePosKey(const SkMatrix& mat) { |
| 89 | if (mat.isIdentity()) { |
| 90 | return 0x0; |
| 91 | } else if (!mat.hasPerspective()) { |
| 92 | return 0x01; |
| 93 | } else { |
| 94 | return 0x02; |
| 95 | } |
| 96 | } |
| 97 | |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 98 | private: |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 99 | void setTransformDataMatrix(const SkMatrix& localMatrix, |
egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 100 | const GrGLSLProgramDataManager& pdman, |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 101 | int index, |
| 102 | const SkTArray<const GrCoordTransform*, true>& transforms) { |
egdaniel | fe8a839 | 2016-05-09 10:22:19 -0700 | [diff] [blame^] | 103 | SkSTArray<2, UniformTransform, true>& procTransforms = fInstalledTransforms[index]; |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 104 | int numTransforms = transforms.count(); |
| 105 | for (int t = 0; t < numTransforms; ++t) { |
| 106 | SkASSERT(procTransforms[t].fHandle.isValid()); |
| 107 | const SkMatrix& transform = GetTransformMatrix(localMatrix, *transforms[t]); |
| 108 | if (!procTransforms[t].fCurrentValue.cheapEqualTo(transform)) { |
joshualitt | e7afc2d | 2015-09-11 10:44:13 -0700 | [diff] [blame] | 109 | pdman.setSkMatrix(procTransforms[t].fHandle.toIndex(), transform); |
joshualitt | e3ababe | 2015-05-15 07:56:07 -0700 | [diff] [blame] | 110 | procTransforms[t].fCurrentValue = transform; |
| 111 | } |
| 112 | } |
| 113 | } |
| 114 | |
robertphillips | 46d36f0 | 2015-01-18 08:14:14 -0800 | [diff] [blame] | 115 | virtual void onEmitCode(EmitArgs&, GrGPArgs*) = 0; |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 116 | |
egdaniel | fe8a839 | 2016-05-09 10:22:19 -0700 | [diff] [blame^] | 117 | struct UniformTransform : public Transform { |
| 118 | UniformTransform() : Transform() {} |
| 119 | UniformHandle fHandle; |
| 120 | }; |
| 121 | |
| 122 | SkSTArray<8, SkSTArray<2, UniformTransform, true> > fInstalledTransforms; |
| 123 | |
egdaniel | e659a58 | 2015-11-13 09:55:43 -0800 | [diff] [blame] | 124 | typedef GrGLSLPrimitiveProcessor INHERITED; |
joshualitt | abb52a1 | 2015-01-13 15:02:10 -0800 | [diff] [blame] | 125 | }; |
| 126 | |
commit-bot@chromium.org | 261dc56 | 2013-10-04 15:42:56 +0000 | [diff] [blame] | 127 | #endif |