/* * 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 "GrColor.h" #include "GrProgramDesc.h" #include "GrGpu.h" #include "GrTypesPriv.h" class GrGpuGL; /** * This class can be used to build a GrProgramDesc. It also provides helpers for accessing * GL specific info in the header. */ class GrGLProgramDescBuilder { public: struct GLKeyHeader : public GrProgramDesc::KeyHeader { SkBool8 fUseNvpr; }; // The key, stored in fKey, is composed of five parts(first 2 are defined in the key itself): // 1. uint32_t for total key length. // 2. uint32_t for a checksum. // 3. Header struct defined above. // 4. An array of offsets to effect keys and their sizes (see 5). uint16_t for each // offset and size. // 5. per-effect keys. Each effect's key is a variable length array of uint32_t. enum { // Part 3. kHeaderOffset = GrProgramDesc::kHeaderOffset, kHeaderSize = SkAlign4(sizeof(GLKeyHeader)), // Part 4. // This is the offset in the overall key to the array of per-effect offset,length pairs. kProcessorKeyOffsetsAndLengthOffset = kHeaderOffset + kHeaderSize, }; /** * Builds a GL specific program descriptor * * @param GrOptDrawState The optimized drawstate. The descriptor will represent a program * which this optstate can use to draw with. The optstate contains * general draw information, as well as the specific color, geometry, * and coverage stages which will be used to generate the GL Program for * this optstate. * @param DescInfo A descriptor info struct, generated by the optstate, which contains a number * of important facts about the program the built descriptor will represent * @param DrawType * @param GrGpuGL A GL Gpu, the caps and Gpu object are used to output processor specific * parts of the descriptor. * @param GrDeviceCoordTexture A dstCopy texture, which may be null if frame buffer fetch is * supported * @param GrProgramDesc The built and finalized descriptor **/ static bool Build(const GrOptDrawState&, const GrProgramDesc::DescInfo&, GrGpu::DrawType, GrGpuGL*, GrProgramDesc*); static const GLKeyHeader& GetHeader(const GrProgramDesc& desc) { return *desc.atOffset(); } private: template static bool BuildStagedProcessorKey(const typename ProcessorKeyBuilder::StagedProcessor& stage, const GrGLCaps& caps, bool requiresLocalCoordAttrib, GrProgramDesc* desc, int* offsetAndSizeIndex); }; #endif