Chromium Code Reviews| Index: src/gpu/gl/GrGLProgramDesc.h |
| =================================================================== |
| --- src/gpu/gl/GrGLProgramDesc.h (revision 0) |
| +++ src/gpu/gl/GrGLProgramDesc.h (revision 0) |
| @@ -0,0 +1,104 @@ |
| +/* |
| + * Copyright 2013 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#ifndef GrGLProgramDesc_DEFINED |
| +#define GrGLProgramDesc_DEFINED |
| + |
| +#include "GrGLEffect.h" |
| + |
| +class GrGpuGL; |
| + |
| +// optionally compile the experimental GS code. Set to GR_DEBUG so that debug build bots will |
| +// execute the code. |
| +#define GR_GL_EXPERIMENTAL_GS GR_DEBUG |
| + |
| + |
| +/** This class describes a program to generate. It also serves as a program cache key. The only |
| + thing GL-specific about this is the generation of GrGLEffect::EffectKeys. With some refactoring |
| + it could be made backend-neutral. */ |
| +class GrGLProgramDesc { |
| +public: |
| + GrGLProgramDesc() { |
| + // since we use this as part of a key we can't have any uninitialized padding |
| + memset(this, 0, sizeof(GrGLProgramDesc)); |
| + } |
| + |
| + // Returns this as a uint32_t array to be used as a key in the program cache |
| + const uint32_t* asKey() const { |
| + return reinterpret_cast<const uint32_t*>(this); |
| + } |
| + |
| + // For unit testing. |
| + void setRandom(SkMWCRandom*, |
|
robertphillips
2013/03/27 18:07:10
spaces
bsalomon
2013/03/27 18:17:16
Done.
|
| + const GrGpuGL* gpu, |
| + const GrEffectStage stages[GrDrawState::kNumStages]); |
| + |
| + /** |
| + * Builds a program descriptor from a GrDrawState. Whether the primitive type is points, the |
| + * output of GrDrawState::getBlendOpts, and the caps of the GrGpuGL are also inputs. |
| + */ |
| + static void Build(const GrDrawState&, |
| + bool isPoints, |
| + GrDrawState::BlendOptFlags, |
| + GrBlendCoeff srcCoeff, |
| + GrBlendCoeff dstCoeff, |
| + const GrGpuGL* gpu, |
| + GrGLProgramDesc* outDesc); |
| + |
| +private: |
| + // Specifies where the initial color comes from before the stages are applied. |
| + enum ColorInput { |
| + kSolidWhite_ColorInput, |
| + kTransBlack_ColorInput, |
| + kAttribute_ColorInput, |
| + kUniform_ColorInput, |
| + |
| + kColorInputCnt |
| + }; |
| + // Dual-src blending makes use of a secondary output color that can be |
| + // used as a per-pixel blend coefficient. This controls whether a |
| + // secondary source is output and what value it holds. |
| + enum DualSrcOutput { |
| + kNone_DualSrcOutput, |
| + kCoverage_DualSrcOutput, |
| + kCoverageISA_DualSrcOutput, |
| + kCoverageISC_DualSrcOutput, |
| + |
| + kDualSrcOutputCnt |
| + }; |
| + |
| + // should the FS discard if the coverage is zero (to avoid stencil manipulation) |
| + bool fDiscardIfZeroCoverage; |
| + |
| + // stripped of bits that don't affect program generation |
| + GrAttribBindings fAttribBindings; |
| + |
| + /** Non-zero if this stage has an effect */ |
| + GrGLEffect::EffectKey fEffectKeys[GrDrawState::kNumStages]; |
| + |
| + // To enable experimental geometry shader code (not for use in |
| + // production) |
| +#if GR_GL_EXPERIMENTAL_GS |
| + bool fExperimentalGS; |
| +#endif |
| + uint8_t fColorInput; // casts to enum ColorInput |
| + uint8_t fCoverageInput; // casts to enum ColorInput |
| + uint8_t fDualSrcOutput; // casts to enum DualSrcOutput |
| + int8_t fFirstCoverageStage; |
| + SkBool8 fEmitsPointSize; |
| + uint8_t fColorFilterXfermode; // casts to enum SkXfermode::Mode |
| + |
| + int8_t fPositionAttributeIndex; |
| + int8_t fColorAttributeIndex; |
| + int8_t fCoverageAttributeIndex; |
| + int8_t fLocalCoordsAttributeIndex; |
| + |
| + // GrGLProgram reads the private fields to generate code. |
| + friend class GrGLProgram; |
| +}; |
| + |
| +#endif |