/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLProcessor_DEFINED #define GrGLProcessor_DEFINED #include "GrGLProgramDataManager.h" #include "GrProcessor.h" #include "GrTextureAccess.h" /** @file This file contains specializations for OpenGL of the shader stages declared in include/gpu/GrProcessor.h. Objects of type GrGLProcessor are responsible for emitting the GLSL code that implements a GrProcessor and for uploading uniforms at draw time. If they don't always emit the same GLSL code, they must have a function: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*) that is used to implement a program cache. When two GrProcessors produce the same key this means that their GrGLProcessors would emit the same GLSL code. The GrGLProcessor subclass must also have a constructor of the form: ProcessorSubclass::ProcessorSubclass(const GrBackendProcessorFactory&, const GrProcessor&) These objects are created by the factory object returned by the GrProcessor::getFactory(). */ // TODO delete this and make TextureSampler its own thing class GrGLProcessor { public: typedef GrGLProgramDataManager::UniformHandle UniformHandle; /** * Passed to GrGLProcessors so they can add transformed coordinates to their shader code. */ typedef GrShaderVar TransformedCoords; typedef SkTArray TransformedCoordsArray; /** * Passed to GrGLProcessors so they can add texture reads to their shader code. */ class TextureSampler { public: TextureSampler(UniformHandle uniform, const GrTextureAccess& access) : fSamplerUniform(uniform) , fConfigComponentMask(GrPixelConfigComponentMask(access.getTexture()->config())) { SkASSERT(0 != fConfigComponentMask); memcpy(fSwizzle, access.getSwizzle(), 5); } // bitfield of GrColorComponentFlags present in the texture's config. uint32_t configComponentMask() const { return fConfigComponentMask; } // this is .abcd const char* swizzle() const { return fSwizzle; } private: UniformHandle fSamplerUniform; uint32_t fConfigComponentMask; char fSwizzle[5]; friend class GrGLShaderBuilder; }; typedef SkTArray TextureSamplerArray; }; #endif