| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 #ifndef GrProgramDesc_DEFINED | 8 #ifndef GrProgramDesc_DEFINED |
| 9 #define GrProgramDesc_DEFINED | 9 #define GrProgramDesc_DEFINED |
| 10 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 class GrProgramDesc { | 21 class GrProgramDesc { |
| 22 public: | 22 public: |
| 23 // Creates an uninitialized key that must be populated by GrGpu::buildProgra
mDesc() | 23 // Creates an uninitialized key that must be populated by GrGpu::buildProgra
mDesc() |
| 24 GrProgramDesc() {} | 24 GrProgramDesc() {} |
| 25 | 25 |
| 26 /** | 26 /** |
| 27 * Builds a program descriptor. Before the descriptor can be used, the client
must call finalize | 27 * Builds a program descriptor. Before the descriptor can be used, the client
must call finalize |
| 28 * on the returned GrProgramDesc. | 28 * on the returned GrProgramDesc. |
| 29 * | 29 * |
| 30 * @param GrPrimitiveProcessor The geometry | 30 * @param GrPrimitiveProcessor The geometry |
| 31 * @param hasPointSize Controls whether the shader will output a point size. |
| 31 * @param GrPipeline The optimized drawstate. The descriptor will represent
a program | 32 * @param GrPipeline The optimized drawstate. The descriptor will represent
a program |
| 32 * which this optstate can use to draw with. The opts
tate contains | 33 * which this optstate can use to draw with. The opts
tate contains |
| 33 * general draw information, as well as the specific c
olor, geometry, | 34 * general draw information, as well as the specific c
olor, geometry, |
| 34 * and coverage stages which will be used to generate
the GL Program for | 35 * and coverage stages which will be used to generate
the GL Program for |
| 35 * this optstate. | 36 * this optstate. |
| 36 * @param GrGLSLCaps Capabilities of the GLSL backend. | 37 * @param GrGLSLCaps Capabilities of the GLSL backend. |
| 37 * @param GrProgramDesc The built and finalized descriptor | 38 * @param GrProgramDesc The built and finalized descriptor |
| 38 **/ | 39 **/ |
| 39 static bool Build(GrProgramDesc*, | 40 static bool Build(GrProgramDesc*, |
| 40 const GrPrimitiveProcessor&, | 41 const GrPrimitiveProcessor&, |
| 42 bool hasPointSize, |
| 41 const GrPipeline&, | 43 const GrPipeline&, |
| 42 const GrGLSLCaps&); | 44 const GrGLSLCaps&); |
| 43 | 45 |
| 44 // Returns this as a uint32_t array to be used as a key in the program cache
. | 46 // Returns this as a uint32_t array to be used as a key in the program cache
. |
| 45 const uint32_t* asKey() const { | 47 const uint32_t* asKey() const { |
| 46 return reinterpret_cast<const uint32_t*>(fKey.begin()); | 48 return reinterpret_cast<const uint32_t*>(fKey.begin()); |
| 47 } | 49 } |
| 48 | 50 |
| 49 // Gets the number of bytes in asKey(). It will be a 4-byte aligned value. W
hen comparing two | 51 // Gets the number of bytes in asKey(). It will be a 4-byte aligned value. W
hen comparing two |
| 50 // keys the size of either key can be used with memcmp() since the lengths t
hemselves begin the | 52 // keys the size of either key can be used with memcmp() since the lengths t
hemselves begin the |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 const uint32_t* bKey = b.asKey(); | 87 const uint32_t* bKey = b.asKey(); |
| 86 for (int i = 0; i < l; ++i) { | 88 for (int i = 0; i < l; ++i) { |
| 87 if (aKey[i] != bKey[i]) { | 89 if (aKey[i] != bKey[i]) { |
| 88 return aKey[i] < bKey[i] ? true : false; | 90 return aKey[i] < bKey[i] ? true : false; |
| 89 } | 91 } |
| 90 } | 92 } |
| 91 return false; | 93 return false; |
| 92 } | 94 } |
| 93 | 95 |
| 94 struct KeyHeader { | 96 struct KeyHeader { |
| 95 // Set to uniquely identify the rt's origin, or 0 if the shader does not
require this info. | |
| 96 uint8_t fSurfaceOriginKey; | |
| 97 // Set to uniquely identify the sample pattern, or 0 if the shader doesn
't use sample | 97 // Set to uniquely identify the sample pattern, or 0 if the shader doesn
't use sample |
| 98 // locations. | 98 // locations. |
| 99 uint8_t fSamplePatternKey; | 99 uint8_t fSamplePatternKey; |
| 100 // Set to uniquely idenitify any swizzling of the shader's output color(
s). | 100 // Set to uniquely idenitify any swizzling of the shader's output color(
s). |
| 101 uint8_t fOutputSwizzle; | 101 uint8_t fOutputSwizzle; |
| 102 uint8_t fSnapVerticesToPixelCenters; | 102 uint8_t fColorFragmentProcessorCnt : 4; |
| 103 int8_t fColorEffectCnt; | 103 uint8_t fCoverageFragmentProcessorCnt : 4; |
| 104 int8_t fCoverageEffectCnt; | 104 // Set to uniquely identify the rt's origin, or 0 if the shader does not
require this info. |
| 105 uint8_t fIgnoresCoverage; | 105 uint8_t fSurfaceOriginKey : 2; |
| 106 uint8_t fIgnoresCoverage : 1; |
| 107 uint8_t fSnapVerticesToPixelCenters : 1; |
| 108 uint8_t fHasPointSize : 1; |
| 109 uint8_t fPad : 3; |
| 106 }; | 110 }; |
| 107 | 111 GR_STATIC_ASSERT(sizeof(KeyHeader) == 4); |
| 108 int numColorEffects() const { | |
| 109 return this->header().fColorEffectCnt; | |
| 110 } | |
| 111 | |
| 112 int numCoverageEffects() const { | |
| 113 return this->header().fCoverageEffectCnt; | |
| 114 } | |
| 115 | |
| 116 int numTotalEffects() const { return this->numColorEffects() + this->numCove
rageEffects(); } | |
| 117 | 112 |
| 118 // This should really only be used internally, base classes should return th
eir own headers | 113 // This should really only be used internally, base classes should return th
eir own headers |
| 119 const KeyHeader& header() const { return *this->atOffset<KeyHeader, kHeaderO
ffset>(); } | 114 const KeyHeader& header() const { return *this->atOffset<KeyHeader, kHeaderO
ffset>(); } |
| 120 | 115 |
| 121 void finalize() { | 116 void finalize() { |
| 122 int keyLength = fKey.count(); | 117 int keyLength = fKey.count(); |
| 123 SkASSERT(0 == (keyLength % 4)); | 118 SkASSERT(0 == (keyLength % 4)); |
| 124 *(this->atOffset<uint32_t, GrProgramDesc::kLengthOffset>()) = SkToU32(ke
yLength); | 119 *(this->atOffset<uint32_t, GrProgramDesc::kLengthOffset>()) = SkToU32(ke
yLength); |
| 125 | 120 |
| 126 uint32_t* checksum = this->atOffset<uint32_t, GrProgramDesc::kChecksumOf
fset>(); | 121 uint32_t* checksum = this->atOffset<uint32_t, GrProgramDesc::kChecksumOf
fset>(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 }; | 159 }; |
| 165 | 160 |
| 166 SkSTArray<kPreAllocSize, uint8_t, true>& key() { return fKey; } | 161 SkSTArray<kPreAllocSize, uint8_t, true>& key() { return fKey; } |
| 167 const SkSTArray<kPreAllocSize, uint8_t, true>& key() const { return fKey; } | 162 const SkSTArray<kPreAllocSize, uint8_t, true>& key() const { return fKey; } |
| 168 | 163 |
| 169 private: | 164 private: |
| 170 SkSTArray<kPreAllocSize, uint8_t, true> fKey; | 165 SkSTArray<kPreAllocSize, uint8_t, true> fKey; |
| 171 }; | 166 }; |
| 172 | 167 |
| 173 #endif | 168 #endif |
| OLD | NEW |